从公式到对抗:揭秘生成对抗网络(GAN)的训练博弈之路

如果你对AI生成的逼真图像、视频甚至文字有所了解,那一定听说过**生成对抗网络(GAN)**的名号。它的核心魅力,都藏在下面这个看似复杂的公式里:

min⁡Gmax⁡DV(D,G)=Ex∼pdata(x)[log⁡D(x)]+Ez∼pz(z)[log⁡(1−D(G(z)))] \min_G \max_D V(D, G) = \mathbb{E}_{x \sim p_{\text{data}}(x)} \left[ \log D(x) \right] + \mathbb{E}_{z \sim p_z(z)} \left[ \log(1 - D(G(z))) \right] GminDmaxV(D,G)=Expdata(x)[logD(x)]+Ezpz(z)[log(1D(G(z)))]

今天,我们就从这个公式出发,一步步拆解GAN的训练逻辑,看看这对“对抗搭档”是如何在博弈中共同成长的。

一、公式拆解:GAN的“对抗战场”

这个公式是GAN的目标函数,它定义了生成器 GGG 和判别器 DDD 之间的“博弈规则”:

1. 博弈逻辑:min⁡Gmax⁡D\min_G \max_DminGmaxD

这是极小极大博弈的体现:

  • 先让判别器 DDD 最大化目标(拼命“打假辨真”);
  • 再让生成器 GGG 最小化目标(拼命“以假乱真”)。

2. 价值函数:V(D,G)V(D, G)V(D,G)的两重对抗

V(D,G)V(D, G)V(D,G)是两者对抗的“战场”,由两部分期望损失组成:

(1)真实样本项:Ex∼pdata(x)[log⁡D(x)]\mathbb{E}_{x \sim p_{\text{data}}(x)} \left[ \log D(x) \right]Expdata(x)[logD(x)]
  • Ex∼pdata(x)\mathbb{E}_{x \sim p_{\text{data}}(x)}Expdata(x):对真实数据分布 pdata(x)p_{\text{data}}(x)pdata(x) 取期望,xxx 是真实样本(如真实照片、文本)。
  • D(x)D(x)D(x):判别器对真实样本的输出,取值(0,1)(0,1)(0,1),表示“xxx是真实样本”的概率。
  • log⁡D(x)\log D(x)logD(x):若D(x)D(x)D(x)接近1(判别器准确识别真实样本),该项接近0;若D(x)D(x)D(x)接近0(判别器误判真实样本为假),该项趋向−∞-\infty
  • 意义:判别器希望这一项越大越好
(2)生成样本项:Ez∼pz(z)[log⁡(1−D(G(z)))]\mathbb{E}_{z \sim p_z(z)} \left[ \log(1 - D(G(z))) \right]Ezpz(z)[log(1D(G(z)))]
  • Ez∼pz(z)\mathbb{E}_{z \sim p_z(z)}Ezpz(z):对噪声分布 pz(z)p_z(z)pz(z) 取期望,zzz 是随机噪声(如高斯分布向量)。
  • G(z)G(z)G(z):生成器将噪声转化为“假样本”(如假照片、假文本),试图模仿真实数据。
  • D(G(z))D(G(z))D(G(z)):判别器对生成样本的输出,表示“G(z)G(z)G(z)是真实样本”的概率。
  • log⁡(1−D(G(z)))\log(1 - D(G(z)))log(1D(G(z))):若D(G(z))D(G(z))D(G(z))接近0(判别器准确识别假样本),该项接近0;若D(G(z))D(G(z))D(G(z))接近1(判别器误判假样本为真),该项趋向−∞-\infty
  • 意义:判别器希望这一项越大越好生成器希望这一项越小越好

简言之,这个公式就是一场“猫鼠游戏”:判别器DDD是“猫”,要最大化“辨真假”能力;生成器GGG是“鼠”,要最小化DDD的能力,让“假老鼠”骗过猫。

二、训练过程:交替对抗的“成长循环”

GAN的训练遵循**“先练猫,再练鼠,循环往复”**的逻辑:

阶段1:训练判别器 DDD(固定生成器 GGG

目标:让DDD尽可能“聪明”,区分真实样本和生成样本。

  1. 采样真实样本:从真实数据集中选一批样本xxx,计算Ex∼pdata(x)[log⁡D(x)]\mathbb{E}_{x \sim p_{\text{data}}(x)} \left[ \log D(x) \right]Expdata(x)[logD(x)]
  2. 生成假样本:从噪声分布中选一批噪声zzz,用当前GGG生成假样本G(z)G(z)G(z),计算Ez∼pz(z)[log⁡(1−D(G(z)))]\mathbb{E}_{z \sim p_z(z)} \left[ \log(1 - D(G(z))) \right]Ezpz(z)[log(1D(G(z)))]
  3. 更新DDD的参数:将两项损失相加,通过梯度上升(最大化V(D,G)V(D, G)V(D,G))更新DDD的神经网络参数。

阶段2:训练生成器 GGG(固定判别器 DDD

目标:让GGG尽可能“狡猾”,生成能骗过DDD的假样本。

  1. 生成假样本:从噪声分布中选一批噪声zzz,用GGG生成假样本G(z)G(z)G(z)
  2. 计算生成器损失:关注生成样本项Ez∼pz(z)[log⁡(1−D(G(z)))]\mathbb{E}_{z \sim p_z(z)} \left[ \log(1 - D(G(z))) \right]Ezpz(z)[log(1D(G(z)))],通过梯度下降(最小化V(D,G)V(D, G)V(D,G))更新GGG的神经网络参数。
    • (实战优化:为了训练更稳定,常将损失替换为−Ez∼pz(z)[log⁡D(G(z))]-\mathbb{E}_{z \sim p_z(z)} \left[ \log D(G(z)) \right]Ezpz(z)[logD(G(z))],梯度更显著)

循环迭代

重复“训练DDD → 训练GGG”的过程,直到生成器能生成足够逼真的样本(或达到预设轮数)。

三、训练中的“攻防细节”

GAN的训练并非一帆风顺,这些细节决定了它的“战斗力”:

  • 判别器的“强度平衡”

    • DDD太强(对生成样本输出恒为0),生成器梯度会消失,无法学习;
    • DDD太弱(对真假样本判断无差异),生成器也学不到有效“造假技巧”。
  • 梯度消失问题:生成器早期生成的样本很“假”,导致log⁡(1−D(G(z)))\log(1 - D(G(z)))log(1D(G(z)))梯度极小。用−log⁡D(G(z))-\log D(G(z))logD(G(z))替代损失可缓解这一问题。

  • 模式崩溃:生成器可能只生成少数“爆款假样本”(而非多样本)。可通过架构改进(如DCGAN、StyleGAN)或训练策略(小批量判别、引入噪声)来解决。

四、结语:对抗中的“共同进化”

从公式到训练过程,GAN的核心魅力在于**“对抗式共同进化”**——判别器在“打假”中更敏锐,生成器在“造假”中更逼真。正是这种博弈,让GAN能生成以假乱真的内容,在艺术创作、数据增强等领域大放异彩。

下次再看到AI生成的惊艳作品时,不妨想想背后这对“猫鼠搭档”在公式 min⁡Gmax⁡DV(D,G)=Ex∼pdata(x)[log⁡D(x)]+Ez∼pz(z)[log⁡(1−D(G(z)))] \min_G \max_D V(D, G) = \mathbb{E}_{x \sim p_{\text{data}}(x)} \left[ \log D(x) \right] + \mathbb{E}_{z \sim p_z(z)} \left[ \log(1 - D(G(z))) \right] GminDmaxV(D,G)=Expdata(x)[logD(x)]+Ezpz(z)[log(1D(G(z)))] 定义的战场上,经历了多少次交替训练的博弈吧!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐