なぜBCE(Binary Cross Entropy)でGANが学習できるのか

コードの学習ループで使われている損失関数 nn.BCELoss()(Binary Cross Entropy)について、少しだけ理論的な背景を解説します。

GANの学習は、数学的には**「ミニマックスゲーム(Minimax Game)」**と呼ばれる最適化問題として定義されます。

$$\min_G \max_D V(D, G) = \mathbb{E}{x \sim p{data}(x)}[\log D(x)] + \mathbb{E}_{z \sim p_z(z)}[\log(1 – D(G(z)))]$$

数式を見ると難しそうですが、やっていることは単純な「本物か偽物かの2択クイズ」です。

1. 識別器(Discriminator)の視点:Lossを最大化したい

識別器は、本物の画像 $x$ を「本物(D(x)=1)」と見抜き、生成器が作った偽物の画像 G(z) を「偽物(D(G(z))=0)」と見抜きたいわけです。これはまさに、2値分類の交差エントロピー誤差を最小化することと同義です。

コードでは、以下のように「本物画像」と「偽物画像」の損失を別々に計算して足し合わせています。

# 本物は「1」、偽物は「0」に近づける
d_loss_real = criterion(discriminator(real_imgs), valid) # valid=1
d_loss_fake = criterion(discriminator(gen_imgs.detach()), fake) # fake=0

2. 生成器(Generator)の視点:Lossを最小化したい

ここがGANの面白いところです。生成器の目標は、識別器を騙すこと、つまり識別器に**「偽物画像を本物(D(G(z))=1)だと言わせること」**です。

PyTorchのコードでは、これを非常にスマートに実装しています。

# 偽物画像(gen_imgs)に対して、あえて本物ラベル(valid)を指定してLossを計算
g_loss = criterion(discriminator(gen_imgs), valid) # valid=1

本来なら「偽物(0)」であるはずの画像に対して、あえて「本物(1)」という正解ラベルを与えてBCEを計算しています。こうすることで、「鑑定士が偽物を1と判定してくれればLossがゼロに近づく」という、Generatorにとって都合の良い勾配を計算できるのです。

この「2値交差エントロピーの裏をかいたような実装」こそが、GANのプログラムの最も美しく、面白いポイントです。

3. この損失関数の弱点と、これからの学習に向けて

今回紹介したBCEを用いた損失関数は、GANの原点であり、その理論的な美しさは今でも色褪せません。しかし、実際に学習させてみると**「モード崩壊(Mode Collapse)」**という厄介な問題によく直面します。

モード崩壊(Mode Collapse)とは?

本来なら「0, 1, 2…」と多様な数字を生成してほしいのに、Generatorが**「Discriminatorを騙しやすい特定の数字(例えば『1』だけ)」しか生成しなくなってしまう現象**のことです。

これは、Generatorが「多様な画像を作る」ことよりも「手っ取り早くLossを下げる抜け道」を見つけてしまった状態と言えます。BCEを用いた初期の損失関数(Jensen-Shannonダイバージェンスの最小化)は、勾配消失などが起きやすく、この現象を引き起こしやすい性質を持っています。

より安定した学習を目指して

この問題を解決するために、近年では損失関数に様々な改良が加えられています。

  • Wasserstein GAN (WGAN): 画像の分布間の「距離」をより滑らかに測ることで、学習を劇的に安定させた手法。
  • Gradient Penalty (WGAN-GP): WGANの制約条件をよりスマートに満たすための工夫。

現在実用化されている高品質な画像生成AIの多くは、こうした新しい損失関数を採用しています。しかし、それらを理解するためにも、「なぜGeneratorとDiscriminatorが競い合うのか」「どうやってLossを設計するのか」という、今回学んだ原初のGANのふるまいを深く理解しておくことは、必ず将来の大きな助けになるでしょう。

コメント