# #6 Improved Techniques for Training GANs
###### tags: `論文まとめ` `GAN`
https://arxiv.org/abs/1606.03498
# 要旨
半教師あり学習とリアリスティックな画像生成などのGANの応用に焦点を当ててアーキテクチャや訓練手順を提案する.
# 導入
GANは非凸ゲームのナッシュ均衡を多数のパラメータにより訓練し,求めることが必要.
しかしながら,GANの学習には勾配降下が用いられ,ナッシュ均衡は使われていない.
* ソースコード
* https://github.com/openai/improved_gan
# GANの収束のための手法
## Feature Matching
既存の直接,生成画像のディスクリミネータの評価関数を最大化させる手法のみではなく,ディスクリミネータの中間層の特徴量の期待値に一致させるようにジェネレータを訓練させる.
具体的には,${\bf f}({\bf \it{x}})$をディスクリミネータ中間層の活性化関数と定め,ジェネレータは次式で表される新しい評価関数を最小化させるように訓練する.
$$||\mathbb{E}_{{\bf{\it x}}\sim p_{data}}
{\bf f}({\bf{\it x}})-
\mathbb{E}_{{\bf{\it z}}\sim {\it p}_{{\bf{\it z}}}}
{\bf f}\left( {\it G}\left({\bf\it{z}}\right) \right)||_2^2
$$
経験的に,GANが不安定になる状況下において,この手法が有効であることが示されている.
## Minibatch Discrimination
モード崩壊の起こる状況下では,ディスクリミネータの勾配は多くの同様の点において,同一の方向を
指すことがある.ディスクリミネータは各々のサンプルを独立して処理するため,
その勾配間の調整がなく,ジェネレータの出力がたがいにより似ないように指示する機構が存在しない.
勾配降下ではディスクリミネータが同一の画像をジェネレータから生成されることを学習するが学習過程において分離して考察することができない.
ミニバッチのサンプル間の近さをディスクリミネータに判別させることでこの問題を解決することができる.
そこで次のようなモデルを考える.${\bf f}(x_i) \in \mathbb R^A$をいま,ディスクリミネータの中間層にて生成される入力$x_i$の特徴量のベクトルとする.このベクトルをテンソル$T\in \mathbb R^{A\times B\times C}$で掛け,行列$M_i\in\mathbb R^{B\times C}$を得たとする.
この方法では,$M_i$のL1距離をサンプルごとに取り,負号の指数乗を取る.すなわちサンプル$x_i,x_j$に対して,距離関数を
$$
c_b(x_i,x_j)=\exp\left(-||M_{i,b}-M_{j,b}||_1 \right)\in\mathbb R
$$
と定める.次にサンプル$x_i$のこのミニバッチ層の出力$o(x_i)$を以下のように定義する
$$
\begin{eqnarray*}
\displaystyle o(x_i)_b&=&\sum_{j=1}^nc_b(x_i,x_j)\in \mathbb R\\
\displaystyle o(x_i)&=&\left[ o(x_i)_1,o(x_i)_2, ... ,
o(x_i)_B\right]\in \mathbb R^B\\
\displaystyle o(X)&\in& \mathbb R^{n\times B}
\end{eqnarray*}
$$
このミニバッチ層の出力$o(x_i)$と,入力である中間層特徴量$f(x_i)$を連結させ,ディスクリミネータの次の層の入力に渡す.この層を適用することで,今までのようにディスクリミネータは各サンプルに対して,単一の数値を出力し訓練データか否かを示す機能を保ちつつ,側面的情報として,
ニバッチ内の他のサンプルに関する情報を,ディスクリミネータに与えることが可能になる.
## 履歴平均
この方法を用いると,損失関数に$||\theta -\frac{1}{t}\sum_{i=1}^t\theta [i]||^2$という項を含めることができるようになる.すなわち,長時系列のデータを学習する際にこの方法は役に立つ.
:::info
☆あとでやる☆
:::
# 半教師あり学習
GANにおいて,ラベル数$K$のラベルデータを用いて半教師あり学習を行う際は,ジェネレータから出力された画像を新たに,$K+1$個めのクラスへと分類させるようにクラス分類器(=ディスクリミネータ)を
学習させてやればよいということが分かる.すなわち通常のGANにおける生成画像を看過するように学習する項$1-D(x)$と,このモデルにおける$p_{model}(y=K+1|x)$は等価であるといえる.
$\log p_{model}(y\in \{1,...,K\}|x)$を最大化させることで,ラベルの降られていないデータに対しても,それに対応する実データの$K$クラスに分類されるの1つの画像でクラス分類を行うことが可能になる.
実データと生成データを半々に含むようなデータセットに対して,損失関数は次のように定義できる.
$$
\begin{eqnarray*}
L&=&-\mathbb E_{x,y\sim p_{data}(x,y)}[\log p_{model}(y|x)]
-\mathbb E_{x\sim G}[\log p_{model}(y=K+1|x)]\\
&=&L_{supervised}+L_{unsupervised}
\text{where}\\
L_{supervised}&=&-\mathbb E_{x,y\sim p_{data}(x,y)}[\log p_{model}(y|x,y<K+1)]\\
L_{unsupervised}&=&-\{\mathbb E_{x\sim p_{data}(x)}[\log p_{model}(y=K+1|x)]
+\mathbb E_{x\sim G}[\log p_{model}(y=K+1|x)]\}\\
\end{eqnarray*}
$$
このように分解することでこの損失関数は教師有り項に対しては,標準的なクロスエントロピー最適化問題と解釈でき,教師無し項は,$D(x)=1-p_{model}(y=K+1|x)$と定めることで,
$$
L_{unsupervised}=-\{\mathbb E_{x\sim p_{data}(x)}\log D(x)+
\mathbb E_{z\sim noise}\log(1-D(G(z)))\}
$$
となり,標準的なGANのディスクリミネータの損失関数に等しくなる.
実装上の観点では,$K+1$もの出力を設ける必要がないことが言える.ソフトマックス層の出力は,各々の出力$l_j$に対して$l_j-f(x)$のように任意関数の差分をとっても出力値に変化がないという特性を考慮すると,ディスクリミネータを
$$
D(x)=\frac{Z(x)}{Z(x)+1},\text{where}~~Z(x)=\sum_{k=1}^{K}\exp[l_k(x)]
$$
と定めることで,仮想的に$p_{model}(y|x,y<K+1)$と等価になる.
ワンショット学習を行う際には,どのデータに対して,正解ラベルを与えるかが非常に重要である.