← 機械学習テキスト 一覧

🎓 レベル:発展 | 重要度:A(必須)

📎 前提:オートエンコーダとVAE(生成モデルの対比) | 関連:凸最適化の基礎(ミニマックス)

要点(BLUF)


発想:偽造犯 vs 鑑定士

GAN(Generative Adversarial Network, Goodfellow ら 2014)の発想は、2つのネットワークを敵対させることです。

偽造犯はより本物そっくりの贋作を作ろうとし、鑑定士はより精度よく贋作を見破ろうとします。両者がイタチごっこで腕を上げ続けると、最終的に偽造犯の作品は本物と見分けがつかなくなる——これが GAN の学習が目指す状態です。

flowchart LR
    Z["ノイズ z 〜 p_z"] --> G["生成器 G"]
    G --> Fake["偽データ G(z)"]
    Real["本物 x 〜 p_data"] --> D["識別器 D"]
    Fake --> D
    D --> Out["真偽の確率 D(・)"]
    Out -. "Dを最大化(見破る)" .-> D
    Out -. "Gを最小化(騙す・勾配は逆伝播で G へ)" .-> G

ポイントは、GG への学習信号が識別器 DD を通した勾配としてのみ与えられることです。GG は「本物のデータ」を直接見ません。DD がどこで騙されたかという情報だけを頼りに、誤差逆伝播(誤差逆伝播法)で更新されます。


ミニマックス目的

GAN の学習は、次の価値関数 V(G,D)V(G, D) をめぐる2人ゲームとして定式化されます。

minGmaxD V(G,D)=Expdata[logD(x)]+Ezpz[log(1D(G(z)))]\min_G \max_D\ V(G,D) = \mathbb{E}_{x \sim p_{\text{data}}}\big[\log D(x)\big] + \mathbb{E}_{z \sim p_z}\big[\log\big(1 - D(G(z))\big)\big]

各項の意味を分解します。

要するに、識別器は「本物・偽物を当てるゲーム」で得点を最大化し、生成器は「識別器を騙して」その得点を最小化する、入れ子のミニマックスです。

学習は両者を交互に更新します(DDkk ステップ、GG を1ステップ、のように)。識別器を内側で最大化し、その結果を使って生成器を外側で最小化する、という二段構えがミニマックスの実装です。


最適識別器の導出

GAN の理論の核は、「GG を固定したとき、最適な識別器 DD^* が閉形式で書ける」ことです。ここから目的が JS ダイバージェンスへ帰着することを示します。

ステップ1:価値関数を1つの積分にまとめる

第2項は期待値を x=G(z)x = G(z) で変数変換すると、生成分布 pgp_g 上の積分になります(pgp_gG(z)G(z) が従う分布)。すると VVxx についての1本の積分にまとまります。

V(G,D)=x[pdata(x)logD(x)+pg(x)log(1D(x))]dxV(G,D) = \int_x \Big[\, p_{\text{data}}(x)\log D(x) + p_g(x)\log\big(1 - D(x)\big) \,\Big]\,dx

ステップ2:各点ごとに被積分関数を最大化

DD は各点 xx で独立に値を選べるので、VV の最大化は被積分関数を xx ごとに最大化することと同じです。a=pdata(x)a = p_{\text{data}}(x)b=pg(x)b = p_g(x) と置くと、最大化したいのは

f(y)=alogy+blog(1y),y=D(x)(0,1)f(y) = a\log y + b\log(1 - y), \qquad y = D(x) \in (0,1)

です。微分してゼロと置きます。

f(y)=ayb1y=0        a(1y)=by        y=aa+bf'(y) = \frac{a}{y} - \frac{b}{1 - y} = 0 \;\;\Longrightarrow\;\; a(1-y) = b\,y \;\;\Longrightarrow\;\; y = \frac{a}{a + b}

f(y)=a/y2b/(1y)2<0f''(y) = -a/y^2 - b/(1-y)^2 < 0 なので、これは最大点です(ff は上に凸、凸最適化の基礎)。したがって最適識別器は

D(x)=pdata(x)pdata(x)+pg(x)\boxed{\,D^*(x) = \frac{p_{\text{data}}(x)}{p_{\text{data}}(x) + p_g(x)}\,}

要するに、最適な鑑定士は「その点での本物の密度の、本物+偽物に対する割合」を出力します。本物だけが存在する点では D=1D^*=1、偽物だけの点では D=0D^*=0、両者が等しい点では D=1/2D^*=1/2 です。

ステップ3:DD^* を代入して JS ダイバージェンスへ

DD^*VV に戻し、生成器が最小化する仮想目的 C(G)=maxDV(G,D)C(G) = \max_D V(G,D) を計算します。

C(G)=Expdata ⁣[logpdatapdata+pg]+Expg ⁣[logpgpdata+pg]C(G) = \mathbb{E}_{x \sim p_{\text{data}}}\!\left[\log \frac{p_{\text{data}}}{p_{\text{data}} + p_g}\right] + \mathbb{E}_{x \sim p_g}\!\left[\log \frac{p_g}{p_{\text{data}} + p_g}\right]

分母に pdata+pg2\tfrac{p_{\text{data}}+p_g}{2} を作るため、各 log\log の中を 22 で割って外に log12\log\frac12 を出します。

C(G)=log4+Epdata ⁣[logpdata(pdata+pg)/2]=DKL ⁣(pdatapdata+pg2)+Epg ⁣[logpg(pdata+pg)/2]=DKL ⁣(pgpdata+pg2)C(G) = -\log 4 + \underbrace{\mathbb{E}_{p_{\text{data}}}\!\left[\log \frac{p_{\text{data}}}{(p_{\text{data}}+p_g)/2}\right]}_{=\,D_{\mathrm{KL}}\!\left(p_{\text{data}}\,\|\,\frac{p_{\text{data}}+p_g}{2}\right)} + \underbrace{\mathbb{E}_{p_g}\!\left[\log \frac{p_g}{(p_{\text{data}}+p_g)/2}\right]}_{=\,D_{\mathrm{KL}}\!\left(p_g\,\|\,\frac{p_{\text{data}}+p_g}{2}\right)}

ここで JS ダイバージェンスの定義

JSD(pq)=12DKL ⁣(pp+q2)+12DKL ⁣(qp+q2)\mathrm{JSD}(p \,\|\, q) = \tfrac12 D_{\mathrm{KL}}\!\left(p \,\Big\|\, \tfrac{p+q}{2}\right) + \tfrac12 D_{\mathrm{KL}}\!\left(q \,\Big\|\, \tfrac{p+q}{2}\right)

を使うと、2つの KL 項はちょうど 2JSD2\,\mathrm{JSD} にまとまります。

C(G)=log4+2JSD(pdatapg)\boxed{\,C(G) = -\log 4 + 2\cdot \mathrm{JSD}\big(p_{\text{data}}\,\|\,p_g\big)\,}

要するに、最適識別器のもとで生成器が解いているのは「データ分布と生成分布の JS ダイバージェンスの最小化」です。GG は知らないうちに分布間の距離を縮めています。

ステップ4:大域最適

JSD は非負で、JSD=0    pg=pdata\mathrm{JSD}=0 \iff p_g = p_{\text{data}} です。よって C(G)C(G) の大域最小は

pg=pdata        C(G)=log4p_g = p_{\text{data}} \;\;\Longrightarrow\;\; C(G) = -\log 4

このとき D(x)=pdatapdata+pdata=12D^*(x) = \dfrac{p_{\text{data}}}{p_{\text{data}} + p_{\text{data}}} = \dfrac12鑑定士がコインを投げるしかなくなった状態——本物と偽物がまったく見分けられない——が理論上のゴールです。


暗黙的生成モデル:尤度を計算しない

GAN の大きな特徴は、生成分布 pg(x)p_g(x) を陽に計算しないことです。

このようなモデルを暗黙的生成モデル(implicit generative model)と呼びます。GAN は密度を測る代わりに、「サンプルが本物と区別できるか」という識別器の判定だけを頼りに学習します。これが、尤度の最大化に縛られない自由さ(鮮明な画像)と、尤度という安定した羅針盤を失った難しさ(不安定さ)の両方を生みます。


学習の難しさ

理論上は pg=pdatap_g = p_{\text{data}} が大域最適でも、実際の学習は大きく揺れます。代表的な失敗を挙げます。

1. 勾配消失(vanishing gradient)

学習初期、GG の出力は本物とかけ離れているため、pdatap_{\text{data}}pgp_gサポート(台)がほとんど重なりません。重ならない2分布の JSD は一定値 log2\log 2 に飽和し、GG について微分すると勾配がほぼゼロになります。識別器が強すぎて完璧に見破ると D(G(z))0D(G(z)) \approx 0 となり、log(1D(G(z)))\log(1 - D(G(z))) の勾配が消え、GG が学習できなくなります。

対策:non-saturating loss(飽和しない損失)GG について元の minGlog(1D(G(z)))\min_G \log(1 - D(G(z))) の代わりに、maxGlogD(G(z))\max_G \log D(G(z))(= logD(G(z))-\log D(G(z)) の最小化)を使います。これは「偽物を本物と判定させる」よう向きを変えた同符号の目的ですが、D(G(z))D(G(z)) が小さい初期にむしろ大きな勾配を与えます。原論文も実装ではこちらを推奨しており、現在も標準です。

xychart-beta
    title "識別器の出力 D(G(z)) に対する生成器の勾配の強さ(概念図)"
    x-axis "D が偽物と見破る ← D(G(z)) → D が騙される" 0.05 --> 0.95
    y-axis "G が受け取る勾配の大きさ" 0 --> 10
    line [9.5, 3.0, 1.5, 1.0, 0.7, 0.5, 0.4, 0.3, 0.25]
    line [0.3, 0.4, 0.5, 0.7, 1.0, 1.5, 2.5, 5.0, 9.5]

上図:下に凸の線(non-saturating, logD-\log D)は D(G(z))D(G(z)) が小さい初期に強い勾配を与えます。もう一方(飽和する元の損失)は初期に勾配がほぼゼロです。

2. モード崩壊(mode collapse)

GGデータ分布の一部のモード(山)だけを再現し、似たサンプルばかり出す現象です。極端には、識別器を確実に騙せる「特にもっともらしい1種類の出力」に GG が固着します。多様性を測る項がミニマックス目的に無いため、GG は「全モードを覆う」より「1点で確実に勝つ」方に逃げられます。交互最適化で GGDD の弱点を追いかけ、DD がそれに適応し…とモード間を循環することもあります。

3. 収束しない(ナッシュ均衡の難しさ)

GAN は2プレイヤー非協力ゲームのナッシュ均衡を探す問題です。一方の損失を下げる更新が他方の損失を上げるため、勾配降下が均衡へ収束する保証はなく、振動や発散が起きます(最適化が鞍点的構造を持つため、凸最適化の基礎 の単純な凸最小化とは性質が違う)。

改善手法(⚠️ 要最新確認)

GAN の安定化は活発に研究が続く領域です。以下は代表的な方向性ですが、最新の標準は要確認です。


VAE との対比

同じ生成モデルでも、VAE(オートエンコーダとVAE)と GAN は性格が正反対です。

観点VAEGAN
学習の目的尤度の下界 ELBO を最大化ミニマックス(実質 JSD 最小化)
密度 p(x)p(x)近似的に扱える(明示的)扱えない(暗黙的)
サンプルの質ぼやけがち(再構成誤差・平均化)鮮明(識別器が細部を要求)
学習の安定性安定(単一目的の最適化)不安定(均衡探索・崩壊)
潜在空間構造化され滑らか(事後分布を正則化)構造の保証は弱い

要するに、VAE は「ぼやけるが安定」、GAN は「鮮明だが不安定」。VAE のぼやけは尤度(平均的再構成)に最適化する代償、GAN の鮮明さは「本物と区別できないこと」を直接求める恩恵であり、不安定さはその裏返しです。


⚠️ よくある誤解


まとめ


対応するシミュレーション

simulations/gan_optimal_discriminator.py:本物 pdatap_{\text{data}} と生成器 pgp_g(平均をずらした正規分布)に対し、最適識別器 D(x)=pdata/(pdata+pg)D^*(x)=p_{\text{data}}/(p_{\text{data}}+p_g) を描きます。生成器が遠いと DD^* ははっきり見分けるが、本物に近づくとどこでも0.5に近づくこと、そして生成器が下げている量が JSD(最小0・上限 log2\log 2)であることを可視化します。実際の学習は不安定でモード崩壊・勾配消失が起きる点にも触れます。

最適識別器 D* とJSD

関連ノート