体系 › 生成モデル
·無料·論文·14分で読めます

GANの栄枯盛衰 — 敵対で学ぶ発明と、拡散に負けた理由

2014年に「本物らしさの物差しごと学習させる」という発想で画像生成を一変させたGANが、なぜモード崩壊と学習の不安定さに悩み、WGANで立て直し、それでも拡散モデルに主役を譲ったのか。10年の流れを式と動く図でたどります。

要点

  • GANは、本物らしさの物差しを人間が式で書かずに判別器として学習させ、生成器と競わせる手法である。
  • 最適な判別器は本物と偽物の濃さの比を返し、最適化しきれば分布は本物と一致する。
  • 序盤は勾配が消えるため、log D(G(z))を最大化する非飽和損失が既定になった。
  • モード崩壊は目的関数に多様性を求める項がないため起き、損失の数字には出てこない。
  • WGANは分布が重ならなくても距離を返すWasserstein距離を使い、criticの損失が画像の品質と相関して下がる。
対象textタスクgeneration

Generative Adversarial Networks

一次資料 — この記事の根拠

この解説の公開 2026-08-22

Generative Adversarial NetworksarXiv:1406.2661論文ページ·PDF
Wasserstein GANarXiv:1701.07875論文ページ·PDF
Diffusion Models Beat GANs on Image SynthesisarXiv:2105.05233論文ページ·PDF

比喩: 贋作師と鑑定士を同じ部屋で育てる

美術品の贋作師を育てたいとします。教科書はありません。代わりに、隣に鑑定士見習いを座らせます。

贋作師は絵を描き、鑑定士は「本物か偽物か」を当てる。最初はどちらも素人なので、鑑定士は絵の具のムラだけで見抜けます。すると贋作師はムラを消すことを覚え、今度は鑑定士が筆致の違いに気づき、贋作師は筆致を真似る——このいたちごっこを何万回も回すと、鑑定士が半々でしか当てられない、つまり本物と見分けがつかない絵を描く贋作師ができあがっています。

これが GAN(Generative Adversarial Network、敵対的生成ネットワーク) です。贋作師が生成器(Generator)、鑑定士が判別器(Discriminator)。2014年の Goodfellow らの論文が示したこの構図は、それまでの生成モデルの常識を壊しました。

直感: 「本物らしさ」を人間が式で書かなくていい

何がそんなに新しかったのか。物差しそのものを学習させた点です。

それ以前の画像生成は、「正解画像とどれだけ近いか」を人間が決めた式で測っていました。典型は画素ごとの二乗誤差です。ところがこれには根の深い欠陥があります。正解が複数あるとき、二乗誤差を最小にするのは「正解たちの平均」なのです。人の顔を生成する場面で、髪が右に流れる絵と左に流れる絵の両方がありうるなら、二乗誤差にとっての最善手は両方を薄く重ねた、ぼんやりした絵になります。実際、初期のオートエンコーダ系の出力がぼやけるのはこれが主因でした(この事情はVAEを1からで扱っています)。

GANはここを回避します。判別器は「ぼやけた絵は偽物だ」とすぐ学びます。だから生成器が平均へ逃げると即座に見破られ、罰が返ってくる。平均への逃げ道が塞がれている——これがGANの絵が当時ずば抜けて鮮明だった理由です。

仕組み: たった1本のminimax式

論文の中心は、次の1本です。

min⁡Gmax⁡D  Ex∼pdata[log⁡D(x)]+Ez∼pz[log⁡(1−D(G(z)))]\min_G \max_D \; \mathbb{E}_{x \sim p_{\text{data}}}[\log D(x)] + \mathbb{E}_{z \sim p_z}[\log (1 - D(G(z)))]
(1)

記号を1つずつ。pdatap_{\text{data}} は本物のデータが従う分布、pzp_z は乱数の分布(普通は正規分布)、G(z)G(z) は乱数から作った偽物、D(x)D(x) は「本物である確率」を返す判別器です。

要するにこの式は、「鑑定士は本物に高い点、偽物に低い点を付けたい。贋作師は、自分の偽物に高い点を付けさせたい」と言っているだけです。特筆すべきは、両者が同じ1つの数値を、片方は最大化し、片方は最小化しようとしている点です。だから min⁡\min と max⁡\max が並びます。これは損失を下げていく最適化ではなく、2人ゲームの均衡探しです。この違いが、後のあらゆる苦労の源になります。

論文はさらに、生成器を固定したときに最強の鑑定士がどう振る舞うかを示しました。

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

pgp_g は生成器が作り出す分布です。つまり最適な鑑定士は、その地点に本物がどれだけ濃く、偽物がどれだけ濃いかの比を返します。半々の場所では 0.5 になる。これを元の式に戻すと、全体は pdatap_{\text{data}} と pgp_g の Jensen-Shannonダイバージェンス(2つの分布のズレの測り方の一種。KL情報量を1からの対称版だと思ってください)に定数を足した形になります。最適化しきれば pg=pdatap_g = p_{\text{data}}、つまり本物と完全に同じ分布に到達する。理論としては、これ以上ないほど綺麗でした。

最初のつまずき: 勾配が消える

綺麗な理論は、最初の1000ステップで裏切られます。

学習の序盤、生成器はまだ何も作れないので、鑑定士は自信満々に D(G(z))≈0D(G(z)) \approx 0 を返します。ここで生成器側の項 log⁡(1−D(G(z)))\log(1 - D(G(z))) を見てください。DD が0に近いところで、この関数はほとんど平らです。「全部だめ」という答えは返ってくるのに、「どっちへ動けばマシになるか」の傾きが返ってこない。 生成器がいちばん助けを必要としている序盤に、いちばん情報が来ないわけです。

原論文自身がこの問題を認め、実装上の回避策を併記しています。生成器は log⁡(1−D(G(z)))\log(1-D(G(z))) を最小化する代わりに、log⁡D(G(z))\log D(G(z)) を最大化する。最適解の位置は同じですが、序盤の傾きが桁違いに急になります。非飽和損失(non-saturating loss)と呼ばれるこの書き換えは、以後ほぼ全てのGAN実装の既定値になりました。

「平らなところでは学べない」という感覚は、シグモイドの形を触ると一発で腑に落ちます。

FIG 1シグモイドの両端は水平に潰れている。判別器が自信満々(出力が0や1に張り付いた状態)だと、生成器に返る傾きがここで消える。非飽和損失は、この平らな端を避けるための書き換えだった

モード崩壊 — 一点だけを完璧に偽造する

勾配消失を回避しても、GANには固有の病があります。モード崩壊(mode collapse) です。

思い出してください。生成器の目的は「鑑定士を騙すこと」であって、「データの多様性を再現すること」ではありません。もし手書き数字のうち「1」だけが極端に上手く描けたなら、生成器にとっての最適戦略は入力の乱数が何であろうと「1」を出し続けることです。目的関数は満足しています。多様性を要求する項が、どこにも書かれていないからです。

これは目的関数の構造から必然的に出てきます。尤度ベースの生成モデルが「全部を薄く覆おうとしてぼやける」のと、ちょうど裏返しで、GANは「一部を濃く覆って、残りを捨てる」方向に倒れやすい。鮮明さと網羅性は、同じコインの裏表でした。

厄介なのは、モード崩壊が損失の数字には出てこないことです。生成器の損失も判別器の損失も、それらしい値で安定して見える。気づくには、固定した乱数から生成したサンプルを毎エポック並べて、目で見るしかありません。

WGAN — 距離の測り方を取り替える

2017年の Wasserstein GAN は、この病巣を「距離の選び方」に見ました。

Jensen-Shannonの弱点は、2つの分布が重ならないとき、値が定数になってしまうことです。定数ということは、傾きがゼロ。そして高次元の画像データは、空間全体に散らばっているのではなく薄い曲面(多様体)の上に乗っているので、学習初期の生成分布と本物の分布が重ならないのは例外ではなく普通のことです。「近づいている途中」を測れない物差しで、近づけようとしていたわけです。

代わりに持ち込まれたのが Wasserstein距離(Earth Mover距離) です。片方の分布を土の山、もう片方を掘るべき穴と見立て、土を運ぶのに必要な「量×距離」の最小値を距離とします。山と穴が離れていても、離れた分だけ値が大きくなる。重なりの有無に関わらず、常に「どれだけ遠いか」が返る。

計算はそのままでは無理なので、双対形(Kantorovich-Rubinstein双対)を使います。

W(pdata,pg)=sup⁡∥f∥L≤1  Ex∼pdata[f(x)]−Ex∼pg[f(x)]W(p_{\text{data}}, p_g) = \sup_{\lVert f \rVert_L \le 1} \; \mathbb{E}_{x \sim p_{\text{data}}}[f(x)] - \mathbb{E}_{x \sim p_g}[f(x)]
(3)

ff はスカラーを返す関数、∥f∥L≤1\lVert f \rVert_L \le 1 は「1-リプシッツ」——入力を少し動かしたとき、出力が動く量がその分以下、つまり傾きが急すぎない、という条件です。要するにこの式は、「本物には高い値、偽物には低い値を返す関数のうち、急峻すぎないものを探してきて、その差がいちばん開いたときの開き幅」を距離と呼んでいます。

実装上の変化は3点です。第一に、判別器は確率を返す分類器ではなく、スコアを返す「critic(批評家)」になります。出力のシグモイドも log⁡\log も消え、損失は単なる差の形になります。第二に、criticの傾きを抑える仕掛けが要ります。原論文は重みを一定範囲に切り詰める weight clipping を使いましたが、これは乱暴で、翌年の WGAN-GP が「入力に関する勾配のノルムが1から離れたら罰する」gradient penalty に置き換えました。その後、重み行列の最大特異値で割る spectral normalization も広く使われます。第三に、criticを生成器より多く更新するのが定石になりました(WGANでは生成器1回につきcritic 5回)。

見返りは大きく、criticの損失値が画像の品質と相関して下がるようになりました。それまでのGANでは、損失は相手の強さに依存する相対値でしかなく、数字を見ても何も分からなかったのです。

黄金期 — 顔が見分けられなくなるまで

土台が固まると、成果は一気に出ました。2015年の DCGAN が畳み込みでの安定した設計指針(プーリングの代わりにストライド畳み込み、バッチ正規化、Adamの β1\beta_1 を0.5に下げる、など)を配り、以後の実装の共通言語になります。続いて低解像度から段階的に層を足す Progressive Growing、生成器の途中に「スタイル」を注入する StyleGAN / StyleGAN2、大規模なクラス条件付けを行う BigGAN。評価指標の Inception Score と FID が整備されたのもこの時期で、「見た目で議論する」段階を抜け出しました。

なぜ拡散モデルに負けたのか

そして2021年、"Diffusion Models Beat GANs on Image Synthesis" という直截なタイトルの論文が出ます。潮目が変わった理由は、画質そのものより訓練の性質にありました。

第一に、最適化が普通の回帰に戻ったこと。 拡散モデルの学習は「加えたノイズを当てる」二乗誤差の最小化です(詳しくは拡散モデルを1から理解する)。相手のいないただの最小化なので、均衡を探す必要も、2つのネットの強さを釣り合わせる必要もありません。GANで最大の実務コストだった「学習が崩れる」が、構造的に消えました。

第二に、モードを網羅すること。 拡散モデルは尤度に近い目的関数を持つため、分布の全体を覆おうとします。GANの弱点がそのまま裏返しの強みになりました。

第三に、条件付けの素直さ。 テキストで生成を操るとき、拡散モデルは classifier-free guidance という形で「条件をどれだけ強く効かせるか」をつまみ1本にできます。GANでこれに相当する制御を作るのは、ずっと面倒でした。加えて、学習が安定していればモデルとデータを大きくした分だけ素直に良くなる。不安定な手法は、大きくするほど事故率が上がります。

一方でGANが今も明確に勝っている点が1つあります。速度です。GANは乱数を1回通すだけで画像が出ます。拡散モデルは反復が要る。この差は今も本質的です。

GANは消えたのではなく、部品になった

だからGANは死んでいません。単体の生成器としては退いた一方で、「知覚的な品質を測る損失部品」として現役です。

「本物らしさの物差しを学習させる」という2014年の発想は、生き残りました。生き残り方が、単体のアーキテクチャではなく損失関数だった、というだけです。

現場ではこう使う

誰がいつ触るか。 生成基盤そのものを作る人よりも、超解像・ボコーダ・画像変換の品質を上げる担当が敵対的損失を足す場面が圧倒的に多いです。「拡散モデルを使っているから自分には関係ない」と思っていたら、使っているVAEデコーダの訓練コードに discriminator_loss が入っていた、というのがよくある入口です。

実際に触るパラメータ。 critic と生成器の更新比(n_critic、WGAN系では5が既定)、gradient penalty の係数 λ\lambda(WGAN-GPでは10)、Adamの β1\beta_1(GANでは0.5、通常の0.9のままだと崩れやすい)、生成器と判別器で別々の学習率を使う TTUR、spectral normalization の有無、そして評価用の生成器重みの EMA(指数移動平均)。EMAは地味ですが、外すと「学習は進んでいるのに出力が毎エポック揺れる」状態になりがちです。

知らないと事故になる落とし穴。

学習率を上げたときに何が起きるかは、いちばん単純な最小化で触っておくと感覚が残ります。敵対的訓練では、これが2つ同時に、しかも互いの動きに反応しながら起きると考えてください。

FIG 2ただの1変数の最小化でも、学習率を上げると谷を飛び越えて発散する。GANはこの不安定さが2つのネットの間で増幅されるので、既定の学習率は通常より1桁小さいところから探すのが安全

面接や設計レビューで問われること。 「なぜ log⁡(1−D)\log(1-D) の最小化ではなく log⁡D\log D の最大化なのか」(序盤の勾配が飽和するから)、「JSダイバージェンスではなくWasserstein距離を使う理由は」(分布が重ならないとJSは定数になり傾きが出ないから)、「モード崩壊をどう検知するか」(損失ではなく固定乱数のサンプル系列と、多様性込みの指標で見る)。この3つは、GANの歴史そのものを1問ずつ切り出したものです。

まとめ

参考文献

  1. Generative Adversarial Networks. arXiv:1406.2661論文ページ·PDF
  2. Wasserstein GAN. arXiv:1701.07875論文ページ·PDF
  3. Diffusion Models Beat GANs on Image Synthesis. arXiv:2105.05233論文ページ·PDF

本記事は上記論文の本文にもとづいて執筆しています。数値・主張は原典を優先してください。

運営: TechAthletes · 編集方針 · 出典の付け方 · 訂正の記録

コメント

コメントにはログインが必要です