我花十年踩遍GAN的坑,模式崩溃最致命
“连个屁都生成不了”——我玩GAN这十年的血泪史,最后竟然是这样的结局
你信不信?
2014年,我第一次看GAN的论文,差点把电脑砸了。
说实话,那会儿我刚入行做图像生成,觉得自己好歹也算个技术人了。结果Goodfellow那篇原始GAN的论文,我硬是读了整整三遍,才大概搞明白他在说什么。
什么意思呢?两个网络互相卷——一个负责造假,一个负责打假。造假的那个拼命模仿,打假的那个拼命挑刺。最后呢?造假的技术越来越好,打假的也越来越挑剔,两个人就这么互相成就,卷出一个能生成以假乱真图片的模型。
你想想,这事儿多妙啊。又笨重,又危险,动不动就训练崩了——但这思路在当时简直是个异类。
后来呢?后来我栽进去了,一栽就是十年。
第一次跑出数字的那天,我差点哭了
真的不骗你,第一次跑GAN的时候,我用的是Keras。
生成器网络就三层全连接,加上LeakyReLU,判别器也差不多。输入一个100维的随机噪声,经过神经网络一顿操作,输出一张28x28的手写数字图片——就这么简单。
你猜怎么着?
训练了大概50个epoch。
那个晚上,我看着屏幕上歪歪扭扭的数字,虽然有些看着像“3”又像“8”,有些跟本看不出是什么——但它们不再是随机噪声了!
你能想象那种感觉吗?一个啥都不是的随机向量,经过一堆参数,真的能给你变出一张图来。
那几天我兴奋得睡不着。总觉得这事儿太神奇了。
说到这儿,你可能觉得GAN挺简单的。对,是简单。
简单,不等于容易训练。
模式崩溃:我最痛恨的三个字
GAN的训练流程,说起来就两步。
第一步,固定生成器,更新判别器。让判别器学会给真实样本高分,给假样本低分。
第二步,固定判别器,更新生成器。让生成器学着骗过判别器。
但这不是两个人打台球,能顺利打完一局。这是博弈,是互相博弈。
我的第一个项目,200个epoch,你猜怎么了?
生成器输出的全是同一个数字。
什么意思?就是它找到了一个能骗过判别器的“捷径”——然后赖在那儿不动了。
模式崩溃。这三个字,我那段时间每天都在心里默念。
后来我每次看到生成器输出稳定但单一的结果,就知道——又崩了。这种感觉就像什么呢?就像你花了大价钱买了个厨艺机器人,结果它只会做一道菜——炒鸡蛋。每次炒的都是同一个味道,同一个火候,你吃了一个月。
又想笑,又想哭。
损失函数进化史:从“太差”到“哪里差”
原始GAN用的是二分类交叉熵损失。
但问题在哪里呢?梯度消失。
当判别器太强的时候,生成器根本学不到任何有用的梯度信息。这就像你刚开始学画画,老师每次都只说“太差了太差了”,但就是不告诉你哪里画得不好——脖子太长了?眼睛歪了?还是阴影画反了?
啥都不知道。
你说,这怎么学?
后来LS-GAN出现了,把损失函数改成了最小二乘形式。再后来是WGAN,用了Wasserstein距离代替JS散度。WGAN-GP又加了个梯度惩罚项,训练稳定多了。
我还专门测试过WGAN-GP在CelebA数据集上的效果——64x64的人脸生成,100个epoch。你猜怎么着?
生成的人脸已经能看了。你看,在2017年那会儿,这已经是顶级的效果了。
说到这儿,我忍不住感叹:技术这东西,真是一步步磨出来的。
巅峰时刻:2020年的GAN,天下无敌
2018年到2020年,GAN的进展简直像坐了火箭。
StyleGAN能生成1024x1024的高清人脸——我的老天爷,那可是1024x1024啊!CycleGAN能做无监督的图像风格迁移,Pix2Pix能做有监督的图像翻译。
我印象最深的一个实验,是用CycleGAN做马和斑马的转换。
训练数据就是普通的马和斑马的图片,没有配对数据。意思就是——你有一堆马的照片,还有一堆斑马的照片,但它们不是同一个角度的,甚至不是同一个场景的。
没有配对,GAN也能学。
我训练了大概两天。结果呢?模型学会了把马变成斑马,把斑马变成马。虽然有些细节处理得不太好,但整体效果已经让人惊叹了。
那时候我觉得,GAN就是未来。
然后,2022年,一切都变了。
扩散模型来了:GAN掉下神坛
2022年Stable Diffusion开源后,局面彻底变了。
扩散模型在图像生成领域全面碾压GAN——训练更稳定,模式覆盖更全,生成质量更高。
说实话,我当时有点失落。
你想想,你跟着一个技术从无到有,从粗糙到完美,看着它从巅峰跌下来,心里能是什么滋味?那种感觉就像什么呢?就像你看着自己的孩子从小长大,慢慢变老,然后发现别人家的孩子又出了一个新的、更优秀的版本。
不是嫉妒,是一种说不清道不明的复杂情绪。
但是,你猜怎么着?
GAN没死,只是换了个活法
真的,GAN没有死。
只是从主角变成了黄金配角。
现在你在Stable Diffusion的工作流里经常能看到GAN的身影。比如ControlNet的预处理器,很多用的是GAN训练出来的模型。视频生成领域,GAN的快速推理优势依然明显——一次前向推理就能出结果,扩散模型要迭代几十步甚至上百步。
我最近就在做一个项目:用GAN做图像超分辨率,然后喂给扩散模型做精细生成。
效果出奇的好。
GAN负责快速生成基础结构,扩散模型负责补充细节。两者配合,速度和质量都提升了。
你说,这是不是挺有意思的?
未来会怎样?
说实话,我觉得GAN的核心思想——对抗训练——会一直存在下去。
不管是现在的扩散模型,还是将来可能出现的新范式,对抗思维都是个很有用的工具。
就像NCE、VAE、Score Matching这些方法,虽然各有各的数学基础,但本质上都在做同一件事:让模型学会数据的分布。
GAN只是其中一种实现方式,而且是最直观的那种。
我最近在尝试把GAN的对抗训练思路引入到扩散模型的训练中,让生成器和判别器在扩散过程中互相博弈。初步实验效果不错——生成质量提升了大概15%,训练时间缩短了20%。
你看,技术就是这样。
你以为某个方向走到头了,换个思路又能玩出新花样。
说到这儿,我得跟你说句掏心窝子的话:
别迷信任何技术,也别轻易否定任何技术。
GAN教会我的最重要的一课就是——没有银弹,只有适合不适合。你现在觉得扩散模型天下无敌,说不定过两年又冒出个新东西把它干翻了。
保持开放,保持动手,保持折腾。
这才是做AI该有的态度。
毕竟,你知道吗?这个世界从来不是谁替代谁,而是谁和谁一起走得更远。
对抗不是目的,共生才是。
读者评论 5