ひとことで言うと
GAN(Generative Adversarial Network)は、ノイズからデータを作る生成器 と、本物か生成物かを判定する識別器 を同時に学習する枠組みです。 は本物を1、生成物を0に近づけ、 は をだます方向に更新されます。したがって、単独の損失を最小化するモデルではなく、二者のminimaxゲームとして読むのが出発点です。
偽造品を作る側と鑑定士を、同じ訓練ラウンドで競わせる構図です。鑑定士が見抜けるうちは偽造側に情報が返り、偽造品が本物の分布に近づくと、鑑定士の判定は表裏を区別できない1/2へ近づきます。
なぜ必要か
生成器だけに「よいサンプル」を直接採点するのは難しいため、判定を学ぶ を別に置き、その出力を生成器への学習信号にします。原論文の枠組みでは、生成器は入力ノイズ をデータ空間のサンプル に写し、識別器はそのサンプルがデータ分布から来た確率を出力します。学習中は を複数回更新してから を1回更新する交互更新を使います。
| 役割 | 入力 | 更新の向き |
|---|---|---|
| 生成器 | ノイズ | 識別器が誤る確率を高める |
| 識別器 | 本物 または | 本物を1、生成物を0に分ける |
仕組み
データ分布を 、生成器が作る分布を 、ノイズの分布を とします。原論文の価値関数は次です。 はデータ例、 はノイズ、 と はそれぞれ生成器・識別器のパラメータです。
はこの値を最大化し、 は最小化します。 を固定したとき、各データ点でこの式を最大にする識別器は
です。つまり、 の最適化はニューラルネットの出力をただ押し上げる話ではなく、二つの密度の比を判定する問題に読み替えられます。
この最適識別器を価値関数へ代入し、 と置くと、原論文の導出は
に到達します。Jensen–Shannon ダイバージェンスは0以上で、二つの分布が等しいときだけ0です。したがって理論上の生成器の目的は、識別器が最適なら を最小化することです。大域的な最小値は で、そのとき 、 になります。ただしこれは十分な容量と、各段階で識別器を最適化できるという理論条件です。実装では内側の最適化を完了させず、ミニバッチで交互に更新します。
実装上の不安定さは、初期の が悪いときに目立ちます。 が生成サンプルを高い確信度で偽物と判定すると、minimax形の が飽和し、 へ戻る勾配が弱くなります。原論文はこの局面で、 に同じ固定点を持つ非飽和な目的 を使う置き換えを示し、初期の勾配を強くできると説明しています。ここで変えているのは実用的な生成器の目的であり、minimaxゲームの理論上の均衡そのものではありません。
試験でどう問われるか
| 問われ方 | 正解に寄る条件 | 引っかけ |
|---|---|---|
| GANの目的関数 | は最大化、 は最小化する二つの期待値の和 | 両者が同じ方向に最大化する、とする |
| 最適識別器 | を分子に置く、または和を忘れる | |
| の理論上の目的 | 最適な の下でJSDを最小化する | 「識別器の損失を直接最小化」とだけ答える |
| 均衡の条件 | 、 | が成功状態だとする |
| 勾配飽和への対処 | から へ置換 | 後年の派生手法を原論文の提案として混ぜる |
実装で確かめる
最適識別器の式を、二つの離散分布でそのまま計算します。確率の並びを固定すれば、 のとき各点の判定が になることを確認できます。
import numpy as np
p_data = np.array([0.2, 0.5, 0.3])
p_g = np.array([0.1, 0.6, 0.3])
d_star = p_data / (p_data + p_g)
print("D*:", np.round(d_star, 6))
p_same = p_data.copy()
d_same = p_data / (p_data + p_same)
print("same:", d_same)
この計算で、識別器を学習しなくても密度が既知なら最適値が直接求まります。実際のGANでは を明示的な密度として扱わず、 と の微分可能なネットワークを交互に更新します。
取り違えやすいもの
| 用語 | GANとの切り分け |
|---|---|
| 生成器 | 分布からサンプルを作る側。識別器の出力を通る勾配で更新される |
| 識別器 | 本物と生成物を判定する側。価値関数を最大化する |
| minimax目的 | 二者の理論上のゲーム全体。実装では生成器に非飽和目的を使う場合がある |
| JSD | 最適識別器を代入したときに現れる、生成分布とデータ分布の距離 |
| VAE・拡散モデル | いずれも生成モデルですが、ここで扱うGANの競争的な目的関数とは切り分けて考えます |
想起チェック
GANのminimaxで最大化するのはどちらか
識別器 が を最大化し、生成器 が最小化します。
識別器が最適なときの最適判定式は何か
です。
最適識別器を代入した生成器の目的は何を最小化するか
なので、Jensen–Shannon ダイバージェンスを最小化します。
勾配飽和時に原論文が示した生成器の目的の置き換えは何か
を最小化する代わりに、 を最大化します。原論文の説明では固定点は同じで、学習初期の勾配が強くなります。