【StyleGAN2】を徹底解剖！!

本記事では、リアルな画像を生成できるStyleGAN2について説明します(CNNやGANの基礎を理解している前提で記載しています。まだ理解していない方は別冊のCNNやGANの基礎を先に読んでいただけると理解しやすいと思います）。

また、どんなものなのかを実際に体験するための手順も[別記事](https://qiita.com/DeepMata/private/b46b7219be04163b0861)にて投稿しています。興味のある方は、こちらも見ていただければ幸いです。

# ０．はじめに
StyleGANは、高解像度の画像生成可能なProgressiveGANをベースに画像の画風変換（Style Transfer）を取り入れたアルゴリズムです。また、StyleGAN2は、StyleGANの課題を改善したアルゴリズムです。そのため、StyleGAN2を理解するために、ProgressiveGAN、StyleGAN、StyleGAN2と順を追って理解を進めていきたいと思います。

# １ ProgressiveGAN（PGGAN）
## (1) PGGAN とは

PGGANは、GANにおける高解像の画像生成の以下３つの課題を回避することで高解像度の画像生成を可能にしたアルゴリズムです。

- 高解像度の画像では、正解画像と偽物画像との識別がDiscriminatorで容易となり、GeneratorとDiscriminatorの学習が十分に行えない。
- 高解像度の画像を扱うので通常より多くのメモリが必要になる。そのため、より小さなミニバッチサイズで学習を行ってしまうと学習が不安定になる。
- 学習に時間がかかる。

基本コンセプトは、「GeneratorとDiscriminatorを、より簡単な低解像度の画像から段階的に学習させて、学習の段階が進むにつれて高解像度の情報を持つ新しい層を追加してく」というものです。これにより、GANの高解像の画像生成の課題の回避と、学習の高速化が可能になっています。


## (2) PGGANのアーキテクチャ

PGGANのアーキテクチャを図１に示します。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413258/50bb78b8-7515-ad91-fdc3-e4d3857dfd24.png)

<dd>図1．ProgressiveGANのアーキテクチャ</dd>


## Progressiveなネットワークの構成と学習（Progressive growing of GANs）

以下のように4×4の画像から1024×1024の画像まで、段階的（Progressive）な処理で行われます。

**①Training Progresses 1**
<dd>まず4×4の低解像度で従来のGAN構造に従って、学習が安定化するまで十分にGeneratorとDiscriminatorの学習を行います。</dd>

**②Training Progresses 2**
<dd>次にGeneratorにアップサンプリングを行うnearest neightborフィルタリング（単純に隣からピクセルの値をコピーして拡大します）と、２つの逆畳み込み層を追加したネットワークで、8×8の解像度で学習が安定化するまで十分にGeneratorとDiscriminatorの学習を行います。</dd>

**③Train Progresses 3～9**
<dd>①②同様の処理を、16×16（3層目）、32×32（4層目）、、、、1024×1024（9層目）の解像度と、それに対応するために追加されるアップサンプリング用のnearest neightborフィルタリングと逆畳み込み層、及び、ダウンサンプリング用のaverage poolingと畳み込み層で段階的に行っていきます。
</dd>

- **学習の実装について**
学習においては、以下のような実装があります。
①Training Progresses1～8を１エポック間に渡って学習し、最後のTraining Progresses9を残りのエポックを学習させる。
②１エポック目（Training Progresses1）、２エポック目（Training Progresses1～2）、３エポック目（Training Progresses2）、４エポック目（Training Progresses2～3）、、、15エポック目（Training Progresses8～9）、16～最終エポック目（Training Progresses9）で学習させる。


- **Progressiveなネットワークの効果**
画像生成タスクにおいては、画像の大域的特徴量と局所的特徴量の両方を捉えることが重要になりますが、Progressiveなネットワークでは単に画像を高解像度化するだけではなく低解像度の処理で画像の大域的特徴量を先に捉え高解像度の処理で局所的特徴量を捉えるという効果もあります。

## (3)高解像度の画像生成のための工夫
### Ａ) なめらかな解像度の変換
PGGANでは、上述のように画像の解像度をnearest neightborフィルタリングとaverage poolingとを用いて、それぞれ２倍、1/2倍の倍々でアップサンプリングやダウンサンプリングしていきますが、ある解像度で十分に学習させたネットワークであっても、この倍々処理を急激に行うと非なめらかな変化を生じさせてしまいます。そのためPCGANではアップサンプリングおよびダウンサンプリングのための新しい畳み込み層をネットワークに追加するときに、画像のRGB値を線形補間によって、なめらかに変化させるようにしています。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413258/e8652ce7-7cb2-b2fa-6835-c86842a30f02.png)
<dd>図２．線形補間の説明</dd>
図２は線形補間によるなめらかな解像度の変換の様子を、16×16->32×32での切り替え時の例を示したものです。
<dd>
(a) : 遷移開始時の様子。特に線形補間は行われません。（α=0）
(b) : 遷移途中の様子。 0 < α < 1 を補間係数として、Generator(G)で、特徴ベクトルから変換したRGB情報（toRGB）を、それぞれ　toRGB<sub>out</sub> = (1 – α) × toRGB<sub>in1</sub> + α × toRGB<sub>in2</sub> で混ぜ合わせます。そして学習が進むにつれて、α = 0 -> 1 とすることでなめらかな線形補間を行います。
(c) : 遷移完了時の様子。 線形補間も完了しています。 (α=1)
</dd>
この遷移（α=0->1）は、たとえば1エポック間の学習を通じて行うようにします（１エポックの開始時はα=0、1エポック完了時はα=1）。

### Ｂ) 生成画像の多様性向上とモード崩壊防止のための工夫
PGGANでは、前述のような高解像度の画像生成のための工夫だけでなく、minibatch standard deviation（簡略化されたminibatch discrimination）を用いて生成画像の多様性向上とモード崩壊防止のための工夫もしています。

GANの課題の一つとしてモード崩壊（学習が不十分な識別器に対して生成器を最適化した場合や、生成器への入力ノイズzの潜在変数としての次元が足りていない場合などにおいて、生成器による生成画像がある特定の画像に集中してしまい、学習用データが本来持っている多様な種類の画像を生成できなくなってしまうこと）があります。Minibatch discriminationでは、このモード崩壊を防止するために、discriminatorにミニバッチデータ内のデータの多様性を検出できる仕組みを導入しています。PGGANでは、このminibatch discriminationの仕組みを大幅に簡略化した仕組みであるminibatch standard deviation を導入することで、minibatch discriminationのように、新しいハイパーパラメータを必要とすることなく、生成データの多様性を向上させモード崩壊を防止しています。
ⅰ) ミニバッチデータ内の各画像データの各ピクセル値（RGB値）に対して、同じ位置に対応しているピクセル値（RGB値）で標準偏差を計算する。
ⅱ) すべての高さ（H）と幅（W）チャネル数（C）で、この各ピクセル（＝標準偏差）を平均化しスカラー値を取得する。
ⅲ) 得られるスカラーをコピーし結合することで、１つのH×Wのテンソル（＝特徴マップ）を取得する。


### Ｃ) 学習の安定化のための工夫
一般的にGANにおいては学習を安定化させることを目的として、batch normalizationの仕組みがネットワークに導入されています。しかしながら、PGGANではbatch normalizationによる学習安定化効果は見られないとして、別の学習安定化のための工夫を使用しています。

**①Equalized learning rate　※重み更新に対する工夫**
一般的にディープラーニングにおいては学習率が減衰するような最適化アルゴリズム（Adam等）を用いてネットワークの重みを更新します。PGGANではこのような重みの更新ではなく、以下に示すようなもっと単純な方法でネットワークの重みを更新します。
ⅰ）GeneratorとDiscriminatorのネットワークの各層（ⅰ）の重み w<sub>i</sub> の初期値を、w<sub>i</sub> ～ N(0, 1) で初期化する。
ⅱ）初期化した重みを、各層の実行時（＝順伝搬での計算時）に、以下の式で再設定する。

```math
 \hat{w_{i}}=w_{i}/c　　　　　　　　　　　
```
（標準化定数 c = √2/層の数）
**②Pixelwise feature vector normalization in generator　※データに対する工夫**
GeneratorとDiscriminatorの不適切な競争の結果として、GeneratorとDiscriminatorからの出力信号（＝偽物画像と判別結果）が制御不能になることを防止するために、PGGANではGeneratorの各畳み込み層の後の中間層からの出力（＝特徴ベクトル）に対して「各ピクセル毎」に以下のような特徴ベクトルの正規化処理を行います。

```math
 b_{x,y}=a_{x,y}/\sqrt{\frac{1}{N}\sum_{j=0}^{N-1}(a^j_{x,y})^2+\epsilon}　　　　　　　　　　　
```

<dd>x, y  : ピクセル座標</dd>
<dd>a<sub>x, y</sub>  ：生成器の中間層から出力される特徴ベクトル（正規化前）</dd>
<dd>b<sub>x, y</sub> : 正規化後の特徴ベクトル</dd>
<dd>ε = $\mathbf10^8$ : ネットワークの重み</dd>
<dd>N : 特徴マップ数</dd>

<br>

この正規化手法により、（batch normalizationと同様にして）学習の際の変化の大きさに応じて信号を増幅または減衰ができるようになるので、結果として学習の安定化が得られます。



# ２　StyleGAN
## (1) StyleGAN とは

StyleGANは、ProgressiveGANをベースに非常にクオリティの高い画像を高解像度で生成できます。また、単に高解像度の画像を生成できるだけでなく、人物画像の高レベルで大域的な属性（顔の輪郭、眼鏡の有無など）から、局所的な属性（しわや肌質など）まで切り分けをアルゴリズムで制御できるようになっています。

## (2) StyleGANのアーキテクチャ

StyleGANの全体アーキテクチャとGeneratorの詳細なアーキテクチャを図3に示します。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413258/3ec32ee3-4f15-0439-834e-2744eaac5286.png)

<dd>図3．StyleGANの全体アーキテクチャとGeneratorの詳細なアーキテクチャ図</dd>

<br>
<dd>このStyleGANは以下の特徴を持ちます。</dd>
<dd>**①Mapping network f**</dd>
<dd>**②Adaptive Instance Normalization(AdaIN)**</dd>
<dd>**③Pixel-wise Noise InputとStochastic variation**</dd>
<dd>**④progressiveGANから入力層を排除**</dd>

## (3) StyleGANの特徴

### ①Mapping network f(潜在空間zから潜在空間wへの写像と潜在表現の獲得)
従来のGANでは、入力ノイズ z ∈ Z (Z:潜在空間)をそのままGeneratorに入力していましたが、この方法では図４（B）に示すように画像の特徴量の一部の組み合わせが存在しないケースにおいて、入力ノイズzが存在する潜在空間Zは、線形ではなくentanglement（もつれ）のある歪んだ空間となります。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413258/2206bdb5-172b-582b-05c2-16b3963d4f3d.png)

<dd>図４　2つの変動要因（例えば、男らしさと髪の長さ）を用いた例</dd>
<br>
このようなentanglement（もつれ、歪み）のある空間では、潜在空間のある部分空間からサンプリングしたベクトル（図４では特徴軸上のベクトル）だけを使って画像を生成したときには、複数の要素が同時に変動してしまいます（ex. 性別や肌色などが同時に代わる）。
※一方で、disentangle（解きほぐし）されている潜在空間では、潜在空間のある部分からサンプリングしたベクトルだけを使って画像を生成したときには変動する要素が１つのみであるため意図している画像の生成がしやすくなります。

このような問題に対処するために、StyleGANでは潜在変数である入力ノイズzをmapping network fという８層のMLP（多層パーセプトロン）で構成されるネットワークに入力し、中間的な潜在空間Wへと写像して、別の潜在変数w∈Wを獲得した上で後段のSynthesis Networkに入力します。Mapping networkは学習されるネットワークであるため潜在変数wは図４（C）に示すように、画像の特徴量のentanglementの少ない状態で最適化されることが期待できます。


### ②Adaptive Instance Normalization(AdaIN)(各解像度スケールでのAdaINの採用）
AdaINは、Instance Normalizationの発展版で１つのモデルであらゆるスタイル（画風）への変換を可能にした正規化手法です。StyleGANにおいてAdaINは、Mapping Networkによって得られた中間潜在変数wに対して、アフィン変換（平行移動変換）を施した後に、このアフィン変換によるスケール値とバイアス値を、それぞれのAdaINの制御パラメータであるスケール項y<sub>s,i</sub> とバイアス項 y<sub>b,i</sub> として用います。
AdaINは、以下の式で与えられます。

```math
AdaIN(x_{i},y)=y_{s,i}\frac{x{i}-\mu(x_{i})}{\sigma(x_{i})}+y_{b,i}
```

<dd>x<sub>i</sub> : 特徴マップ（content）</dd>
<dd>y = (y<sub>s,i</sub>, y<sub>b,i</sub>) : 中間潜在変数wをアフィン変換して潜在ベクトル（Style）</dd>
<dd>y<sub>s,i</sub> : スケール項（パラメータ１）</dd>
<dd>y<sub>b,i</sub> : スケール項（パラメータ２）</dd>

<br>
このAdaINの処理は、特徴マップ単位（＝チャンネル単位）での正規化処理になっていますが、このAdaINによる変換を各解像度スケール（4×４、8×8、、、1024×1024）の畳み込みの後に行うことで、各解像度での画像全体に渡って大域的にスタイルを変化させることができるようになります。

### ③Pixel-wise Noise InputとStochastic variation（ピクセル単位のノイズ入力と確率的変動）
従来のGANでは局所的な特徴生成も大局的な特徴生成と同様に潜在変数としての入力ノイズを直接Generatorに入力することで実現するアーキテクチャになっていましたが、前述の潜在空間の歪みによりノイズの影響を制御することが困難でした。
StyleGANでは、Synthesis networkでの各畳み込みの直後にノイズマップでピクセル単位のノイズを直接加えることで局所的な特徴生成を直接制御することを可能にしています。
※前述のAdaINが大域的なスタイルの変化、ノイズマップが局所的なスタイルの変化を制御します。ノイズの影響と効果については図５のようになります（論文より）。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413258/ca2122c3-9e12-f106-42ab-9610f38c5da7.png)

<dd>図５　各ピクセルの標準偏差</dd>
<br>
(a)ベースとなる生成された画像
(b)ベースとなる画像はそのままで、それぞれノイズを変えたときの４つの画像
(c)ノイズの影響を受けている個所をグレースケールで表示した画像（白が影響大）、
髪の毛やシルエット、背景の一部、目の反射にも影響しているが、アイデンティティやポーズといった大域的な特徴には影響を与えていません。

図６は、Synthesis Networkのどの層にノイズを加えるかで生成画像の効果を示した図です（論文より）。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413258/f757d6af-931e-9716-2a45-2de86081b547.png)

<dd>図６　ジェネレーターの各層に入力されたノイズの影響</dd>

<br>
(a)全ての層にノイズを加えた場合
(b)ノイズを加えない場合
(c)高解像度の層（64×64～1024×1024）のみにノイズを加えた場合
(d)低解像度の層（4×4～32×32）のみにノイズを加えた場合

ノイズを加えないと全体的に均一で立体感のない画像が生成されています。ノイズを加えると肌質などの局所的で細かなテクスチャーが加味されてよりリアルな画像が生成されています。そしてノイズを加える層で、粗いノイズ（低解像度）では髪の毛が大きく巻いていたり背景が大きく見えたりしますが、細かいノイズ（高解像度）では髪の毛の巻具合や背景の細かさ肌の毛穴などが浮かび上がってきます。



### ④progressiveGANから入力層を排除（代わりに学習済み定数マップを入力）
ProgressiveGANでは、乱数を生成してGeneratorへの初期入力（4×4）としています。
一方StyleGANでは入力層を排除し、学習済み定数マップ（4×4×512）を入力します。これは、StyleGANが生成画像を中間潜在変数wとAdaIN、そしてノイズマップによって制御しており可変な入力が不要であるためです。


## (4) Style Mixing
Style Nixingは、潜在空間よりサンプリングした２つの潜在変数z<sub>1</sub>、z<sub>2</sub> ∈ Z 、及び２つの中間潜在空間 w<sub>1</sub>、w<sub>2</sub> ∈ W に関してSynthesis NetwrokのAdaINのパラメータとして入力する際に、ある解像度スケールまでは z<sub>1</sub>・w<sub>1</sub> を入力し、それ以降の解像度スケールには z<sub>2</sub>・w<sub>2</sub> を入力するように切り替えます。こうすることでSynthesis Networkは、隣接した解像度スケールの層間で画風（Style）に相関があるように学習しなくなるので、画風の影響を各解像度スケールの層に局所化させることが可能になります。

図７は２つの中間潜在変数を切り替えたときの例になります（論文より）。
低解像度（4×4 ～ 8×2）で中間潜在変数をw<sub>1</sub>->w<sub>2</sub>に切り替えると、ポーズやヘアスタイル、顔の形、眼鏡などの大域的な特徴がソースBからもたらせられますが、すべての色（目、髪、照明）と細かい顔の特徴はソースAに似ています。代わりに中間解像度（16×16〜32×32）で中間潜在変数をw<sub>1</sub>->w<sub>2</sub>に切り替えると、より小さなスケールで顔の特徴やヘアスタイル、目の開閉がソースBから継承されますが、ポーズや一般的な顔の形状、眼鏡はソースAから継承されます。
最後に、高解像度（64×64 ～ 1024×1024）で中間潜在変数をw<sub>1</sub>->w<sub>2</sub>に切り替えるとソースBから主に配色やピクセル単位の局所的な特徴が引き継がれます。

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413258/1d8d062a-f740-db34-f089-03cd63b8813a.png)
<dd>図7．中間潜在変数を切り替えたときの例</dd>

## (5) 潜在空間におけるentanglement（もつれ）とdisentanglement（解きほぐし）の評価
StyleGANでは、entanglement/disentanglementを定量化する指標として、Perceptual path length（PPL)とLinear separabilityの２つの指標を使っています。
### (ⅰ)Perceptual path length（PPL）
潜在空間ベクトルの補間により、画像に驚くほど非線形の変化が生じる可能性があります。
StyleGANでは、このような線形補間においてどれだけ急激に画像が変化するのかをPPLで計測します。PPLは文字通り「人間の知覚的」に潜在空間上で画像がなめらかに変化するのかの指標です。
２つの潜在変数 z<sub>1</sub>、z<sub>2</sub> を比率tで混ぜ合わせた潜在変数で生成した画像と、比率t+εで混ぜ合わせた潜在変数で生成した画像の距離の期待値となっています。実態はVGG（画像認識ネットワーク）を使用し、それぞれが算出する特徴量ベクトルの距離を「知覚的」な距離としています。解析的には求めることはできないので、多くの画像で計算を行って期待値をとった結果がPPLの値になります（値が小さいほど潜在空間が知覚的になめらかだということになります）。

- 潜在空間ZでのPPL
![math_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413258/90820efb-ab01-ff0e-cdb2-58971fb657c0.png)

<dd>G:生成器の出力（生成画像）</dd>
<dd>d:画像間の距離を測る距離関数</dd>
<dd>slerp:球面上の線形補間</dd>
<dd>ε:$\mathbf 10^{-4} $(微小ノイズ)</dd>


- 中間潜在空間wでのPPL
![math_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413258/97854dc5-b438-93b2-ece8-fb1b2cae53ba.png)


<dd>G:生成器の出力（生成画像）</dd>
<dd>d:画像間の距離を測る距離関数</dd>
<dd>lerp:直線上の線形補間</dd>
<dd>f:Mapping Networkによる写像</dd>




### (ⅱ) Linear separability
disentanglement（解きほぐし）されている潜在空間では、潜在空間のある部分からサンプリングしたベクトルだけを使って画像生成したときは、生成された画像で変動する要素は１つのみである。これは見方をかえると潜在空間の各点が線形分離可能であることを意味している。そのためStyleGANでは、潜在空間内の点がどれだけうまく線形分離可能であるかを測定することでentanglement/disentanglementの定量的指標として利用しています。
※興味がある場合、詳細なロジックについては論文を参照してください



# ３　StyleGAN2
## (1) StyleGAN2とは
StyleGAN2は、StyleGANで課題となっていたdropletと呼ばれるノイズが生じる問題（図８）や生成画像の特徴の一部が不自然になる事象（図９）を、アーキテクチャを見直して解消したものです。

- dropletと呼ばれるノイズが生じる問題
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413258/3a6d6cef-d42e-b83f-1acf-dc1471d2227d.png)
図8．dropletの発生の例

- 生成画像の特徴の一部が不自然になる事象
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413258/d2211e5d-177a-e635-0b4a-7b6ca8304bd7.png)
図9．生成画像の特徴の一部が不自然になる例（顔の向きに関わらず正面を向いて生成される歯）

## (2) StyleGAN2の特徴
StyleGAN2では、上記の課題を解決するために主に以下の３つの観点での改善が行われています。
(ⅰ)AdaINのように実際の統計量で正規化するのではなく、推定の統計量で正規化することで不要なモードの顕在化を防ぎ、「dropletを除去」する。
(ⅱ)Progressive Growingの代わりにskip connectionを持った階層的なGeneratorを用いることで、「生成画像の特徴の一部が不自然になる事象」を低減する。
(ⅲ)潜在空間をなめらかにすることで、画像品質を向上する。

### (ⅰ) dropletの除去（論文２章：Instance normalization revisited）

StyleGANでのAdaINは実際に入ってきたデータの統計量を使って正規化していますが、これがdropletの原因になっていました。この対策として実際に入ってきたデータの統計量ではなく、「推定の統計量」を使って畳み込みの重みを正規化することでdropletの発生を防げることがわかりました。実際には下記の図10のように対策しています。

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413258/740a65b0-e913-f82c-5303-dfe976fa58da.png)
<dd> 図10．正規化処理の改善</dd>

<br>
図10（a）が元のStyleGANのアーキテクチャで、「A」はスタイルを生成する中間潜在変数wから学習されたアフィン変換を示し、「B」はノイズブロードキャスト操作です。図10（a）のAdaINを詳細に記述すると２つの手順に分解できます。１つ目はコンテンツ情報を自身の統計量で正規化（Norm mean/std）すること、２つ目は正規化されたコンテンツ情報をスタイル情報「A」を線形変換（Mod mean/std）することです。また、学習した重み（w）、バイアス（b）および入力を（ｃ）としてボックスごとに１つのスタイルがアクティブになるように灰色のボックスをStyle blockとして詳細化したものが図10（b）になります。なお活性化関数（leaky ReLU）は、バイアスを追加した直後に常に適用されます。
次に図10（ｃ）に記載いてあるように、実際の統計量である平均値(mean)を取り除き正規化の操作を標準偏差（std）による割り算のみに、スタイルの線形変換も係数の掛け算だけにします（図10①）。そしてノイズ挿入部はStyle blockの中にある必要はないのでStyle blockの外に出します（図10②）。
次に図10（ｄ）で、最初のStyleベクトルによる線形変換を畳み込みの内部で実施します。Style block内ではMapping Networkで生成したスタイルベクトルwを線形変換したs<sub>i</sub>(y<sub>s,i</sub>)をかけています。コンテンツ画像にs<sub>i</sub>をかけたものを畳み込みの重みw<sub>ijk</sub>で処理するという操作は、コンテンツ画像を重みw<sub>ijk</sub>とs<sub>i</sub>の積で畳み込むということと等価なので、この操作は以下のように書き換えることができます（図10③）。

```math
w'_{ijk}=s_{i}・w_{ijk}
```

最後に、正規化（norm）の処理（図10（C）では標準偏差で割っているだけ）を畳み込みの内部で実施するようにします。入力が標準正規分布に従っていると仮定する出力画像の標準偏差は重みのL2ノルムによってスケーリングされ、以下のようになります。

```math
\sigma_{j}=\sqrt{\sum_{i,k}(w'_{ijk})^2}
```

正規化（norm）の処理では上述のように標準偏差で割っているだけでしたので、畳み見込んだ出力に標準変数の逆数をかければいいことになりますので、畳み込んだ出力に標準偏差をかける操作は、重みw<sub>ijk</sub>に標準偏差の逆数をかけたもので畳み込むことと等価です。従って正規化（norm）の操作は以下になります（図10④）。

```math
w''_{ijk}=w'_{ijk}/\sqrt{\sum_{i,k}(w'_{ijk})^2+\epsilon}
```

以上の見直しにより、Style block全体が単一の畳み込み層に実装されています。

この正規化の改善により、図11のように生成された画像からdropletが削除されるようになります（論文の図３より引用）。

![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413258/81d0cd1d-4fe1-2510-937e-370481435c1f.png)
<dd>図11．dropletの改善</dd>


### (ⅱ) 生成画像の特徴の一部が不自然になる事象を低減（論文４章：Progressive growing revisited）

Progressive growingは高解像度の画像生成は非常に成功したモデルですが、個々のGeneratorが独立しているので頻出する特徴を生成する傾向にあり、その結果として先述した顔が動いても歯が追従していかないという結果に繋がっています。そのためStyleGAN2ではStyleGANのネットワークの再構築しProgressive growingに代わる新たなアーキテクチャを探すにより高解像度の画像生成ができるようにしています。具体的には図12の３つのモデルを検証しています。

![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413258/50c34342-9ffc-e7c0-e26a-4669340b53df.png)
<dd> 図12　３つの検証モデル</dd>
<br>

図12（a）はMSG-GANです。複数のスキップ接続を使用してGeneratorとDiscriminatorの同一の解像度を接続しています。図12（ｂ）は各解像度のRGB出力をアップサンプリング（Discriminatorではその逆）して合計して設計を簡略化しています。図12（ｃ）では、さらにresidual connectionを使うように変更しています。
これらを全部組み合わせて評価した結果、Generatorでは図12（ｂ）をDiscriminatorでは図12（ｃ）を採用しています（緑色で表示）。
このアーキテクチャを採用して生成された画像を図13に示します。顔の向きに合わせて歯や目も自然に合わせて動いているのがわかります。

![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413258/aba9767e-6527-2f79-566c-7ab69658242f.png)
<dd>図13 Progress growingの改善結果の画像</dd>


### (ⅲ) 潜在空間をなめらかにすることによる画像品質向上（論文３章：Image quality and generator smoothness）

潜在空間の知覚的ななめらかさを表すPerceptual Path Length（PPL）と生成される画像の品質に相関があることがわかってきたのでモデルの正則化に組み込んでいます。
正則化項は以下になり、潜在変数の摂動に対するGeneratorの出力値の変換をなるべく小さくするように仕向けています。

![math_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413258/96fab94c-0cb0-8590-e7dd-3fae178b40c9.png)


ここでJwはヤコビ行列（Jacobian matrix）で、Jw = ∂g(w) / ∂w、yは正規分布のピクセル強度を持つランダム画像、aは定数ですが、||$\mathbf J^T_{w}y $||<sub>2</sub> の移動平均によって動的に変化させながら学習を行い、それによって最適な値が学習中に設定されるようになっています。
また、正則化項の更新は計算コストとメモリ使用量を削減から更新頻度を下げる（１６ミニバッチごとに１回の実行でも影響がないことが分かっているため）戦略をとっています（Lazy regularization）。



# ４　おわりに
StyleGAN2はStyleGANでの問題を修正し、生成画像の品質をさらに向上させ、学習時のパフォーマンスの向上も実現しました（とはいえNVIDIA DGX-1（8GPU）でFFHQの学習データで９日かかるみたいです）。
実際に生成される画像も本物と区別がつかないくらいすばらしいものですので、学習済みモデルからの画像生成をコードを修正してPC(CPU)でも実行できるようにしていきたいと思います。


# 【参考文献、サイト】
・[論文](https://arxiv.org/pdf/1710.10196.pdf)
・[Analyzing and Improving the Image Quality of StyleGAN](https://arxiv.org/pdf/1912.04958.pdf)
・[情報工学_機械学習_生成モデル.md](
https://github.com/Yagami360/My_NoteBook/blob/master/%E6%83%85%E5%A0%B1%E5%B7%A5%E5%AD%A6/%E6%83%85%E5%A0%B1%E5%B7%A5%E5%AD%A6_%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92_%E7%94%9F%E6%88%90%E3%83%A2%E3%83%87%E3%83%AB.md)
・[GANの基礎からStyleGAN2まで](https://akichan-f.medium.com/gan%E3%81%AE%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89stylegan2%E3%81%BE%E3%81%A7-dfd2608410b3)


<font color="gray">
本書は筆者たちが勉強した際のメモを、後に学習する方の一助となるようにまとめたものです。誤りや不足、加筆修正すべきところがありましたらぜひご指摘ください。継続してブラッシュアップしていきます。また、様々なモデルの解説書を掲載していますので、興味のある方は、以下のサイトもご参照ください。
</font>

https://sites.google.com/deepaelurus.com/aboutus/home

© 2021 [NPO法人AI開発推進協会](https://sites.google.com/deepaelurus.com/aboutus/home)