GAN网络开山论文精读:原理、训练与影响
2026/9/16 3:33:14 网站建设 项目流程

在深度学习这个圈子里,GAN网络相关的研究和讨论早就不新鲜了,但每次有新人入行,我还是会推荐先读一读2014年那篇《Generative Adversarial Nets》。原因很简单:如今能生成高分辨率人脸、能画画、能做视频生成和语音合成的那些模型,往上追源头,几乎都能追到这篇论文提出的对抗博弈思想。这篇论文不算长,数学推导也不复杂,但它定义了一个全新的生成范式,影响范围覆盖了整个生成式AI领域。这篇博文我想从论文阅读的角度,把GAN网络的核心思想、目标函数、训练过程、常见问题以及它对后续研究的影响脉络完整梳理一遍,适合刚接触生成模型的读者,也适合想回头补一补理论基础的从业者。

1. 为什么今天还要认真读这篇论文

1.1 论文到底解决了什么问题

在GAN网络出现之前,生成模型的思路主要是两类。一类是显式概率模型,比如玻尔兹曼机、深度信念网络,它们试图直接建模数据的概率分布,但计算配分函数(partition function)极其困难,处理高维图像几乎不可行。另一类是变分自编码器(VAE),它引入了隐变量,用变分推断逼近真实后验,训练相对稳定,但生成的图像普遍偏模糊,因为VAE优化的是对数似然的下界,而不是真实分布本身。

GAN网络的思路和这两类都不一样。Goodfellow等人直接跳过了"显式建模概率密度"这一步,而是用一个生成器G和一个判别器D互相博弈。G负责把随机噪声z映射成看起来像真实数据的样本,D负责判断输入是真实数据还是G生成的数据。两者对抗的最终结果,是G学到的分布越来越接近真实数据分布。这个思路本质上是隐式地拟合分布,不需要计算任何复杂的归一化项,也不需要设计变分下界,生成器只要把噪声映射得足够好,D就分不出来。

这一点在当时非常反直觉。生成问题居然可以变成一个二分类器的对抗问题,不用最大化似然,不用精确计算概率,全靠两个网络互相逼迫成长。

1.2 生成器和判别器的角色定位

理解GAN网络最好的方式,就是论文里那个经典的比喻:伪造者和鉴定师。生成器G是伪造者,它的目标是画出以假乱真的赝品;判别器D是鉴定师,它的目标是准确分辨出真品和赝品。

在这个博弈里,D的训练目标是最大化自己判对的概率,既要把真实数据判断为真,也要把G生成的假数据判断为假。G的训练目标则恰恰相反,它要最小化D判对的概率,换句话说就是让自己的赝品尽可能骗过D。随着博弈推进,G的生成能力越来越强,D的鉴别能力也不得不跟着提升,两者在对抗中共同进化。

论文用了一个非常简洁的极小极大博弈来描述这个过程:

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

这个公式看起来简单,但信息量很大。D想让V尽量大,因为D希望log D(x)接近0(真实样本判为真)、log(1-D(G(z)))接近0(假样本判为假);G想让V尽量小,因为G希望D把假样本误判为真,即D(G(z))接近1。

1.3 这个思路比当时的方法先进在哪

对比传统的生成模型,GAN网络的优势主要体现在三个方面。

第一,它不需要显式定义概率密度函数。只要G能生成足够逼真的样本,分布是不是有解析形式根本不重要,这大大扩展了可建模的数据类型和复杂度。

第二,它的生成过程是直接采样,不需要MCMC这类耗时的推断过程。VAE采样也要先经过编码器,GAN则是从噪声z一步映射到样本,生成速度天然有优势。

第三,它的理论保证很漂亮。论文证明,在生成器和判别器都有足够容量、且每一步都优化到最优的条件下,最终生成的分布一定收敛到真实数据分布。虽然这个理论前提在实践中很难满足,但它给出了一个清晰的目标:p_g = p_data。

不过,理论上的优雅和实际训练中的狼狈,从那天起就绑在了一起。这正是后面几代工作不断改进的起点。

2. 目标函数和收敛性证明的逐层拆解

2.1 目标函数里每一项都代表什么

先看目标函数里的两个期望。第一项 (\mathbb{E}{x \sim p{\text{data}}(x)}[\log D(x)]) 是在真实数据分布下,D对所有真实样本输出概率取对数的期望。D想让这个值越大越好,因为这意味着它能把真实样本正确识别出来。

第二项 (\mathbb{E}_{z \sim p_z(z)}[\log(1 - D(G(z)))]) 是在噪声分布下,G先生成假样本,D再对假样本输出概率取对数,然后算1减去这个概率的期望。D想让这个值越大越好,因为这意味着它能正确拒绝G生成的假样本。

对G来说,它只影响第二项。G想让 (\log(1-D(G(z)))) 尽量小,也就是D(G(z))尽量接近1,这等价于G生成的样本让D误认为是真的。

有一个细节经常被忽略:整个目标函数中G并不直接影响第一项,它只通过改变G(z)的分布来间接影响第二项。所以G的优化方向本质上是让自己生成的样本在D眼中的"真实概率"不断上升。

2.2 最优判别器是怎么推导出来的

假设G固定不变,我们来求D的最优解。这时候可以把目标函数改写成对x的积分形式:

[ V(D, G) = \int_x p_{\text{data}}(x) \log D(x) + p_g(x) \log(1 - D(x)) , dx ]

这里p_g是生成样本的分布。对于每一个固定的x,被积函数 (p_{\text{data}}(x) \log D(x) + p_g(x) \log(1 - D(x))) 可以看作是关于D(x)的函数。令a = p_data(x),b = p_g(x),D(x) = y,则函数是 (a \log y + b \log(1-y))。

对y求导并令其为零,得到:

[ y^* = \frac{a}{a+b} ]

也就是:

[ D^*(x) = \frac{p_{\text{data}}(x)}{p_{\text{data}}(x) + p_g(x)} ]

这个结果非常直观。如果一个x在真实分布中出现的概率很高、在生成分布中概率很低,D就会给出接近1的判断;如果两类概率相等,D就只能给出0.5,即完全无法区分。

我在复现GAN的时候,经常把D的输出当做一个置信度来理解,但其实在理论层面,D输出的是两个分布密度的比值变形。理解这一点,对后面理解为什么训练会不稳定非常有帮助。

2.3 收敛性证明的核心逻辑

把最优判别器D*代回目标函数,可以算出一个有趣的结果。

[ \begin{aligned} V(D^*, G) &= \mathbb{E}{x \sim p{\text{data}}} \log \frac{p_{\text{data}}(x)}{p_{\text{data}}(x) + p_g(x)} + \mathbb{E}{x \sim p_g} \log \frac{p_g(x)}{p{\text{data}}(x) + p_g(x)} \ &= -\log 4 + 2 \cdot \text{JSD}(p_{\text{data}} | p_g) \end{aligned} ]

其中JSD是两个分布的Jensen-Shannon散度。JSD永远大于等于0,只有p_data = p_g时才等于0。所以V(D*, G)的最小值是-log4,在p_g = p_data时取得。

等价的表述是:在全局最优时,D*的输出恒为1/2,也就是判别器对任何输入都只能随机猜测。这完全符合直觉——生成器的分布和真实分布完全一致时,再强的判别器也无法区分。

论文还给出了一个保证收敛的方向:如果把G的更新当作对p_g的梯度下降,并且D每一步都达到最优,那么p_g最终会收敛到p_data。这里的理论前提是G在函数空间中更新,有足够的表达能力。

2.4 理论证明与真实训练之间的落差

我在最开始读这篇论文时,一直觉得收敛性证明很完美,但为什么实际训练时经常不收敛?后来才想明白:理论证明假设G在函数空间中直接更新,也就是每一步都可以把生成分布往正确的方向调整,但实际训练是在深度网络的参数空间中用梯度下降做更新,参数空间的拓扑结构远比函数空间复杂。

更麻烦的是,理论要求D每一步都训练到最优。实际中如果D真的被训练到接近最优,G得到的梯度往往会非常小,尤其是当D能轻松区分真假样本时,log(1-D(G(z)))的梯度趋近于0,G几乎学不到东西。

这个矛盾贯穿了GAN研究的整个历史。后面WGAN把目标函数换成Wasserstein距离,核心动机就是解决这个梯度消失问题。当然,这些都是后话。我在真正动手训练GAN之后,才体会到了为什么论文里反复强调训练时的平衡至关重要。

3. 从论文到能跑的模型:训练过程与实操要点

3.1 交替训练算法怎么跑

论文在训练部分给出了一种交替更新策略:每个迭代中,先更新k次判别器D,再更新1次生成器G。论文里常用的k取1,也就是说每轮先训练一次D,再训练一次G。

为什么D要多更新几次?因为在博弈的最开始,G生成的样本质量很差,D很容易就能区分真伪,这时D的损失非常低,而G的梯度会很差。先让D多训练几步,可以让D保持在一个相对较强的状态,反过来迫使G不断改进。不过k的取值在实际中要谨慎,如果D太强,G又会陷入梯度消失;如果D太弱,G又缺乏足够的压力。

我常用的训练循环结构是:

# 每个训练回合 for epoch in range(num_epochs): for batch_idx, (real_data, _) in enumerate(data_loader): batch_size = real_data.size(0) noise = torch.randn(batch_size, latent_dim) # 更新判别器 fake_data = generator(noise).detach() d_real = discriminator(real_data) d_fake = discriminator(fake_data) d_loss = -(torch.mean(torch.log(d_real + 1e-8)) + torch.mean(torch.log(1 - d_fake + 1e-8))) d_optimizer.zero_grad() d_loss.backward() d_optimizer.step() # 更新生成器 noise = torch.randn(batch_size, latent_dim) fake_data = generator(noise) d_fake = discriminator(fake_data) g_loss = -torch.mean(torch.log(d_fake + 1e-8)) g_optimizer.zero_grad() g_loss.backward() g_optimizer.step()

这里生成器的损失用的是 (-\log D(G(z))),而不是原始目标函数里的 (\log(1-D(G(z))))。这是论文在实验部分明确提到的改进技巧:最大化 (\log D(G(z))) 而非最小化 (\log(1-D(G(z))))。原因在于训练的早期,D很容易拒绝G生成的样本,此时D(G(z))接近0,而 (\log(1-D(G(z)))) 的梯度很小,G几乎收不到有效的学习信号。反过来用 (-\log D(G(z))),在D(G(z))接近0时梯度非常大,能给G更强的推动力。

3.2 网络结构与超参数的经验之谈

论文在MNIST上的实验设置放在今天看比较简单:生成器使用了ReLU和sigmoid激活,判别器使用了maxout激活和dropout,优化器选择的是SGD。但现在的工程实践已经发生了很大变化,我复现时更推荐下面的配置:

组件建议配置
生成器G全连接或转置卷积,激活函数用ReLU(隐藏层)和Tanh(输出层)
判别器D全连接或卷积,激活函数用LeakyReLU
优化器Adam,学习率0.0002至0.0004,beta1取0.5
批量大小64或128
噪声维度通常取100或128
归一化生成器使用BatchNorm,判别器视情况使用

为什么激活函数这么选?生成器输出层用Tanh,是因为Tanh的取值区间是[-1,1],与图像像素归一化到[-1,1]后的范围一致,能避免生成图像整体偏某个亮度。判别器用LeakyReLU,是因为普通ReLU在负数区域的梯度恒为0,判别器一旦陷入负区间就可能"死掉",LeakyReLU保留了负半轴的梯度,让判别器更不容易停止学习。

还需要注意一个容易被忽略的点:生成器的输入噪声z,不要使用全零或者固定常数。在训练初期,如果噪声集中在很小的范围内,G很容易退化成只会输出固定类型的样本。通常建议从标准正态分布中采样。

3.3 训练过程中肉眼可见的规律

我第一次完整跑通GAN训练时,最直观的感受是损失曲线的波动非常大。D的loss会不断上下震荡,G的loss也不会单调下降,这是正常现象。因为两者是博弈关系,一方变强必然导致另一方的loss上升。

从图像生成效果上看,通常会经历三个阶段。最开始G输出的完全是噪声,D几乎可以100%区分真假。然后随着训练推进,G开始能生成一些有结构的模糊图案,这时D的loss会从"几乎为0"上升到0.5附近。最后,如果训练顺利,G生成的图像会逐渐清晰,D的loss会长期稳定在0.5附近——这是判别器已经无法区分真假的信号。

需要特别提醒的一点是:不要因为生成样本看起来还可以就立刻停止训练。GAN的生成质量在训练过程中可能出现周期性的反复,前一个epoch看起来挺好,后一个epoch突然变差了。这种情况需要耐心观察几个周期,再决定是否提前停止。

4. 训练中的常见问题与排查思路

4.1 判别器太强,生成器梯度消失

这是GAN初学阶段最容易踩的坑。表现是判别器的loss快速降到接近0,但生成器的loss长时间不下降,或者生成图像始终是一团模糊。

原因在前面的数学部分已经分析过:当D能轻松区分真伪时,D(G(z))趋近于0,此时如果还用原始的 (\log(1-D(G(z)))) 作为G的损失,梯度就会趋近于0。这也是为什么论文实验部分会改用 (-\log D(G(z))) 的原因。

排查思路按优先级排序:

  1. 检查生成器损失是否使用了 (-\log D(G(z))),而不是原始的 (\log(1-D(G(z))));
  2. 调低判别器的学习率,让D的更新慢于G;
  3. 减少每轮中D的更新次数,比如k从2降到1;
  4. 给判别器加dropout,或者减小判别器的网络容量;
  5. 使用标签平滑(label smoothing),把真实标签从1改成0.9左右,给判别器留一点余地。

4.2 模式崩塌:生成器只会骗不会学

模式崩塌(mode collapse)的表现是:生成器找到了少数几个能骗过判别器的"套路",生成的样本多样性极差。比如在MNIST上,G生成的数字可能只有1和7两类,而且变化很小;在CIFAR-10上,可能生成的所有图片都带有类似的绿色背景。

原论文并没有直接讨论模式崩塌,但这个现象在后续的GAN研究中被反复提及。它的本质是:G只需要骗过当前D就能获得足够低的损失,并不需要学满整个真实分布的支撑集。

早期常用的缓解手段包括:

  • 小批量判别(minibatch discrimination):让D在判断真伪时参考同一batch内的多个样本,如果某个batch内样本过于相似,就判定为假。
  • 使用多个G或定期重新初始化G;
  • 降低D的容量,让D无法过强地对单个样本进行精确判断;
  • 引入正则化项鼓励样本多样性。

这些问题在现代的WGAN、StyleGAN等模型中已经得到了一定程度的缓解,但模式崩塌并没有被彻底解决,只是从显性变为了更隐蔽的形式。

4.3 生成质量到底怎么评估

GAN没有显式的对数似然,所以训练到什么时候算好,成了实践中的一个大问题。论文当时的处理方式是人工观察生成样本,这也是早期GAN研究中最常用的手段,主观性很强。

后来的工作逐步引入了更客观的指标。Inception Score(IS)的思想是:用预训练的Inception网络对生成样本做分类,如果生成样本既清晰又多样,得到的类别分布应该又集中又均匀。FID(Fréchet Inception Distance)则更进一步,在Inception网络的某一层特征空间里计算真实样本和生成样本分布之间的Wasserstein距离,数值越低越好。

我在实际使用FID时的经验是,FID对不同训练阶段的区分度比IS好很多,而且对模式崩塌更敏感。但它也有局限:它依赖Inception网络在ImageNet上学到的特征,如果你处理的图像域和ImageNet差异很大,FID的绝对值参考价值就会下降。

下面整理一个常见问题的速查表,方便对照排查:

现象可能原因优先处理方式
D的loss快速归零D太强调低D的学习率,加dropout,使用标签平滑
G的图像始终模糊训练没有收敛或G欠拟合增大模型容量,调节学习率
生成样本单一模式崩塌缩小D容量,引入多样性约束
训练中期loss大幅震荡博弈不平衡降低Adam的学习率,使用更小的beta1
生成图像出现棋盘格纹理转置卷积重叠改用上采样+普通卷积,或调整kernel大小

5. 这篇论文到底影响了后来的什么

5.1 DCGAN:从全连接到卷积结构

原始GAN论文在图像实验中使用的网络基本都是全连接层,这在小型数据集上还能工作,但对更复杂图像就力不从心。2015年Radford等人提出DCGAN,把生成器和判别器全部替换成了卷积结构,同时引入了BatchNorm、LeakyReLU、Adam等训练技巧,让GAN的训练稳定性大幅提升。

DCGAN的意义不仅在于结构改进,更重要的是它提供了一套可复现的训练"配方"。当年我能第一次稳定地在64x64图像上训练GAN,靠的就是DCGAN这套配置。可以说,在那个人人复现GAN都靠玄学的年代,DCGAN硬生生把训练GAN从一门艺术变成了工程。

5.2 WGAN:从根本上换掉损失函数

原始GAN使用Jensen-Shannon散度作为理论依据,但JS散度在p_data和p_g没有重叠或者重叠极小时,梯度会消失。WGAN用Wasserstein距离替代了JS散度,即使两个分布完全不重叠,Wasserstein距离依然能提供有意义的梯度信号。

WGAN的实践改动其实很小:把判别器换成critic,输出从概率变为实数;critic的损失函数改为真实样本的输出期望减去生成样本的输出期望;配合weight clipping或gradient penalty来满足Lipschitz约束。但就是这个改动,解决了GAN训练中最大的痛点——梯度消失。我第一次跑WGAN的时候,明显能感觉到loss曲线比原生GAN稳定好几个量级。

5.3 从图像生成到多模态生成:GAN的扩展版图

GAN网络的影响范围远不止"生成一张图片"。条件生成想法(Conditional GAN)让生成过程可以受标签控制,后来衍生出pix2pix这类图像翻译框架。CycleGAN实现了无配对图像到图像的转换,让风格迁移、昼夜转换这类任务变得可落地。StyleGAN则在2018年后把高分辨率人脸生成的质量推到了几乎无法用肉眼分辨的水平。

即使在扩散模型大放异彩的当下,我们依然能看到GAN思想的影子。扩散模型的生成过程同样需要区分"真实图像"和"被噪声污染的图像",这种判别式的指导思想与GAN网络是一脉相承的。很多GAN时代积累的训练技巧——梯度惩罚、标签平滑、EMA——也被扩散模型的训练直接借鉴。

我自己的阅读习惯是每隔一段时间就重新翻一翻这篇论文的原始版本,每次都能读出一些新的东西。早年被"对抗博弈"这个概念震撼,后来关注目标函数的设计细节,再后来研究收敛性证明中的假设条件,每一步都让我对生成式模型的理解更深一点。如果你刚接触GAN网络,不用急着追着StyleGAN的代码跑,先把这篇论文的公式亲手推一遍,把训练循环的每一行代码和公式对应起来,再去看后续的改进工作,你会发现自己少走了很多弯路。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询