- Authors
- Name
- 1. 論文概要と歴史的意義
- 2. GANの核心アイデア
- 3. 数学的基盤
- 4. 学習アルゴリズム
- 5. GANの核心問題
- 6. GAN系譜総整理
- 7. PyTorchで実装するGAN
- 8. GAN vs Diffusion Models比較
- 9. GANの現在と未来
- 10. 結論
- References
1. 論文概要と歴史的意義
1.1 論文基本情報
"Generative Adversarial Nets" は2014年のNeurIPS(当時NIPS)で発表された論文で、Ian J. Goodfellow、Jean Pouget-Abadie、Mehdi Mirza、Bing Xu、David Warde-Farley、Sherjil Ozair、Aaron Courville、Yoshua Bengioが共同執筆した。伝説的なエピソードによれば、Goodfellowはモントリオールのバーで同僚と生成モデルについて議論している最中にこのアイデアを思いつき、その夜帰宅してコーディングしたところ、最初のプロトタイプがすぐに動作したという。
この論文の核心的アイデアは驚くほど直感的である:偽造犯(Generator)と警察(Discriminator)が互いに競争しながら、偽造犯はますます精巧な偽造品を作り、警察はますます優れた鑑別能力を身につける。 この敵対的プロセスが収束すると、偽造犯は本物と区別できない偽造品を作り出すようになる。
1.2 歴史的背景:2014年の生成モデルの状況
GANが登場する前、生成モデルの主流は以下の通りであった。
Variational Autoencoder(VAE、2013): KingmaとWellingが提案したVAEは、Encoder-Decoder構造に確率的潜在変数を導入してデータ分布を学習した。しかし、ELBO(Evidence Lower Bound)を最適化する過程で生成画像がぼやける問題があった。
Boltzmann Machine系列: Deep Boltzmann Machine、Restricted Boltzmann Machineなどはエネルギーベースモデルとして理論的に優美であったが、MCMC(Markov Chain Monte Carlo)サンプリングに依存しており、学習が遅く拡張性が限定的であった。
Autoregressiveモデル: PixelRNN(2016)のようなモデルはピクセルを一つずつ逐次的に生成する方式で、高品質サンプルを生成できたが、生成速度が極めて遅かった。
GANはこれらの限界を一挙に突破した。明示的な確率分布を定義することなく高品質サンプルを生成でき、Markov chainや逐次生成過程なしに単一のForward passでサンプルを即座に生成できた。これは生成モデル分野におけるパラダイムシフトに相当した。
1.3 影響力
GAN論文は2024年時点で約65,000回以上引用されており、その後10年間で数百種類のGAN変形が提案された。Yann LeCunはGANを「過去20年間の機械学習で最も興味深いアイデア」と絶賛した。GANは画像生成、超解像、スタイル変換、データ拡張、創薬など無数の分野に適用され、Diffusion Modelが登場するまで生成モデルの絶対的主流として君臨した。
2. GANの核心アイデア
2.1 Two-Player Game: Generator vs Discriminator
GANのフレームワークは2つのニューラルネットワークが互いに競争する構造で構成される。
Generator(G): ランダムノイズベクトル を入力として受け取り、偽データ を生成する。Generatorの目標は、Discriminatorを騙せるほど実データに類似したサンプルを作り出すことである。
Discriminator(D): 入力データが実データ分布からのものか()、それともGeneratorが作った偽物か()を判別する。出力は0から1の確率値で、1に近いほど本物と判断することを意味する。
この2つのネットワークは相反する目標を持つ:
- Generator: を最大化しようとする(偽物を本物と判別させる)
- Discriminator: 本物データには高い確率を、偽データには低い確率を割り当てようとする
2.2 直感的な比喩
GANの学習過程を美術市場に喩えると理解しやすい。
| 構成要素 | 比喩 | 役割 |
|---|---|---|
| Generator | 偽造画家 | 本物と区別できない模造品を作ることが目標 |
| Discriminator | 美術鑑定士 | 本物と偽物を区別することが目標 |
| Training Data | 本物の美術作品 | 実データ分布のサンプル |
| Noise Vector | 画家のインスピレーション | 潜在空間のランダムな点 |
初期は偽造画家の腕前が未熟なため、鑑定士が容易に偽物を見破る。しかし偽造画家は鑑定士のフィードバック(gradient)を通じて徐々に腕を上げ、鑑定士もまたより精巧な偽物に対応するために鑑別能力を高める。この競争が十分に進行すると、偽造画家は本物と区別できないレベルの作品を生み出すようになる。
2.3 Minimax Game定式化
GANの学習目標は以下のminimaxゲームとして定式化される:
このValue function の各項を分析してみよう。
第一項:
実データ に対するDiscriminatorの判断である。Discriminatorはこの値を最大化しようとするため、(本物を本物と判断)を目指す。Generatorはこの項に影響を与えない。
第二項:
Generatorが作った偽データに対するDiscriminatorの判断である。
- Discriminatorはこの値を最大化しようとする:(偽物を偽物と判断)ならば で最大
- Generatorはこの値を最小化しようとする:(偽物を本物と判断)ならば で最小
これがまさに**敵対的(Adversarial)**という名前の由来である。2人のプレイヤーが同一のValue functionを巡って反対方向に最適化する。
3. 数学的基盤
3.1 最適判別器(Optimal Discriminator)
固定されたGenerator に対して、最適なDiscriminator を導出してみよう。Value functionを期待値の定義に従い積分形式に変換すると:
ここで はGeneratorが生成するデータの分布である。これを一つの積分にまとめると:
被積分関数を で微分して0とおくと:
について解くと最適判別器は:
この結果は直感的にも妥当である。あるデータポイント が本物である確率が で偽物である確率が ならば、最適な判別はBayesの定理による事後確率と正確に一致する。
核心的観察: 、すなわちGeneratorが実データ分布を完全に学習した場合、すべての に対して 。Discriminatorは本物と偽物を全く区別できなくなる。
3.2 Jensen-Shannon Divergenceとの関係
最適判別器 をValue functionに代入すると:
これを整理すると:
ここで はJensen-Shannon Divergenceで、以下のように定義される:
JSDはKL Divergenceの対称化バージョンであり、常に の範囲にある。 となるのは の場合、すなわち2つの分布が完全に同一の場合のみである。
3.3 Global Optimalityの証明
定理(Goodfellow et al., 2014): のglobal minimumは のとき、かつそのときに限り達成され、このとき である。
証明:
(1)
(2) (JSDの非負性)
(3)
(4) したがって であり、等号条件は
これはGAN学習の理論的保証を提供する。十分な容量を持つGeneratorとDiscriminatorが与えられれば、minimaxゲームのNash均衡においてGeneratorは実データ分布を完全に復元する。
3.4 Nash均衡
ゲーム理論的観点から、GANの学習は2人のプレイヤー間のNash均衡を見つける問題である。Nash均衡とは、相手のプレイヤーの戦略が固定された状態で自分の戦略を変更してもこれ以上利益がない状態を意味する。
GANにおけるNash均衡は:
- : を達成するGenerator
- : すべての に対して を出力するDiscriminator
理論的にはこの均衡点は存在し唯一であるが、実際の学習でこれを見つけることは非常に困難である。2つのネットワークを同時に最適化する必要がある非凸ゲームだからである。これがGAN学習の根本的な困難であり、以降の数多くの後続研究の出発点となった。
3.5 KL Divergence vs JS Divergence
なぜJSDなのか?KL Divergenceと比較してみよう。
KL Divergenceの問題点:
KL Divergenceは非対称的であり、 だが の領域で無限大に発散する。これは学習初期にGeneratorの分布が実分布を十分にカバーしていない場合に問題となる。
JS Divergenceの利点:
- 対称的:
- 常に有限:
- 2つの分布の混合分布 を基準にKLを計算するため、一方の分布が0でも発散しない
しかしJSDも完璧ではない。2つの分布のサポートが重ならない場合、JSDは定数 となり勾配が0になる。これがGAN学習における勾配消失問題の根本原因であり、WGANがWasserstein距離を導入した核心的動機である。
4. 学習アルゴリズム
4.1 学習手順
原論文で提案された学習アルゴリズムは以下の通りである:
Algorithm 1: GAN Training (Goodfellow et al., 2014)
for 学習イテレーション回数 do
# --- Step 1: Discriminatorの更新(k steps) ---
for k steps do
- ノイズ事前分布 p_z(z) からm個のノイズサンプル {z^(1), ..., z^(m)} を抽出
- データ分布 p_data(x) からm個の実サンプル {x^(1), ..., x^(m)} を抽出
- Discriminatorのパラメータを確率的勾配上昇法で更新:
nabla_{theta_d} (1/m) sum_{i=1}^{m} [log D(x^(i)) + log(1 - D(G(z^(i))))]
end for
# --- Step 2: Generatorの更新(1 step) ---
- ノイズ事前分布 p_z(z) からm個のノイズサンプル {z^(1), ..., z^(m)} を抽出
- Generatorのパラメータを確率的勾配降下法で更新:
nabla_{theta_g} (1/m) sum_{i=1}^{m} log(1 - D(G(z^(i))))
end for
4.2 交互最適化
核心は**交互最適化(Alternating Optimization)**である。DiscriminatorとGeneratorを交互に更新する。
Discriminatorをk回更新した後にGeneratorを1回更新する理由:
理論的には、最適判別器 を求めた後にGeneratorを更新しなければ正しい勾配方向が得られない。実際に を完全に最適化することは不可能であるため、 回の勾配ステップで近似する。原論文では をデフォルト値として使用した。
バランス維持の重要性:
- Discriminatorが強くなりすぎると: Generatorの勾配が消失して学習が停止する
- Discriminatorが弱すぎると: Generatorに有用な学習シグナルを提供できない
- 理想的にはDiscriminatorとGeneratorが同程度のレベルで共に発展すべきである
4.3 Non-Saturating Loss(実践的修正)
理論的なminimax目的関数ではGeneratorの目標は を最小化することである。しかし学習初期にGeneratorが非常に劣る場合、 であるため となり、勾配がほぼ0になる。
Goodfellowはこの問題を解決するため、Generatorの目的関数を以下のように修正した:
元々(Minimax):
修正(Non-Saturating):
両目的関数は同一の不動点(Nash均衡)を持つが、学習初期の勾配の大きさが大きく異なる。Non-saturating lossは が小さい場合でも強い勾配を提供し、Generatorが迅速に学習できるようにする。
4.4 原論文の実験結果
原論文ではMNIST、Toronto Face Database(TFD)、CIFAR-10データセットで実験を行った。Parzenウィンドウベースの対数尤度推定を用いて評価し、GANが既存のDeep Boltzmann MachineやStacked Denoising Autoencoderと比較して競争力のある性能を示した。
しかし原論文の結果は今日の基準で見ると非常に単純なレベルであった。GeneratorとDiscriminatorの両方が単純なMLP(Multi-Layer Perceptron)を使用しており、生成画像の解像度と品質は限定的であった。真のブレイクスルーは以降のアーキテクチャ改善と学習技法の発展を通じて実現された。
5. GANの核心問題
5.1 Mode Collapse
GANの最も悪名高い問題はMode Collapse(モード崩壊)である。これはGeneratorがデータ分布の全モード(多様なパターン)を学習できず、特定の少数のモードにのみ集中して類似した出力を繰り返し生成する現象である。
発生メカニズム:
GeneratorがDiscriminatorを騙すのに特に効果的な少数のパターンを発見すると、他の多様なパターンを探索する代わりにそのパターンのみを繰り返し生成するようになる。例えば、MNISTで学習する際にGeneratorが数字の「1」のみを完璧に生成し、残りの数字は全く生成しない状況である。
数学的解釈:
Mode collapseはminimaxの代わりにmaximinゲームへの転換と関連がある:
理論的minimaxではGeneratorはすべての可能なDiscriminatorに備える必要があるため、分布全体をカバーしなければならない。しかし実際の学習ではGeneratorは現在のDiscriminatorだけを騙せばよいため、特定のモードに集中することが「合理的」な戦略となりうる。
5.2 学習の不安定性
GAN学習は本質的に**非協力ゲーム(non-cooperative game)**のNash均衡を見つける問題である。これは単純な最適化問題よりもはるかに困難である。
振動問題: GeneratorとDiscriminatorが収束せず互いの周りを振動(oscillate)する現象が頻繁に発生する。通常のloss landscapeでは勾配降下法がlocal minimumを見つけるが、minimaxゲームでの勾配降下法は鞍点(saddle point)の周りを周回しうる。
学習バランスの困難: Discriminatorの収束が早すぎるとGeneratorが学習できず、逆にDiscriminatorが弱すぎるとGeneratorに有意義な学習シグナルを伝達できない。この微妙なバランスを維持することが実務でのGAN学習の最大の課題であった。
5.3 勾配消失
3.5節で説明したように、JS Divergenceは2つの分布のサポートが重ならない場合に定数 となり、勾配が0になる。
高次元データ(例:画像)では、実データ分布とGeneratorの分布は高次元空間の低次元多様体上に存在する。これら2つの多様体が重なる確率は非常に低いため、学習初期に2つの分布のサポートがほとんど重ならないのが一般的である。この状況でJSDベースのGANは有用な勾配を全く提供できない。
5.4 評価の困難
GANの性能を客観的に評価すること自体も非常に困難な問題である。主要な評価指標は以下の通りである:
Inception Score(IS): 生成画像の品質(鮮明さ)と多様性を測定する。事前学習済みInceptionネットワークを使用し、個別画像のクラス予測が確実(品質)でありながら全体として多様なクラスに分布(多様性)していれば高スコアとなる。
Frechet Inception Distance(FID): 実データと生成データのInception特徴分布間のFrechet距離を測定する。低いほど良い。ISよりも信頼性の高い指標として広く使用されている。
ここで と はそれぞれ実画像と生成画像のInception特徴に対する平均と共分散である。
6. GAN系譜総整理
6.1 DCGAN(2015):CNN基盤の安定学習の始まり
Radford, Metz, Chintala. "Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks" (2015)
元のGANはMLP(Fully Connected Layer)のみで構成されていたため、画像生成においてCNNの強力な空間的特徴抽出能力を活用できなかった。**DCGAN(Deep Convolutional GAN)**は、CNNをGANに成功裏に統合した最初のアーキテクチャであり、安定した学習のためのアーキテクチャガイドラインを提示した。
DCGANの核心アーキテクチャルール:
- Poolingレイヤー除去: Max poolingの代わりにstrided convolution(Discriminator)とtransposed convolution(Generator)を使用
- Batch Normalization適用: GeneratorとDiscriminatorの両方に適用するが、Generatorの出力レイヤーとDiscriminatorの入力レイヤーには適用しない
- Fully Connectedレイヤー除去: Global average poolingまたは直接的なconvolution接続を使用
- 活性化関数: Generatorは出力レイヤーにTanh、残りはReLU。DiscriminatorはすべてのレイヤーにLeakyReLUを使用
DCGAN Generator構造(概念的):
z (100-dim) -> FC -> Reshape (4x4x1024) -> ConvT -> BN -> ReLU (8x8x512)
-> ConvT -> BN -> ReLU (16x16x256) -> ConvT -> BN -> ReLU (32x32x128)
-> ConvT -> Tanh (64x64x3)
DCGANは単に良い画像を生成するだけでなく、学習された潜在空間(latent space)が意味のある構造を持つことを示した。有名な例として、潜在空間でのベクトル演算が意味論的変換に対応することを実証した:
6.2 WGAN(2017):Wasserstein距離の導入
Arjovsky, Chintala, Bottou. "Wasserstein GAN" (2017)
WGANはGAN理論の最も重要な進展の一つであり、JS Divergenceの根本的限界を解決するために**Wasserstein距離(Earth Mover's距離)**を導入した。
Wasserstein Distance(EM Distance):
ここで は と を周辺分布として持つすべての結合分布の集合である。直感的には、一方の分布を他方に変換するために「土を移動させる」最小コストである。
Wasserstein距離の核心的利点:
JSDとは異なり、2つの分布のサポートが重ならなくても連続的で微分可能な距離を提供する。例えば、2つの点分布 と ()を考えると:
Kantorovich-Rubinstein双対性:
Wasserstein距離を直接計算することはintractableであるため、Kantorovich-Rubinstein双対性を活用する:
ここでsupremumは全1-Lipschitz関数に対してとる。WGANはDiscriminator(ここではCriticと呼ぶ)がこの1-Lipschitz関数を近似するよう学習する。
Weight Clipping: 元のWGANはLipschitz制約を強制するためにcriticの重みを の範囲にクリッピングした。しかしこれはcriticの表現力を深刻に制限し、学習の不安定性を引き起こす可能性があった。
6.3 WGAN-GP(2017):Gradient Penalty
Gulrajani, Ahmed, Arjovsky, Dumoulin, Courville. "Improved Training of Wasserstein GANs" (2017)
Weight clippingの問題を解決するため、**Gradient Penalty(GP)**方式が提案された。Lipschitz制約を直接強制する代わりに、criticの勾配ノルムが1に近づくよう正則化する。
ここで は実データと生成データの間のランダム補間である:
WGAN-GPは 、critic更新回数 をデフォルト値として使用し、ほぼハイパーパラメータチューニングなしで多様なアーキテクチャで安定的に学習される。
6.4 Progressive GAN(2017):段階的解像度増加
Karras, Aila, Laine, Lehtinen. "Progressive Growing of GANs for Improved Quality, Stability, and Variation" (2017)
**Progressive GAN(ProGAN)**はNVIDIA研究チームが提案したアーキテクチャで、高解像度画像生成の新たな地平を開いた。核心アイデアは、GeneratorとDiscriminatorを低解像度から開始して段階的にレイヤーを追加しながら解像度を高めることである。
学習過程:
Phase 1: 4x4解像度でGとDを学習
Phase 2: 8x8レイヤー追加、fade-inによる段階的移行
Phase 3: 16x16レイヤー追加
...
Phase N: 1024x1024最終解像度に到達
Fade-inメカニズム: 新しいレイヤーを追加する際、既存レイヤーの出力と新レイヤーの出力を加重平均で結合する。重み が0から1に徐々に増加しながら新レイヤーが段階的に活性化される。
核心的貢献:
- 学習安定性の大幅向上: 低解像度で大まかな構造をまず学習し、徐々に細かいディテールを追加するため学習がはるかに安定的
- 1024x1024解像度の達成: CelebA-HQデータセットで1024x1024解像度のフォトリアリスティックな顔画像生成に初めて成功
- Minibatch標準偏差: 多様性を高めるためにminibatch内の統計を活用する技法を導入
6.5 StyleGANシリーズ(2019-2021):スタイルベース生成の精髄
StyleGAN(2019)
Karras, Laine, Aila. "A Style-Based Generator Architecture for Generative Adversarial Networks" (2019)
StyleGANはProgressive GANの段階的学習とNeural Style Transferのスタイル分離概念を組み合わせた革命的アーキテクチャである。
核心的な構造変更:
Mapping Network: 入力潜在ベクトル を非線形マッピングネットワーク を通じて中間潜在空間 に変換する。8層のFCレイヤーで構成される。
Adaptive Instance Normalization(AdaIN): 空間のスタイルベクトル を各convolutionレイヤーに注入する。
ここで と はスタイルベクトル から学習されたaffine変換によって得られるscaleとbiasである。
Constant Input: Generatorの入力として学習可能な定数テンソル(4x4x512)を使用する。スタイルはAdaINを通じてのみ注入される。
Noise Injection: 各convolutionレイヤーの後にper-pixelノイズを追加して確率的変動(例:髪の位置、毛穴など)を制御する。
スタイル階層構造:
| 解像度レイヤー | 制御する特性 |
|---|---|
| (Coarse) | ポーズ、顔の形状、眼鏡の有無 |
| (Middle) | 顔の特徴、ヘアスタイル、目の開閉 |
| (Fine) | 色彩、微細構造、背景ディテール |
StyleGAN2(2020)
Karras, Laine, Aittala, Hellsten, Lehtinen, Aila. "Analyzing and Improving the Image Quality of StyleGAN" (2020)
StyleGAN2はStyleGANの複数のアーティファクトを解決し、画像品質を大幅に改善した。
主要な改善事項:
- Weight Demodulation: AdaINを置き換えてblobアーティファクトを除去。AdaINのinstance normalizationが特徴マップ内の相対的なスケール情報を破壊する問題を解決
- Progressive Growingの除去: Skip connectionとresidual connectionを使用してprogressive growingなしでも安定した高解像度学習を達成
- Path Length Regularization: 潜在空間の滑らかさを改善し、潜在ベクトルの小さな変化が画像で比例的な変化を生むよう誘導
- Lazy Regularization: 正則化を毎ステップではなく16ステップごとに適用して効率性を向上
StyleGAN2-ADA: 限定されたデータでも過適合なしに学習できるよう**適応的判別器拡張(Adaptive Discriminator Augmentation)**を導入。数千枚規模の小規模データセットでも高品質生成が可能になった。
StyleGAN3(2021)
Karras, Aittala, Laine, et al. "Alias-Free Generative Adversarial Networks" (2021)
StyleGAN3は根本的な信号処理問題を解決した。
問題: StyleGAN2で生成された画像の細かいディテールが画像座標に「張り付いている」ような現象。カメラが動くべきときにテクスチャがオブジェクトと一緒に動かず元の位置に留まるaliasingの問題。
解決: ネットワーク内のすべての信号を連続ドメインで処理するよう再設計し、離散サンプリングで発生するaliasingを根本的に遮断。
核心的変更:
- Fourier特徴ベースの入力に置き換え
- 連続的等変(equivariant)演算の保証
- 平行移動(translation)と回転(rotation)に対する完全な等変性を達成
- FIDはStyleGAN2と同等でありながら、内部表現が根本的に異なる
StyleGAN3はビデオ生成とアニメーションにより適した基盤を築いた。
6.6 Conditional GAN、Pix2Pix、CycleGAN
Conditional GAN(cGAN、2014)
Mirza, Osindero. "Conditional Generative Adversarial Nets" (2014)
元のGANは生成されるデータを制御できない。Conditional GANはGeneratorとDiscriminatorの両方に追加の条件情報 (例:クラスラベル)を入力として提供し、望ましい特性のデータを条件付きで生成できるようにする。
Pix2Pix(2017)
Isola, Zhu, Zhou, Efros. "Image-to-Image Translation with Conditional Adversarial Networks" (2017)
Pix2Pixはペア画像データを使用したImage-to-Image翻訳フレームワークである。白黒写真のカラー化、衛星画像から地図への変換、スケッチから写真への変換など、多様なタスクを統一フレームワークで解決した。
核心構成:
- U-Net Generator: Encoder-Decoder構造にskip connectionを追加
- PatchGAN Discriminator: 画像全体ではなく パッチ単位で真偽を判別
- L1 Reconstruction Loss + Adversarial Loss: 構造的類似性とリアリズムを同時に追求
CycleGAN(2017)
Zhu, Park, Isola, Efros. "Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks" (2017)
Pix2Pixにはペアデータが必要という大きな制約があった。CycleGANはペアなしデータのみで2つのドメイン間の変換を学習する。
核心アイデア:Cycle Consistency Loss
2つのGenerator と 、2つのDiscriminator , を学習する。
ドメイン の画像を に変換した後再び に変換すると元の画像に復元されるべきという制約である。これによりペアデータなしでも意味のあるマッピングを学習できる。
応用分野: 馬をシマウマに変換、夏の風景を冬に変換、写真をモネスタイルに変換など。
6.7 BigGAN(2018):スケールの力
Brock, Donahue, Simonyan. "Large Scale GAN Training for High Fidelity Natural Image Synthesis" (2018)
BigGANは「GAN学習においてスケールが重要である」ことを劇的に証明した研究である。従来比2〜4倍のパラメータと8倍のバッチサイズで学習した。
核心技法:
- Class-Conditional Batch Normalization: クラス埋め込みを共有して各Batch Normalizationレイヤーのscaleとbiasを調整
- Truncation Trick: 推論時に潜在ベクトル の分布をtruncationして品質と多様性のトレードオフを制御
- Orthogonal Regularization: Generatorの重みに直交正則化を適用して学習安定性を確保
成果: ImageNet 128x128でIS 166.5、FID 7.4を達成。以前の最高記録(IS 52.52、FID 18.6)を大幅に上回った。
6.8 GigaGAN(2023):GANの復活?
Kang, Zhu, et al. "Scaling up GANs for Text-to-Image Synthesis" (2023)
Diffusion Modelが画像生成を支配していた時点で、GigaGANは1Bパラメータ規模のText-to-Image GANとしてGANのポテンシャルを再証明した。
核心的イノベーション:
- Adaptive Kernel Selection: 各画像ごとに異なるconvolutionフィルターを生成。フィルターバンクからスタイルベクトルによるconvex combinationで決定
- Stable Attention: L2距離ベースのattentionスコア計算でLipschitz連続性を保証し、attention重み行列をunit varianceに正規化
- Query-Key Tying: QueryとKey行列を共有して安定性を確保
- CLIP Text Encoder: 事前学習済みCLIPモデルでテキスト埋め込みを抽出
成果と意義:
- FIDでStable Diffusion v1.5、DALL-E 2、Parti-750Mを上回る
- 512px画像生成に0.13秒: Diffusion model比数十〜数百倍高速な推論速度
- GANが大規模text-to-image合成でも競争力を持つことを証明
7. PyTorchで実装するGAN
7.1 基本GAN実装(MNIST)
以下はPyTorchでMNISTデータセットに対する最も基本的なGANを実装したコードである。
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
# ============================================================
# ハイパーパラメータ設定
# ============================================================
LATENT_DIM = 100 # 潜在ベクトル次元(zの次元)
IMG_DIM = 28 * 28 # MNISTイメージをflattenした次元
HIDDEN_DIM = 256 # Hiddenレイヤー次元
BATCH_SIZE = 64
EPOCHS = 200
LR = 0.0002
BETAS = (0.5, 0.999) # Adam optimizerのbetaパラメータ
DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# ============================================================
# Generator定義
# ============================================================
class Generator(nn.Module):
"""
潜在ベクトルzを入力として受け取り偽画像を生成する。
構造: z(100) -> 256 -> 512 -> 1024 -> 784(28x28)
"""
def __init__(self, latent_dim: int, img_dim: int, hidden_dim: int):
super().__init__()
self.net = nn.Sequential(
nn.Linear(latent_dim, hidden_dim),
nn.LeakyReLU(0.2),
nn.Linear(hidden_dim, hidden_dim * 2),
nn.LeakyReLU(0.2),
nn.Linear(hidden_dim * 2, hidden_dim * 4),
nn.LeakyReLU(0.2),
nn.Linear(hidden_dim * 4, img_dim),
nn.Tanh(), # 出力を[-1, 1]範囲に正規化
)
def forward(self, z: torch.Tensor) -> torch.Tensor:
return self.net(z)
# ============================================================
# Discriminator定義
# ============================================================
class Discriminator(nn.Module):
"""
画像を入力として受け取り本物/偽物の確率を出力する。
構造: 784(28x28) -> 1024 -> 512 -> 256 -> 1
"""
def __init__(self, img_dim: int, hidden_dim: int):
super().__init__()
self.net = nn.Sequential(
nn.Linear(img_dim, hidden_dim * 4),
nn.LeakyReLU(0.2),
nn.Dropout(0.3),
nn.Linear(hidden_dim * 4, hidden_dim * 2),
nn.LeakyReLU(0.2),
nn.Dropout(0.3),
nn.Linear(hidden_dim * 2, hidden_dim),
nn.LeakyReLU(0.2),
nn.Dropout(0.3),
nn.Linear(hidden_dim, 1),
nn.Sigmoid(), # 出力を[0, 1]の確率に変換
)
def forward(self, x: torch.Tensor) -> torch.Tensor:
return self.net(x)
# ============================================================
# データローダー設定
# ============================================================
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,)), # [0,1] -> [-1,1]
])
dataset = datasets.MNIST(root="./data", train=True, transform=transform, download=True)
dataloader = DataLoader(dataset, batch_size=BATCH_SIZE, shuffle=True, drop_last=True)
# ============================================================
# モデル、オプティマイザ、損失関数の初期化
# ============================================================
G = Generator(LATENT_DIM, IMG_DIM, HIDDEN_DIM).to(DEVICE)
D = Discriminator(IMG_DIM, HIDDEN_DIM).to(DEVICE)
opt_G = optim.Adam(G.parameters(), lr=LR, betas=BETAS)
opt_D = optim.Adam(D.parameters(), lr=LR, betas=BETAS)
criterion = nn.BCELoss() # Binary Cross Entropy
# ============================================================
# 学習ループ
# ============================================================
for epoch in range(EPOCHS):
d_loss_total, g_loss_total = 0.0, 0.0
for batch_idx, (real_imgs, _) in enumerate(dataloader):
real_imgs = real_imgs.view(-1, IMG_DIM).to(DEVICE)
batch_size = real_imgs.size(0)
# 本物/偽物ラベル
real_labels = torch.ones(batch_size, 1, device=DEVICE)
fake_labels = torch.zeros(batch_size, 1, device=DEVICE)
# -----------------------------------------
# Step 1: Discriminator学習
# -----------------------------------------
# 本物画像の判別
d_real = D(real_imgs)
d_loss_real = criterion(d_real, real_labels)
# 偽画像の生成と判別
z = torch.randn(batch_size, LATENT_DIM, device=DEVICE)
fake_imgs = G(z).detach() # Generatorの勾配を遮断
d_fake = D(fake_imgs)
d_loss_fake = criterion(d_fake, fake_labels)
# Discriminator総損失と更新
d_loss = d_loss_real + d_loss_fake
opt_D.zero_grad()
d_loss.backward()
opt_D.step()
# -----------------------------------------
# Step 2: Generator学習
# -----------------------------------------
z = torch.randn(batch_size, LATENT_DIM, device=DEVICE)
fake_imgs = G(z)
d_fake = D(fake_imgs)
# Non-saturating loss: GeneratorはD(G(z))を高めようとする
g_loss = criterion(d_fake, real_labels)
opt_G.zero_grad()
g_loss.backward()
opt_G.step()
d_loss_total += d_loss.item()
g_loss_total += g_loss.item()
# エポックごとのログ出力
num_batches = len(dataloader)
print(
f"Epoch [{epoch+1}/{EPOCHS}] "
f"D Loss: {d_loss_total/num_batches:.4f} | "
f"G Loss: {g_loss_total/num_batches:.4f}"
)
7.2 DCGAN実装(核心部分)
GeneratorとDiscriminatorをConvolutional構造に変更したバージョンである。
class DCGANGenerator(nn.Module):
"""
DCGAN Generator: Transposed Convolutionで画像を生成する。
z(100) -> 4x4x512 -> 8x8x256 -> 16x16x128 -> 32x32x64 -> 64x64x3
"""
def __init__(self, latent_dim: int = 100, feature_map_size: int = 64, channels: int = 3):
super().__init__()
self.net = nn.Sequential(
nn.ConvTranspose2d(latent_dim, feature_map_size * 8, 4, 1, 0, bias=False),
nn.BatchNorm2d(feature_map_size * 8),
nn.ReLU(inplace=True),
nn.ConvTranspose2d(feature_map_size * 8, feature_map_size * 4, 4, 2, 1, bias=False),
nn.BatchNorm2d(feature_map_size * 4),
nn.ReLU(inplace=True),
nn.ConvTranspose2d(feature_map_size * 4, feature_map_size * 2, 4, 2, 1, bias=False),
nn.BatchNorm2d(feature_map_size * 2),
nn.ReLU(inplace=True),
nn.ConvTranspose2d(feature_map_size * 2, feature_map_size, 4, 2, 1, bias=False),
nn.BatchNorm2d(feature_map_size),
nn.ReLU(inplace=True),
nn.ConvTranspose2d(feature_map_size, channels, 4, 2, 1, bias=False),
nn.Tanh(),
)
def forward(self, z: torch.Tensor) -> torch.Tensor:
return self.net(z)
class DCGANDiscriminator(nn.Module):
"""
DCGAN Discriminator: Strided Convolutionで真偽を判別する。
(3 x 64 x 64) -> (64 x 32 x 32) -> (128 x 16 x 16) ->
(256 x 8 x 8) -> (512 x 4 x 4) -> 1
"""
def __init__(self, feature_map_size: int = 64, channels: int = 3):
super().__init__()
self.net = nn.Sequential(
nn.Conv2d(channels, feature_map_size, 4, 2, 1, bias=False),
nn.LeakyReLU(0.2, inplace=True),
nn.Conv2d(feature_map_size, feature_map_size * 2, 4, 2, 1, bias=False),
nn.BatchNorm2d(feature_map_size * 2),
nn.LeakyReLU(0.2, inplace=True),
nn.Conv2d(feature_map_size * 2, feature_map_size * 4, 4, 2, 1, bias=False),
nn.BatchNorm2d(feature_map_size * 4),
nn.LeakyReLU(0.2, inplace=True),
nn.Conv2d(feature_map_size * 4, feature_map_size * 8, 4, 2, 1, bias=False),
nn.BatchNorm2d(feature_map_size * 8),
nn.LeakyReLU(0.2, inplace=True),
nn.Conv2d(feature_map_size * 8, 1, 4, 1, 0, bias=False),
nn.Sigmoid(),
)
def forward(self, x: torch.Tensor) -> torch.Tensor:
return self.net(x).view(-1, 1)
7.3 WGAN-GP核心Loss実装
def compute_gradient_penalty(
discriminator: nn.Module,
real_samples: torch.Tensor,
fake_samples: torch.Tensor,
device: torch.device,
lambda_gp: float = 10.0,
) -> torch.Tensor:
"""
WGAN-GPのGradient Penaltyを計算する。
実データと生成データの間のランダム補間点において
Discriminator(Critic)の勾配のL2ノルムが1になるようペナルティを課す。
"""
batch_size = real_samples.size(0)
epsilon = torch.rand(batch_size, 1, 1, 1, device=device)
interpolated = (epsilon * real_samples + (1 - epsilon) * fake_samples).requires_grad_(True)
d_interpolated = discriminator(interpolated)
gradients = torch.autograd.grad(
outputs=d_interpolated,
inputs=interpolated,
grad_outputs=torch.ones_like(d_interpolated),
create_graph=True,
retain_graph=True,
)[0]
gradients = gradients.view(batch_size, -1)
gradient_norm = gradients.norm(2, dim=1)
gradient_penalty = lambda_gp * ((gradient_norm - 1) ** 2).mean()
return gradient_penalty
# WGAN-GP学習ループ(核心部分)
def train_wgan_gp_step(
G: nn.Module,
D: nn.Module,
opt_G: optim.Optimizer,
opt_D: optim.Optimizer,
real_imgs: torch.Tensor,
latent_dim: int,
device: torch.device,
n_critic: int = 5,
):
"""WGAN-GPの1イテレーション学習。"""
batch_size = real_imgs.size(0)
# --- Critic(Discriminator)学習:n_critic回 ---
for _ in range(n_critic):
z = torch.randn(batch_size, latent_dim, 1, 1, device=device)
fake_imgs = G(z).detach()
d_real = D(real_imgs).mean()
d_fake = D(fake_imgs).mean()
gp = compute_gradient_penalty(D, real_imgs, fake_imgs, device)
d_loss = d_fake - d_real + gp
opt_D.zero_grad()
d_loss.backward()
opt_D.step()
# --- Generator学習:1回 ---
z = torch.randn(batch_size, latent_dim, 1, 1, device=device)
fake_imgs = G(z)
g_loss = -D(fake_imgs).mean()
opt_G.zero_grad()
g_loss.backward()
opt_G.step()
return d_loss.item(), g_loss.item()
8. GAN vs Diffusion Models比較
2020年代に入り、Diffusion Models(DDPM、Score-basedモデル)が画像生成の新パラダイムとして台頭した。2021年のDhariwalとNicholの論文「Diffusion Models Beat GANs on Image Synthesis」の発表以降、Diffusion ModelはDALL-E 2、Stable Diffusion、Midjourneyなどを通じて生成モデルの主流となった。GANとDiffusion Modelを体系的に比較してみよう。
8.1 基本原理の比較
| 側面 | GAN | Diffusion Model |
|---|---|---|
| 学習方式 | Adversarial Training(minimaxゲーム) | Denoising Score Matching |
| 生成過程 | 単一Forward pass | 反復的Denoising(数十〜数百ステップ) |
| 確率モデル | 暗黙的(implicit) | 明示的(explicit) |
| 損失関数 | Adversarial loss(+ 補助loss) | 単純なMSE/L1(noise prediction) |
| 理論的分布 | via JSD/Wasserstein | via ELBO |
8.2 強みと弱みの比較
GANの強み:
- 推論速度: 単一Forward passで画像生成。リアルタイムアプリケーションに適合
- サンプル鮮明度: 敵対的学習により鮮明でリアリスティックな画像を生成する傾向
- 潜在空間制御: 構造化された潜在空間を通じた意味論的操作が可能
- 軽量性: 比較的少ないパラメータでも高品質生成が可能
GANの弱み:
- 学習の不安定性: Mode collapse、training oscillationなど
- 多様性不足: Mode collapseにより生成の多様性が制限される可能性
- 拡張性の限界: テキスト条件付き生成などでDiffusion modelほど自然に拡張されない
- 評価の困難: 学習進行状況を信頼できる指標でモニタリングしにくい
Diffusion Modelの強み:
- 学習安定性: 単純なMSE lossで安定した学習
- サンプル多様性: Mode collapse問題がほぼない
- テキスト条件付き生成: Classifier-free guidanceなどによる自然な条件付き生成
- 理論的堅牢性: 明示的確率モデルとしてlikelihood計算が可能
Diffusion Modelの弱み:
- 推論速度: 数十〜数百回の反復的denoisingが必要で遅い(最近distillationなどで改善中)
- 計算コスト: 学習と推論の両方で高い計算資源が必要
- メモリ使用量: 高解像度生成時にU-Netの大規模パラメータが必要
8.3 収束特性の比較
| 特性 | GAN | Diffusion Model |
|---|---|---|
| 収束保証 | Nash均衡は理論的にのみ保証 | ELBO最適化で安定的な収束 |
| Mode Coverage | Mode collapseのリスク | 優れたmode coverage |
| 学習曲線 | 不安定、解釈困難 | 安定的、lossを直接解釈可能 |
| ハイパーパラメータ感度 | 高い | 比較的低い |
8.4 2025年現在の状況
2025年現在、Diffusion Modelが画像生成の主流である。Stable Diffusion、DALL-E 3、Midjourneyなど、商業的に最も成功した画像生成モデルはすべてDiffusionベースである。
しかしGANは完全に置き換えられたわけではない。特に以下の領域でGANは依然として強さを見せている:
- リアルタイム生成が必要な領域: ビデオゲーム、VR/ARなど
- 画像編集/操作: StyleGANベースの精密な顔編集、属性操作
- Super-Resolution: リアルタイム超解像処理
- GAN-Diffusionハイブリッド: DiffusionプロセスにGAN lossを結合したり、GANの高速推論をDiffusion modelのdistillationに活用
GigaGAN(2023)の登場はGANが大規模text-to-image合成でも競争力を持ちうることを示し、両パラダイムの利点を結合する研究が活発に進行中である。
9. GANの現在と未来
9.1 GANの現在の位相
GANは2014年の発表以降約10年間生成モデルの中心にあったが、2021年以降Diffusion Modelに主流の座を譲った。しかしGANの遺産と現在の役割は依然として重要である。
現在GANが活発に使用されている分野:
- 医療画像: 患者のプライバシーを保護しながら学習データを拡張するのにGANが広く使用される
- データ拡張: 小規模データセットの学習データを拡張してモデル性能を改善
- 映像編集と復元: 顔復元、ノイズ除去、超解像など
- ファッションとデザイン: バーチャル試着、デザインプロトタイピング
- ゲームとシミュレーション: リアルタイムコンテンツ生成、テクスチャ合成
9.2 GANが残した理論的遺産
GANの最大の貢献は単なる画像生成技術に留まらない。
Adversarial Trainingパラダイム: GANが導入した敵対的学習は生成モデルを超えて多様な分野に影響を与えた。
- Adversarial Examples: 深層学習モデルのrobustness研究
- Domain Adaptation: Adversarial trainingを活用したドメイン間の知識移転
- Self-supervised Learning: Adversarialシグナルを活用した自己教師あり学習
- Inverse Reinforcement Learning: 報酬関数をadversarialに学習
Implicit Generative Models: 明示的な確率分布を定義せずとも複雑な分布を学習できるというGANの核心的洞察は、以降のEnergy-based Models、Score-based Modelsなどの発展にも影響を与えた。
9.3 将来展望
GAN-Diffusion融合: 最も有望な方向の一つはGANとDiffusion Modelの利点を結合することである。Diffusion過程のdenoisingステップをGANで置き換えて推論速度を向上させる研究が進行中である。
3D生成: GANを3D表現(Neural Radiance Fields、3D Gaussian Splattingなど)と結合して3Dコンテンツを生成する研究が活発である。EG3D、GET3Dなどが代表的である。
ビデオ生成: StyleGAN3の等変特性はビデオ生成に自然に適用でき、時間的一貫性を持つビデオ生成研究が進行中である。
効率的学習: Few-shot GAN、GANの転移学習(Transfer Learning)などを通じて少ないデータでも高品質生成モデルを学習する研究が続いている。
9.4 GAN論文系譜タイムライン要約
| 年 | モデル | 核心的貢献 | 解像度 |
|---|---|---|---|
| 2014 | GAN | Adversarial trainingフレームワーク | Low |
| 2014 | cGAN | 条件付き生成 | Low |
| 2015 | DCGAN | CNN基盤アーキテクチャガイドライン | 64x64 |
| 2017 | WGAN | Wasserstein距離 | 64x64 |
| 2017 | WGAN-GP | Gradient penalty | 64x64 |
| 2017 | Pix2Pix | ペアimage-to-image変換 | 256x256 |
| 2017 | CycleGAN | ペアなしimage-to-image変換 | 256x256 |
| 2017 | ProGAN | Progressive growing | 1024x1024 |
| 2018 | BigGAN | 大規模学習、truncation trick | 512x512 |
| 2019 | StyleGAN | Mapping network、AdaIN、スタイル分離 | 1024x1024 |
| 2020 | StyleGAN2 | Weight demodulation、path regularization | 1024x1024 |
| 2021 | StyleGAN3 | Alias-free、等変生成 | 1024x1024 |
| 2023 | GigaGAN | 1Bパラメータtext-to-image GAN | 512x512+ |
10. 結論
Ian Goodfellowが2014年に提案したGANは、シンプルでありながら強力なアイデア ---「2つのネットワークの競争がより良い生成モデルを作る」--- でAI分野に革命を起こした。minimaxゲームという数学的フレームワークは優美でありながら実用的であり、以降10年間で数百の変形を生み出しながら画像生成の品質を飛躍的に向上させた。
DCGANはCNNとの結合で実用的発展の土台を築き、WGANはWasserstein距離という理論的革新で学習安定性の問題を解決した。Progressive GANとStyleGANシリーズは1024x1024解像度のフォトリアリスティックな画像生成を可能にし、CycleGANとPix2Pixは画像変換という新たな応用領域を開拓した。
2021年以降Diffusion Modelが生成モデルの主流として浮上したとはいえ、GANが残した遺産は膨大である。Adversarial trainingというパラダイムは依然として多様な分野で活用されており、GANとDiffusionの利点を結合するハイブリッド研究が活発に進行中である。GigaGANの登場が示すように、GANの物語はまだ終わっていない。
生成モデルの歴史において、GANは「人工知能が真に創作できる」という可能性を初めて示したマイルストーンとして記憶されるだろう。
References
Goodfellow, I. J. et al. (2014). "Generative Adversarial Nets." NeurIPS 2014. arXiv:1406.2661
Mirza, M. & Osindero, S. (2014). "Conditional Generative Adversarial Nets." arXiv:1411.1784
Radford, A., Metz, L. & Chintala, S. (2015). "Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks." arXiv:1511.06434
Arjovsky, M., Chintala, S. & Bottou, L. (2017). "Wasserstein GAN." arXiv:1701.07875
Gulrajani, I. et al. (2017). "Improved Training of Wasserstein GANs." arXiv:1704.00028
Isola, P. et al. (2017). "Image-to-Image Translation with Conditional Adversarial Networks." CVPR 2017. arXiv:1611.07004
Zhu, J.-Y. et al. (2017). "Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks." ICCV 2017. arXiv:1703.10593
Karras, T. et al. (2017). "Progressive Growing of GANs for Improved Quality, Stability, and Variation." ICLR 2018. arXiv:1710.10196
Brock, A., Donahue, J. & Simonyan, K. (2018). "Large Scale GAN Training for High Fidelity Natural Image Synthesis." ICLR 2019. arXiv:1809.11096
Karras, T., Laine, S. & Aila, T. (2019). "A Style-Based Generator Architecture for Generative Adversarial Networks." CVPR 2019. arXiv:1812.04948
Karras, T. et al. (2020). "Analyzing and Improving the Image Quality of StyleGAN." CVPR 2020. arXiv:1912.04958
Karras, T. et al. (2021). "Alias-Free Generative Adversarial Networks." NeurIPS 2021. arXiv:2106.12423
Kang, M. et al. (2023). "Scaling up GANs for Text-to-Image Synthesis." CVPR 2023. arXiv:2303.05511
Dhariwal, P. & Nichol, A. (2021). "Diffusion Models Beat GANs on Image Synthesis." NeurIPS 2021. arXiv:2105.05233