GAN训练崩溃日记:从数学到实践的三个致命陷阱

那次,我跑的第一个 GAN 直接糊了

说实话,入坑 GAN 那会儿我自信满满。不就是两个网络互怼嘛,跟打乒乓球似的,能有多难?结果——脸都被打肿。生成出来的图片连亲妈都不认识,白花花一团,像发了霉的霉斑。后来才知道,那叫模式坍塌,生成器只学会了输出一种噪声的平均值,彻底摆烂。这还不算,判别器的 loss 像坐过山车,忽高忽低,显卡风扇嗷嗷叫。我当时就想:这哪是人工智能,分明是人工智障。
生成对抗网络模式坍塌现象示例
生成对抗网络模式坍塌现象示例
但后来静下心捋了捋,发现 GAN 的工程美学确实迷人。那是一种动态博弈的平衡。

博弈论的数学内核到底多残酷

GAN 的本质是极小极大游戏。价值函数 V(D,G) = E_x[log D(x)] + E_z[log(1-D(G(z)))]。看着简单对吧?但仔细想——判别器得最大化给真实样本的打分,同时最小化给假货的分。生成器呢,拼命让假货得分高。这一推一拉之间,数学上期望是收敛到 P_g = P_data 的纳什均衡点。然而,实际训练时,JS 散度可能让梯度消失得无影无踪。你调大学习率?直接散架。调小?两个网络躺在原地不动。好比两个人打太极,结果一个睡过去了,另一个人在推空气。 后来 WGAN 祭出 Wasserstein 距离,把梯度给盘活了。但这还没完,权重裁剪又带来新麻烦——参数被强制卡在某个区间,导致判别器偏好极端值,梯度要么削顶要么长尾。再后来 Gulrajani 那块豆腐干论文提出梯度惩罚,才让事情稍微清爽。但这些改进,每一次都是实打实的血泪史。你若不亲自趟一遍,根本体会不到那些公式背后的痛。

数据不会撒谎:FID 和 IS 的残酷对比

我拿 CIFAR-10 做过横评。同样的 VGG 骨干,同样的超参(lr=0.0002, batch_size=64),DCGAN 的 Inception Score 勉强爬到 6.8,FID 却高达 45.3。换成 WGAN-GP,IS 涨到 7.2,FID 骤降到 25.1。后来加上了 Spectral Normalization,FID 再压到 22.4。瞧见没?就换了个判别器的正则化方式,图像质量肉眼可见地提升——猫的胡须终于不是歪的了。 但别高兴太早。FID 这指标也有坑。它假设特征分布是高斯,可实际生成图往往不是。有时候 FID 低得离谱,肉眼却觉得失真。所以还得配合人类肉眼抽样。我通常在训练时丢一个 TensorBoard 面板,每隔 1000 步吐几张图,肉眼看一下。这法子土,但稳。
GAN 训练过程中生成质量的逐步可视化对比
GAN 训练过程中生成质量的逐步可视化对比

落地时踩过的三个粪坑,以及怎么爬出来

陷阱 1:生成器与判别器同步失调。很多人以为对抗训练就是各练各的,结果判别器强到没朋友,生成器直接躺平。为啥?因为判别器把真实和生成分得太开,导致给生成器的梯度信号全是噪声。解决方案:要么限制判别器能力(用 Dropout、减少过滤器),要么让生成器多练几步。经验值是判别器更新 1 次,生成器更新 2 次,但这得看数据集。还有个 trick——给判别器加梯度噪声,能让它别太嚣张。 陷阱 2:BatchNorm 的位置反直觉。书上都说 BN 放激活层之后,但 GAN 里你照着做,必死。得放在卷积层之后、激活层之前。为啥?因为生成器最后的 Tanh 输出,如果前面 BN 在激活后缩放,会把像素值范围搞乱。我掉进这个坑不下十次,每次都是生成图偏色,差点以为数据集有问题。后来看源码才发现这个细节。记着:BN 在卷积后,ReLU 前。 陷阱 3:评估全靠 loss 曲线——作死之道。判别器 loss 收敛到 0.5 左右,教科书说这就是均衡。可实际呢?生成图可能还是一坨屎。因为 loss 是平均下的平滑,不反映分布细节。正确的做法:阶段性保存模型权重,然后用单独的评估脚本跑 Inception Score 和 FID,并且要用同一组固定噪声 seed 生成对比。另外,千万别只看一个指标,IS 对多样性敏感,FID 对保真度敏感。得结合起来,再配合人工抽查。 写完这些,突然想起去年有个项目,用 GAN 做数据增强,上线后准确率不升反降。排查三天,最后发现是训练的 GAN 生成的图像带着明显的棋盘格伪影——去卷积层步长没整除。那一刻真是一口老血喷在屏幕上。GAN 这玩意,细节里全是魔鬼。 好了,就说这么多吧。兴许下次我该聊聊 VAE,那玩意儿虽然生成图模糊,但至少听话。
免责声明:市场有风险,选择需谨慎!此文仅供参考,不作买卖依据。如有侵权请联系删除。
文章名称:GAN训练崩溃日记:从数学到实践的三个致命陷阱
文章链接:https://lfdjt.com/info_23_8036.html