GAN の原理:敵対的学習とナッシュ均衡
生成器と識別器を競わせるだけで本物そっくりのデータが生まれる仕組みを、ミニマックス目的・JSダイバージェンス・モード崩壊の数理から正確につかめます。
- 1.GAN は生成器 G と識別器 D を競わせるミニマックス問題で、D が最適なとき G の目的は実分布と生成分布の JSダイバージェンス最小化に一致する。
- 2.両者が釣り合うナッシュ均衡では D の出力がどこでも 0.5(本物と偽物を見分けられない)になり、生成分布が実分布に一致する。
- 3.実際には学習が不安定で、勾配消失とモード崩壊が起きやすい。原因は JSダイバージェンスの飽和と G の目的設計にあり、Wasserstein 距離などで緩和する。
全体像:2つのネットワークを競わせる
GAN(Generative Adversarial Networks, 敵対的生成ネットワーク)は、データを直接モデル化するのではなく、2つのニューラルネットを競争させることで生成を学習します。役割の異なる2者を対戦させ、その均衡点で本物そっくりの分布が手に入る、という設計です。
| ネットワーク | 入力 | 出力 | 目的 |
|---|---|---|---|
| 生成器 G(Generator) | 乱数ベクトル z(潜在変数) | 偽データ G(z) | 識別器をだませる本物そっくりのデータを作る |
| 識別器 D(Discriminator) | 本物または偽のデータ x | 本物である確率 D(x)(0〜1) | 本物と偽物を正しく見分ける |
たとえるなら、**偽札を作る贋作者(G)と、それを見破る鑑定士(D)**のいたちごっこです。G は D をだまそうと精巧になり、D はだまされまいと鋭くなる。この競争が進むほど G の出力は本物に近づきます。土台となるネットワークの仕組みは ニューラルネットワーク を前提とします。
ミニマックス目的:何を最適化しているのか
GAN の学習は、1つの目的関数 V(D, G) を D は最大化・G は最小化する、というミニマックス(minimax, 最小最大)問題として定義されます。
min_G max_D V(D, G)
= E[ log D(x) ] ( x ~ 実データ分布 p_data )
+ E[ log(1 - D(G(z))) ] ( z ~ 事前分布 p_z, 例: N(0, I) )
各項の意味は明快です。
- 第1項
log D(x):本物xに対し D はD(x)を 1 に近づけたい。D が大きくしたい項。 - 第2項
log(1 - D(G(z))):偽物G(z)に対し D はD(G(z))を 0 に近づけたい(=1 - D(G(z))を 1 に)。D が大きくしたい項。
D はこの両方を大きくしようとし(見破る)、G は第2項を小さくしようとします(だます)。両者の目的が真っ向から対立するゼロサム的な構造が「敵対的(adversarial)」の核心です。
本物には「本物(1)」、G の出力には「偽物(0)」というラベルが自動的に付きます。人手のアノテーションは不要で、D の学習は単なる2値分類です。GAN が自己教師あり的に回るのは、ラベルを競争の構造そのものが供給するからです。
最適識別器:目的関数の正体は JSダイバージェンス
GAN が「何を最小化しているのか」は、G を固定して D だけを最適化すると明らかになります。生成分布を p_g、実分布を p_data と書くと、目的関数 V を最大にする最適識別器 D* は各点 x で次の形に解析的に求まります。
D*(x) = p_data(x) / ( p_data(x) + p_g(x) )
これは「その点で本物が出る相対的な割合」そのものです。この D* を V に代入して整理すると、G が最小化している量が Jensen–Shannon ダイバージェンス(JSダイバージェンス, JSD) になることが示せます。
V(D*, G) = -log 4 + 2 · JSD( p_data ‖ p_g )
JSダイバージェンスは2つの確率分布の「隔たり」を測る量で、KLダイバージェンスを対称化したものです。常に 0 以上で、2分布が完全に一致するときだけ 0。つまり GAN の学習とは、突き詰めれば p_g を p_data に近づけ JSD を 0 にする操作に他なりません。
GAN の最適化は「内側で D を最適化 → 外側で G を更新」という入れ子です。内側を解ききった理想状態では D が JSD を計算する役を果たし、外側の G がその JSD を下げる。**D は固定の距離尺度ではなく、学習で立ち上がる“ものさし”**だと捉えると全体像が崩れません。
ナッシュ均衡:競争が釣り合う点
p_g = p_data が達成されると JSD が 0 になり、最適識別器の式に代入すれば次が成り立ちます。
D*(x) = p_data / (p_data + p_data) = 1/2 ( すべての x で )
D の出力がどこでも 0.5、つまり本物と偽物をコイン投げ以上に見分けられない状態です。このとき G も D も自分だけ戦略を変えても利得を改善できません。これがゲーム理論でいう**ナッシュ均衡(Nash equilibrium)**であり、GAN の理論上のゴールです。
ここが GAN の美しさです。ミニマックス問題の均衡点が、ちょうど「生成分布=実分布」という望ましい状態と一致するよう目的関数が設計されている。競争のバランスが取れた瞬間に、最良の生成器が手に入ります。
なぜ学習が不安定なのか
理論はきれいですが、実際の GAN は学習が非常に不安定で扱いが難しいことで知られます。原因は大きく2つあります。
勾配消失:D が強すぎると G が学べない
学習初期は G が下手なので、D は容易に偽物を見破り D(G(z)) ≈ 0 となります。このとき元の目的 log(1 - D(G(z))) は G に対する勾配がほぼ消える(飽和する)ため、G が改善方向を受け取れません。理論上の最適化対象が JSD であることもこれに効いてきます。p_g と p_data の台(サポート)がほとんど重ならないと JSD は一定値 log 2 に張り付き、勾配を生まないのです。
実務では、G の目的を log(1 - D(G(z))) の最小化ではなく log D(G(z)) の最大化に置き換える「非飽和(non-saturating)損失」を使うのが定番です。これは初期に強い勾配を与え、学習を立ち上げます。
# D は本物=1, 偽物=0 を当てる2値分類(最大化 → 損失は符号反転)
loss_D = -( log(D(x_real)) + log(1 - D(G(z))) )
# G は元の min log(1 - D(G(z))) ではなく
# 非飽和版 max log D(G(z)) を使い、初期の勾配消失を避ける
loss_G = -log(D(G(z)))
モード崩壊:多様性が潰れる
もう一つの代表的な失敗が **モード崩壊(mode collapse)**です。G が実分布の一部のモード(例: 手書き数字のうち「1」ばかり)だけを生成し、多様性を失う現象を指します。
なぜ起きるか。G の目的は「D をだます」ことだけで、生成の多様性を要求する項がないからです。もし D をだませる出力を1つ見つければ、G はそこに全確率を集中させても損をしません。D が「今だまされている領域」を学習して塞ぐと、G は別の1点へ飛び移る——これが繰り返され、出力が振動したり数モードに固着したりします。ミニマックスの内外を交互に更新する近似最適化が、真の均衡に収束する保証を持たないことも背景にあります。
通常の教師あり学習と違い、GAN では D と G の損失が拮抗して動くため、損失値の単調な低下が生成品質の向上を意味しません。むしろ片方の損失が一方的に良化していたら、相手が負けて勾配を失っているサインかもしれません。評価はサンプルの目視や FID などの指標(モデル評価 の発想を生成へ拡張したもの)で行うのが基本です。
安定化の方向性:JSD から Wasserstein へ
不安定さの根が「JSDが重なりのない分布で勾配を出さない」点にあるなら、距離尺度そのものを取り替えるのが筋の良い解決です。代表が **WGAN(Wasserstein GAN)**で、JSダイバージェンスの代わりに **Wasserstein 距離(Earth Mover's 距離)**を最小化します。
| 観点 | オリジナル GAN(JSD) | WGAN(Wasserstein 距離) |
|---|---|---|
| 分布が重ならないとき | 勾配が消える(log 2 に飽和) | 距離に応じた滑らかな勾配が出る |
| D の役割 | 本物確率を出す分類器(0〜1) | 実数スコアを出す“批評家(critic)” |
| 制約 | 特になし | D が 1-リプシッツ関数である制約(重みクリップや勾配ペナルティ) |
| 効用 | 理論は明快だが学習が不安定 | 勾配が安定し、損失が品質と相関しやすい |
Wasserstein 距離は分布が重ならなくても連続で意味のある勾配を与えるため、勾配消失が起きにくく、損失値が生成品質の目安として使いやすくなります。GAN 研究の多くは、この「目的関数・正則化・アーキテクチャ」のいずれかを改良して安定性と多様性を確保する方向に進みました。最適化アルゴリズム自体は 勾配降下法 の枠組み(多くは Adam)のままです。
まとめ:競争が定義する生成
GAN の原理は次の鎖に集約されます。
| 論点 | 中身 | 押さえどころ |
|---|---|---|
| 目的 | min_G max_D V(D,G) のミニマックス | D は見破り G はだます。対立がゼロサム的構造を作る |
| 最適 D での意味 | G は JSD( p_data ‖ p_g ) を最小化 | D は学習で立ち上がる“距離のものさし” |
| 均衡 | p_g = p_data, D(x) = 1/2 | ナッシュ均衡=見分け不能=最良の生成器 |
| 弱点 | 勾配消失・モード崩壊 | JSDの飽和と多様性項の欠如が原因。Wasserstein 等で緩和 |
- 最適識別器は
D*(x) = p_data/(p_data + p_g)、そのとき G の目的は JSダイバージェンスの最小化に一致する。 - ナッシュ均衡では
p_g = p_dataかつ D(x) = 1/2(どこでも)。 - 勾配消失対策に 非飽和損失(max log D(G(z))) を使うのが実務の定番。
- モード崩壊=多様性の喪失。G の目的に多様性を要求する項がないことが本質的原因。
- 安定化の代表が WGAN(JSD → Wasserstein 距離、D は 1-リプシッツ制約付きの critic)。
GAN は「データの確率を直接書き下す」のではなく、競争の均衡として暗黙に分布を学ぶという発想の転換でした。同じ生成AIでも、過程を解析的に固定して逆をたどる 拡散モデル(数理は 拡散モデルの数理)とは対照的なアプローチです。両者を比べると、生成モデルが「分布の近さをどう測り、どう詰めるか」という共通の問いに、異なる答えを出していることが見えてきます。
AI/機械学習 Article
GAN の原理:敵対的学習とナッシュ均衡を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
GAN
比較で見る軸
難易度: advanced / カテゴリ: AI/機械学習 / タグ数: 5
導入後に効く点
両者が釣り合うナッシュ均衡では D の出力がどこでも 0.5(本物と偽物を見分けられない)になり、生成分布が実分布に一致する。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- AI/機械学習
- タグ数
- 5
判断チェックリスト
- 自社の用途が「GAN / 生成AI」に近いか確認する。
- 強みである「GAN は生成器 G と識別器 D を競わせるミニマックス問題で、D が最適なとき G の目的は実分布と生成分布の JSダイバージェンス最小化に一致する。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。