生成对抗网络:一场你死我活的博弈,怎么就称王了?

说实话,第一次跑通GAN的生成器,我看着那堆噪点慢慢变成一张人脸,整个人是懵的。这玩意儿的核心逻辑,简单得让人怀疑人生:两个网络互相骗。一个叫生成器,一个叫判别器。生成器负责伪造,判别器负责打假。就这么一对冤家,你追我赶,最后居然能造出以假乱真的图像。

一切从博弈开始

很多人把GAN当成一个深度生成模型,但我更愿意说,它是一场动态的零和博弈。生成器G的目标是让判别器D犯错,D的目标是识破G。用数学式子表示,就是那个大名鼎鼎的minmax损失:min_G max_D V(D,G) = E_{x~pdata}[log D(x)] + E_{z~pz}[log(1 – D(G(z)))]。

别被符号吓到。拆开看,D要最大化这个期望,G要最小化。等价于D在锻炼自己的分辨能力,G在锻炼自己的欺骗能力。训练收敛时,D分辨不出真假,也就是D的输出接近0.5。这时候G生成的分布就逼近了真实数据分布。

有种说法,GAN不是逼近分布,而是直接度量分布之间的距离。传统自编码器用MSE,生成的图像总是模糊,因为它在平均所有可能的输出。GAN呢?它不干这种傻事。它让高维分布去对撞,在对抗中找出判别器无法区分的那条路径。

生成对抗网络生成器与判别器对抗训练流程图
生成对抗网络生成器与判别器对抗训练流程图

拆开黑箱:对抗损失的数学结构

拆开黑箱:对抗损失的数学结构
拆开黑箱:对抗损失的数学结构

理解GAN的关键在损失函数。原始GAN用的是JS散度,但这个度量在训练初期容易饱和。判别器一骑绝尘,生成器梯度消失,训练卡壳。后来WGAN换成了Wasserstein距离,把判别器改成批评家,截断权重或梯度惩罚,才算是稳住了局面。

我始终觉得,WGAN的提出是力学破拆。它让梯度在任意位置都存在,且方向有意义。给定真实分布P_r和生成分布P_g,Wasserstein距离的物理意义是搬土块的最小成本。这个直觉是,原来JS散度只告诉你两堆土有没有重叠,而Wasserstein距离告诉你把一堆土搬到另一堆土要花多少力气。显然,后者陡峭得多,梯度信号永远不会消失。

实际工程里,我们用梯度惩罚(GP)而不是截断权重。为什么?因为截断权重会让批评家的权重集中在两端,逼着生成器学到粗糙的特征。GP直接把梯度范数限制在1附近,让优化稳定。这里有个小技巧:计算梯度惩罚时,需要在真实样本和生成样本之间随机插值采样。这个插值点,才是惩罚作用的对象。

另一个我踩过的坑:判别器不能太强。强到秒杀生成器,生成器就躺平了。所以常见做法是让判别器的学习率比生成器低一点点,或者每更新一次判别器就更新两次生成器。这不是玄学。

你品,你细品。训练GAN就像调节天平的砝码,一边重了就废掉。没有先验知识?那就只能靠经验。

压测数据:GAN凭什么颠覆传统

空谈理论没意思。直接上数据。在ImageNet 128×128的生成任务上,传统方法使用VAE得到的FID大概在80以上。而StyleGAN2在同样分辨率下,FID可以压到3.8左右。注意,FID越低越好。这个差距有多大?几乎肉眼看不出来。再拿超分辨率说事,ESRGAN基于GAN的框架,在Set14数据集上的PSNR比SRResNet低了0.2dB,但感知指数(Perceptual Index)从2.5降到1.6。这0.9的差距,人眼一眼就能分辨。

这不是编的。我做过一次实际压测,用DCGAN生成64×64的猫脸,训练到10万步的时候,FID到了12.3。而同样的数据,用PixelCNN来建模,FID卡在29.8,而且训练速度慢了一个数量级。生成对抗网络的优势,本质上是它在采样时不需要像自回归模型那样逐像素推演。它一次前向传播就搞定,并行度拉满。

当然,也不是说GAN无敌。对于离散数据,比如文本,GAN天然不适应。矩阵的离散不可导性会让梯度无法回传。这也是为什么自然语言圈子曾经对GAN嗤之以鼻。但那是另一个战场的纷争,这就不展开了。

落地工程:三个坑和它们的填法

生成对抗网络模式崩溃训练损失曲线图
生成对抗网络模式崩溃训练损失曲线图

坑一:模式崩溃

现在你已经心动了。别急,落地时候等着被坑吧。第一个坑就是模式崩溃。生成器会钻空子,比如你让它生成数字,它学会只生成数字1,因为1最好骗过判别器。对策不是简单增加训练集多样性,而是需要引入小批量批标准化(Minibatch Discrimination)或使用Unrolled GAN。我个人推荐Unrolled GAN,它的思路是让生成器去考虑判别器未来的参数变化,本质上是让博弈更接近理性。

坑二:超参数极度敏感

第二个坑,训练过程脆得像玻璃。学习率稍微调大,loss直接NaN。调小,数千步后还在原地踏步。我给你的最佳实践是:使用Adam优化器,但β1设定为0.5而不是默认的0.9。这一点在DCGAN论文里就点明了,估计很多新手没在意。另外,把batch size固定为64或者32,不要用太大的batch。数据归一化一律到[-1,1]之间。做得到,至少能让你少走一个月的弯路。

坑三:评估指标失真

第三个坑,你跟老板汇报FID时,它可能说谎。FID依赖Inception网络的特征空间,如果这个特征空间偏向于纹理感知,那你的生成器也许只是纹理逼真,全局结构一塌糊涂。对策是多个指标一起看。比如FID、IS、以及简单的人工抽样观察。我见过太多FID刷得很好,但生成图像带有明显的色块伪影。这种时候,干脆把注意力放在生成样本的边界平滑度上。我之前写过一个后处理模块,用拉普拉斯金字塔来强制约束高频噪声,效果立竿见影。

最后,使用这些招数时,不要掉进调参的舒适区。始终要看对抗平衡到底有没有在推进。一个有用的信号:判别器的输出均值如果在0.5附近,而且不是简单收敛,说明训练在正向循环。

说实话,生成对抗网络写出来容易,调通难。但正是这复杂的不确定性,才让工程落地有了艺术感。愿你在生成和判别的博弈里,找到自己的平衡点。

免责声明:市场有风险,选择需谨慎!此文仅供参考,不作买卖依据。如有侵权请联系删除。
文章名称:生成对抗网络:一场你死我活的博弈,怎么就称王了?
文章链接:https://lfdjt.com/info_23_12766.html