GAN · 对抗网络
GAN 是深度学习史上最富戏剧性的架构——两个神经网络你追我赶、互相较量,最后学会了造以假乱真的假货。人脸生成、图像风格迁移、DeepFake、AI 换脸……2014 到 2020 年那波"AI 生成图"的浪潮,几乎全是 GAN 的功劳。
想象一个假币贩子想印出以假乱真的百元大钞。
第一次,他技术粗糙,钞票纸张都不对——验钞员一秒识破,退回;
他回去改进纸张——第二次能骗过验钞机,但荧光条不对——又被识破;
他继续琢磨——荧光条加上了,可水印位置歪了——又被识破……
验钞员每次抓假越来越严,贩子每次造假越来越精,两人互相逼迫、水涨船高。到最后——假币贩子印出的钞票,连验钞员都分辨不出真假。
GAN 的训练过程,跟这一模一样。
先把词儿说清楚:什么叫"生成模型"
在讲 GAN 之前,得先把一个最容易被跳过的词讲明白——生成模型(Generative Model)。所谓生成模型,说白了就是一台"会自己造新东西"的机器,而不是一台"只会给东西贴标签"的机器。它的对立面叫判别模型(Discriminative Model),判别模型这个词听着玄,其实就是"分类器"——你给它看一张图,它告诉你"这是猫"还是"这是狗",它一辈子只会回答问题,不会创作。
这两者的差别,用菜市场就能说透。判别模型像一位挑西瓜的老师傅:你抱一个瓜过去,他敲两下,说"这个熟了""这个生的"。他判断得极准,但你让他凭空长出一个西瓜,他做不到。生成模型像一位育种农民:他脑子里装着"西瓜应该长什么样"的全部规律——皮什么纹路、瓤什么颜色、籽怎么分布、大小什么区间——所以他能种出一个世界上从没存在过、但你一眼就认得出是西瓜的新西瓜。
用稍微书面一点的话说:判别模型学的是"给定一张图,它属于哪一类"这种条件概率;生成模型学的是"真实世界的图片,整体上长什么样"这种数据分布。"分布"这个词也得翻译一下——所谓分布,说白了就是"哪种情况常见、哪种情况罕见"的一张全局清单。比如人脸的分布里,"两只眼睛"极其常见,"三只眼睛"概率约等于零;"黑头发"很常见,"荧光绿头发"很罕见。生成模型的任务就是把这张清单摸清楚,然后按着这张清单去"抽签造新样本"。
为什么生成模型比判别模型难做太多?因为判断只需要抓住少数几个关键特征(西瓜熟了看纹路和声音就够了),而创作必须掌握全部细节且每个细节都不能出错。这就是"看懂"和"会做"之间的巨大鸿沟——你能一眼看出一幅画画得好不好,但让你画一幅同水平的,差着十万八千里。GAN 的天才之处,就是它想出了一个办法:让"会看"的那个去逼着"会做"的那个进步。
GAN 的两个演员:G 与 D
GAN(Generative Adversarial Network)由两个神经网络组成:
生成器 G(Generator)——它拿一小段随机噪声当"灵感",努力生成一张看起来像真数据的东西。就像那位假币贩子,从空白纸开始造假钞。
判别器 D(Discriminator)——它看到一张图(可能真、可能假),要判断"这是真的(来自真实数据)还是 G 造的"。就像验钞员。
两者的目标彻底相反:G 要骗过 D,D 要抓住 G。这种"你死我活"的博弈就是 GAN 名字里"Adversarial(对抗)"的含义。
先把名字拆开翻译一遍,免得看着眼晕。GAN = Generative Adversarial Network,中文叫"生成式对抗网络":Generative(生成式)=会造新东西的;Adversarial(对抗式)=两个网络互相拆台的;Network(网络)=神经网络。三个词连起来就是一句话——用"两个互相拆台的神经网络"来造新东西。
那 G 手里那"一小段随机噪声"到底是什么?这个东西专业上叫隐向量(latent vector),通常写成 z。隐向量这个词听着玄,其实就是一串随机数字,比如 100 个或 512 个介于 -1 到 1 之间的小数。它相当于彩票的号码:你摇一组号码进去,G 就吐一张对应的图出来;换一组号码,就换一张图。同一组号码永远吐同一张图,所以那些"AI 生成人脸"的网站每次刷新给你不同的脸,本质上就是后台重新摇了一次号。
为什么非要从随机数开始?因为如果不给随机输入,G 就是一台"死机器"——参数固定,输出永远只有一张图,那还叫什么生成。随机噪声是"多样性的唯一来源",就像做菜时你手上必须有不同的食材,才能做出不同的菜;如果厨房里只有一颗鸡蛋,你再有本事也只能做一道菜。这 100 个随机数字构成的空间,就是 G 的"食材库",理论上包含无穷多种组合。
再把 D 的活儿说细一点。判别器 D 的输出不是"真"或"假"两个字,而是一个 0 到 1 之间的数——你可以理解成"我觉得这张是真图的可能性有百分之多少"。输出 0.97 就是"我基本确信这是真的",输出 0.03 就是"这假得离谱",输出 0.5 就是"我完全猜不出来,跟抛硬币一样"。GAN 训练的终极目标,说白了就是把 D 逼到"永远只能输出 0.5"的境地——因为到那一步,验钞员已经彻底废了,假币和真币在他眼里没有任何区别。
你可以把 GAN 想成一个怪异的教学场景:学生(G)不断交作业,老师(D)不断打分。
刚开始学生水平差,老师随便一看就知道是抄的;
学生根据老师的反馈改进,作业越来越像模像样;
老师为了跟上学生进步,也越来越挑剔,看得更精细;
最后学生的作业已经和真作品无法分辨——同时老师也变成了一位极其挑剔的鉴赏家。
有意思的是,训练结束后,我们通常只留下学生 G(生成器),扔掉老师 D——因为我们要的是"会造假"的能力,而不是"会打假"。
2014 年那个酒吧之夜:一个 idea 的诞生
GAN 的来历本身就是深度学习圈最爱讲的故事之一。2014 年,加拿大蒙特利尔大学的博士生 Ian Goodfellow(伊恩·古德费洛)和同学在一家酒吧给人送行。席间大家争论一个老问题:怎么才能让神经网络自己生成图片?当时主流思路是"统计建模"——想办法把"真实图片的概率分布"写成一个数学公式,然后从公式里抽样。可这条路极其难走,因为真实图片的分布复杂得没法写成公式,硬算的话需要处理天文数字级别的积分。
Goodfellow 当场提出了一个"绕开数学"的想法:既然算不出"像不像真的"这个分数,那就再训一个网络专门来打这个分。这句话是整个 GAN 的全部秘密。传统做法是人来定义"什么叫像"(比如像素差、颜色直方图差异),而这些人造标准都很糟——两张图像素差很小可能一张糊一张清晰,像素差很大也可能只是整体平移了两格。Goodfellow 的答案是:别人定标准,让机器自己学一套标准出来。
朋友们当时觉得这不可能收敛。Goodfellow 回家当晚就写了代码——据他自己回忆,第一版跑出来就成功了。论文《Generative Adversarial Nets》当年投中 NeurIPS,成为深度学习史上引用量最高的论文之一。Yann LeCun(杨立昆,卷积网络之父、图灵奖得主)后来公开评价 GAN 是"过去十年机器学习领域最有意思的想法"。
这个故事真正值得记住的地方不是"天才一晚写完代码",而是那个思维转向:当一个评价标准难以人工设计时,把"设计标准"这件事也变成一个学习问题。这个套路后来遍地开花——今天大语言模型训练里的 RLHF(Reinforcement Learning from Human Feedback,基于人类反馈的强化学习),里头那个"奖励模型"干的活儿,本质上跟 GAN 的判别器是一个思路:用一个学出来的网络当裁判,去教另一个网络做事。
训练一次到底发生了什么
- Step 1从真实数据集里取一批"真图",让 D 学会说"这些是真的"。
- Step 2G 从随机噪声生成一批"假图",让 D 学会说"这些是假的"。
- Step 3冻结 D,用 D 的评价去反过来指导 G:G 调整参数,让 D 越来越无法把它的假图识破。
- Step 4回到 Step 1,G 和 D 交替更新,一步步共同进化。
上面四步写成伪代码就是下面这样。别被代码吓住,右边的注释是大白话,每一行都能读懂:
for 轮次 in range(几十万轮):
# ===== 第一阶段:训练验钞员 D =====
真图 = 从数据集里随便抓 64 张真实照片
z = 摇 64 组随机号码(每组比如 100 个随机小数)
假图 = G(z) # 让造假者按这些号码印 64 张假币
D_对真图的打分 = D(真图) # 期望它接近 1("这是真的")
D_对假图的打分 = D(假图) # 期望它接近 0("这是假的")
D的损失 = -[ log(D_对真图的打分) + log(1 - D_对假图的打分) ]
# 说白了:D 把真图判成真、把假图判成假,这个数就小;判错了就大
更新 D 的参数,让 D的损失 变小 # 验钞员进修一次
# ===== 第二阶段:训练造假者 G =====
z = 再摇 64 组新号码
假图 = G(z)
D_对假图的打分 = D(假图) # 注意:这次 D 的参数冻住不动
G的损失 = -log(D_对假图的打分)
# 说白了:D 越是把假图当成真图(打分接近 1),这个数就越小
# 也就是"骗过验钞员的程度"越高,G 越满意
更新 G 的参数,让 G的损失 变小 # 造假者改良工艺一次
# 训练完毕:扔掉 D,只留 G。以后想造图,摇个号码丢给 G 就行
这段伪代码里有三个新手最容易踩的坑,值得单独点出来。第一,两个阶段必须分开做,不能混在一起。训 D 的时候 G 的参数要冻住,训 G 的时候 D 的参数要冻住——这就像下棋只能一人走一步,不能两个人同时挪子,否则棋盘就乱了。工程上这一步靠"停止梯度回传"实现,如果代码写错了让梯度串了台,训练会立刻发散成一团糟。
第二,G 的损失里那个"D 的打分"必须现算。你不能拿上一轮 D 的评价来指导这一轮的 G,因为 D 每一轮都在变强。这相当于假币贩子必须拿最新款验钞机来自测,用去年的老机器测出"完美通过"没有任何意义——市面上早换新机器了。
第三,"损失变小"不等于"图变好"。这是 GAN 最反直觉的一点。普通神经网络训练时,损失曲线往下掉你就放心了;GAN 的两条损失曲线上下乱跳是正常现象,甚至是健康现象——因为对手在变强,你的损失当然会反弹。所以调 GAN 的人不看损失曲线,他们看的是每隔几百轮存下来的样本图,靠肉眼判断"是不是在变好"。这是深度学习里罕见的"靠眼睛调参"的领域。
零和博弈:为什么这个循环能收敛
数学上,GAN 是一个"极小极大博弈"(minimax game)——G 想让"D 判断假图的失误率"越大越好,D 想让这个失误率越小越好。理论上,当两者都收敛到均衡点时,G 生成的分布 = 真实数据分布——也就是造出来的假图,从概率意义上和真图完全无法区分。
但训练 GAN 从来不轻松——G 和 D 力量失衡就完蛋:G 太弱,D 一眼看穿,G 无从改进;D 太弱,G 造啥垃圾都能骗过,永远不进步。工程上要靠各种技巧(学习率、批大小、正则化、渐进增长……)小心地维持这场博弈的平衡。
极小极大与纳什均衡:把两个术语翻译成人话
先拆极小极大(minimax)这个词。它听着玄,其实就是"我要在对手把我坑得最惨的前提下,做到我能做到的最好"。生活里到处都是:你去菜市场买菜,摊主想卖最贵(最大化自己的利益),你想买最便宜(最小化支出),最后成交价就是这个"极小极大"的结果。GAN 里的写法是这样的:
min_G max_D V(D, G)
└┬─┘ └┬──┘
│ └── D 想让这个值尽可能大(尽力抓假)
└───────── G 想让这个值尽可能小(尽力骗过)
V(D, G) = E[log D(真图)] + E[log(1 - D(G(z)))]
└──── ① ────┘ └────── ② ──────┘
翻译成人话:
① = "D 把真图认成真"的把握程度 ← D 想让它大
② = "D 把假图认成假"的把握程度 ← D 想让它大,G 想让它小
E[...] 里的 E 是"期望",说白了就是"平均值"——
不是看某一张图的表现,而是看成千上万张图的平均表现
再拆纳什均衡(Nash Equilibrium)。这个词来自博弈论,是数学家 John Nash(约翰·纳什,电影《美丽心灵》的主角)提出的,说白了就是一种"谁都不想再动"的僵持状态:在这个状态下,只要对手不变,你单方面改变策略只会让自己更亏,所以你选择不动;对手也一样。于是双方就卡在这儿了。
用餐馆定价来体会一下。街上两家面馆,你卖 15 我卖 15。你想涨到 18?客人全跑我这来,你亏。你想降到 12?我也跟着降,最后两家一起亏。所以你不敢动,我也不敢动——15 块就是这条街的纳什均衡。GAN 收敛到纳什均衡时的情形是:D 的输出恒定在 0.5(验钞员彻底放弃,只能靠猜),而 G 生成的图片分布 = 真实图片分布(假币和真币在统计意义上一模一样)。这时候 G 再怎么改进也没意义了,因为它已经完美;D 再怎么进修也没意义了,因为根本没有可抓的破绽。
理论很美,但这里藏着 GAN 一切痛苦的根源:梯度下降这套工具,本来是用来"下山找谷底"的,不是用来"找僵持点"的。找谷底时,你只要一直往低处走,总会到;而找僵持点像两个人在跷跷板两端找平衡——你往下压一点,对方就翘起来,对方压回来,你又翘起来,两人可能永远在上下振荡,谁也停不下来。数学上这叫"不收敛的循环轨道",实践中你看到的就是训练几万轮以后图还是一团糟。
更糟的是,原始论文那套"分布会收敛到相等"的证明,前提是D 每一轮都被训练到"最优"——也就是每训 G 一步,要把 D 训到彻底收敛。这在工程上完全做不到(那得多花几百倍算力),所以大家都用"D 训一步、G 训一步"的近似做法。于是理论保证在实践中一开始就作废了——这就是为什么 GAN 论文里的数学看着严密,真上手却全靠调参玄学。后面 WGAN 等一系列改进,本质上都是在补这个理论与实践之间的裂缝。
GAN 的名场面:从 64×64 到 4K 高清脸
| 年份 | 模型 | 标志性成果 |
|---|---|---|
| 2014 | 原始 GAN | Ian Goodfellow 提出概念,生成 64×64 的模糊人脸。 |
| 2015 | DCGAN | 把卷积引入 G 和 D,第一次生成清晰可辨的人脸和卧室。 |
| 2017 | CycleGAN | 无需配对样本就能做"马 ↔ 斑马"、"照片 ↔ 油画"风格迁移。 |
| 2018 | Pix2Pix | 草图变照片、黑白变彩色——图像转换的通用框架。 |
| 2018-2019 | ProGAN / StyleGAN | NVIDIA 生成 1024×1024 高清假人脸,thispersondoesnotexist.com 就是它。 |
| 2020~ | StyleGAN3 / BigGAN | 4K 分辨率、可控风格、以假乱真的动物 / 场景生成。 |
DCGAN:把"能跑起来"变成"能看清脸"
原始 GAN 的生成器和判别器用的都是全连接网络——所谓全连接,说白了就是"每个神经元跟上一层所有神经元都拉一根线",它完全不懂图片的空间结构,在它眼里一张 64×64 的图就是 4096 个互不相干的数字。结果就是生成的人脸糊成一团,只能勉强看出"这大概是张脸"。
2015 年的 DCGAN(Deep Convolutional GAN,深度卷积生成对抗网络)把卷积网络搬了进来。卷积这个词听着专业,其实干的活儿相当于拿一个小放大镜在图上一格一格地扫,每次只看一小片区域——这样网络天然就明白"相邻的像素是有关系的""眼睛这个图案不管出现在图的哪个位置都是眼睛"。DCGAN 一上,人脸和卧室照片第一次变得清晰可辨,GAN 才算真正走出实验室。
DCGAN 论文最大的贡献其实不是架构本身,而是它总结的一套"照着做就不容易崩"的经验清单。这份清单在之后好几年里被无数人当作起手式抄用:
| 经验做法 | 大白话解释 |
|---|---|
| G 用转置卷积逐步放大 | 从 4×4 的小方块开始,一层一层放大到 64×64——像画画先勾轮廓再填细节,不要一步到位。 |
| D 用带步长的卷积缩小 | 不用池化层(一种"取最大值缩图"的粗暴做法),改用可学习的卷积来缩,信息损失更少。 |
| 两边都加批归一化(BatchNorm) | 批归一化说白了就是"每层输出都统一量纲、别让数字忽大忽小",相当于炒菜时每道工序都控好火,不让锅忽冷忽热。 |
| G 用 ReLU,输出层用 tanh | ReLU 是"负数一律砍成 0"的简单函数;tanh 把输出压到 −1 到 1,正好对应归一化后的像素范围。 |
| D 用 LeakyReLU(斜率 0.2) | 普通 ReLU 把负数全砍成 0,梯度就断了;LeakyReLU 给负数留一点点斜坡(0.2 倍),相当于门不完全关死,留条缝让信息漏过去。 |
| 去掉全连接层 | 全程用卷积,参数少、更稳、还能推广到更大分辨率。 |
| Adam 优化器,学习率 0.0002,β₁=0.5 | 这两个数字是无数次试错试出来的"黄金参数",之后几年 GAN 论文几乎都照抄。 |
DCGAN 还发现了一件让人震惊的事:那 100 个随机数字构成的隐空间,居然是有"语义"的。你把"戴眼镜男人"对应的号码,减去"不戴眼镜男人"的号码,再加上"不戴眼镜女人"的号码,喂给 G——出来的是一个戴眼镜的女人。这个"号码可以做加减法"的现象说明,G 在训练中不只是学会了"照猫画虎",而是自己把"眼镜""性别""发型"这些概念拆开、各自安排到了不同的数字维度上。没有人教它这些概念,它是为了更好地骗过验钞员而自己整理出来的。
GAN 为什么这么难驯服:三大顽疾
模式崩溃:造假者的"偷懒"绝技
模式崩溃(mode collapse)是 GAN 头号顽疾。这个词听着抽象,用假币的故事讲就一秒懂:假币贩子摸索了半年,突然发现验钞机对"1999 年版的 100 元"检查得特别松。于是他不再费劲研究其他面额、其他年份了——他只印这一种,且每一张都印得一模一样。结果他确实能稳定骗过验钞机,但你去看他的仓库,里面堆的十万张钞票全是同一张的复印件。
放回 GAN 里就是:你训了一个人脸生成器,摇一万组不同的号码进去,出来的一万张脸长得几乎一样——同一个发型、同一个角度、同一个表情。技术上说,真实人脸的分布有成千上万个"峰"(各种年龄、性别、种族、发型),而 G 只学会了其中一个峰,把其他全丢了。"模式(mode)"这个词在这里就是指分布里的一个"峰"、一类典型样本。
为什么 G 会选择偷懒?因为GAN 的损失函数里没有任何一项在惩罚"缺乏多样性"。G 的全部目标只是"骗过 D",它并不关心"要造得五花八门"。这就像你给员工的考核只有"客户不投诉",那他最理性的策略就是找一个绝对不会被投诉的模板,然后无限复制——他没有任何动力去创新。判别器 D 理论上应该发现"这批假图全长一样,太可疑了",但 D 一次只看单张图打分,它看不到"这一批之间彼此重复"这个信息。这就是 mode collapse 的结构性漏洞。
治它的办法都围着这个漏洞打转。Minibatch Discrimination(小批量判别)让 D 一次看一整批,同时评估"这批图之间像不像"——相当于给验钞员配一台"查重机",一发现十万张钞票编号全一样,立刻报警。Unrolled GAN 让 G 在更新前"预演"D 接下来几步会怎么变,避免钻进一个马上会被封的漏洞。加噪声、加多个判别器、给隐向量加约束也都是常见手段。但说到底,这些都是打补丁,没有一个从根上解决了问题——这也是后来 Diffusion 能一举翻盘的重要原因:Diffusion 的训练目标天然覆盖全部数据,压根不存在"只学一个峰"的可能。
判别器太强或太弱:两头都是死路
GAN 调参的核心难点,可以浓缩成一句话:你必须让两个对手实力相当,谁也不能碾压谁。这跟一切竞技训练同理——让业余选手天天跟世界冠军打,业余选手只会崩溃退赛;让世界冠军天天跟业余选手打,冠军会退步。
先看"D 太强"这一头。判别器变成了火眼金睛,G 造出来的每一张假图都被打 0.001 分。这时候 G 收到的反馈是什么?"你错了,全错了,彻底错了"——但完全不告诉它哪儿错了、往哪个方向改。数学上,D 的输出被压到接近 0,而损失函数在这个区域的斜率几乎是平的,梯度算出来约等于 0,G 的参数根本动不了。这就像一个刚学做菜的人,师傅每次只说"难吃,倒掉",从不说盐多了还是火大了——他永远学不会。
为了缓解这个,Goodfellow 在原论文里就给了个小技巧叫 non-saturating loss(非饱和损失):不让 G 去"最小化 D 判对的概率",而改成"最大化 D 判错的概率"。这两个说法在文字上等价,但在数学上给出的梯度形状完全不同——后者在 G 表现很差的区域仍然有明显的梯度。这是 GAN 工程里第一个"数学上等价、实践中差天共地"的例子,之后这类技巧还有一大堆。
再看"D 太弱"这一头。判别器糊里糊涂,G 随便糊一张就能拿高分。那 G 就彻底没有进步的压力了——它会停在一个很低的水平上原地踏步。这相当于一位验钞员近视八百度还不戴眼镜,假币贩子用彩色打印机随便印印就过关了,他还改进什么工艺。所以 GAN 里有个反直觉的事实:你想让生成器变强,首先得保证判别器足够强——判别器的水平就是生成器的天花板。
那"刚刚好"怎么维持?工程上的常见手段包括:Two-Timescale Update Rule(双时间尺度更新,TTUR)——给 D 和 G 设不同的学习率(通常 D 慢一点、G 快一点),相当于给弱的一方"减负";D:G = 1:1 还是 5:1——调整两者的更新次数比例,WGAN 建议 D 多训几步再训一次 G;Label Smoothing(标签平滑)——训 D 时不告诉它"真图目标是 1.0",而说"目标是 0.9",让它别过分自信,相当于提醒验钞员"你也不是神仙,别把话说得太绝";给输入加噪声——让真图和假图的分布人为地产生一点重叠,避免前面提到的"完全不重叠导致梯度消失"。
| 训练崩溃的症状 | 你在样本图上会看到什么 | 常见成因 | 常规解法 |
|---|---|---|---|
| 模式崩溃 | 一万张图长得几乎一样 | G 找到了骗 D 的捷径且没人罚它单调 | 小批量判别、加多判别器、换 WGAN 损失 |
| 梯度消失 | 训了几万轮,图始终是一团糟 | D 太强,G 拿不到有效方向 | 非饱和损失、减弱 D、加输入噪声 |
| 训练振荡 | 图变好一阵又变差一阵,来回摆 | 两者在"跷跷板"上找不到平衡点 | 降学习率、TTUR、指数滑动平均(EMA) |
| 棋盘格伪影 | 图上有规律的方格状纹理 | 转置卷积的步长和核大小不匹配 | 改用"先插值放大再卷积" |
| 彻底发散(NaN) | 输出全变成纯色或程序报错 | 学习率太大、数值溢出 | 降学习率、梯度裁剪、检查归一化 |
把这张表看完,你就理解为什么 2017 到 2020 年的 GAN 论文读起来像"厨房事故报告集"了。GAN 是深度学习史上少见的"理论优雅、实践地狱"的典型——也正因为如此,当 Diffusion 拿出一个"照着训就行、几乎不会崩"的方案时,整个领域几乎在两年内就集体倒戈了。
WGAN 与推土机距离:换一把尺子量"像不像"
要理解 WGAN(Wasserstein GAN,瓦瑟斯坦生成对抗网络)为什么重要,得先明白原始 GAN 到底哪把"尺子"用错了。原始 GAN 衡量"假图分布"和"真图分布"差多远,用的是一个叫 JS 散度(Jensen-Shannon Divergence)的量。JS 散度这个词听着玄,它的毛病可以一句话说完:当两个分布完全没有重叠时,它给出的距离是一个固定常数,不管两者实际上离多远。
这个毛病有多致命?打个比方。你在玩"猜数字",我心里想着 100,你猜 3。我不能说"你太小了",只能说"错"。你改猜 5,我还是只能说"错"。你改猜 50,我依然只说"错"。你永远得不到"离目标越来越近"的反馈,只能瞎撞。GAN 训练早期恰恰就是这个局面——G 刚开始生成的图跟真图差得没边,两个分布毫无重叠,于是 D 只会说"假的、假的、假的",G 拿到的梯度几乎是 0,学不动。这就是梯度消失。
WGAN 换了一把尺子,叫 Wasserstein 距离,它还有个更直观的外号——推土机距离(Earth Mover's Distance)。这个名字本身就是它的解释:
院子里有两堆沙子。左边那堆是"你造出来的假图分布"——沙子堆在这里、那里、几个小丘。右边的图纸标着"真图分布应该长什么样"——哪个位置该有多高一堆沙。
你的任务:开一台推土机,把左边这堆沙子推成图纸上的形状。
Wasserstein 距离 = 完成这项工程最少需要多少"沙子×距离"的搬运量。要搬 10 吨沙、每吨平均推 5 米,代价就是 50;要搬 10 吨沙但只需推 1 米,代价就是 10。
这把尺子的妙处在于:它永远给你一个有意义的数字。两堆沙隔得远,数字就大;推近了一点,数字就变小;再推近一点,再变小。你每推一铲子,都能立刻从数字上看到进步——这就叫"梯度平滑"。
而 JS 散度那把尺子像个只会说"没推完"的监工:不管你推了一米还是一百米,只要没完工,它永远只说"没推完"。你完全不知道自己在不在正确方向上。
换尺子的代价:判别器 D 的角色也变了。它不再是"判真假的验钞员",而变成了"估算这项工程要花多少钱的造价师"——所以 WGAN 论文里干脆把它改名叫 Critic(评论家),输出也不再限制在 0~1 之间,而是一个可以任意大小的分数。
为了让这台"造价师"给出的报价是可靠的,WGAN 要求 D 必须满足一个数学条件叫 Lipschitz 连续(利普希茨连续)。这个条件听着吓人,说白了就是"你的打分不能太任性"——两张长得差不多的图,你给的分数也必须差不多,不能一张给 100 分、旁边那张只差一个像素却给 -500 分。生活里的类比是考试评分的一致性要求:两份几乎一样的答卷,分数不能差出三十分,否则这个评分标准就没有参考价值。
怎么实现这个约束?WGAN 第一版用的是简单粗暴的权重裁剪(weight clipping)——每次更新完,把 D 的所有参数强行截断到 [−0.01, 0.01] 区间内。这法子能用但很糙,相当于为了防止厨师放太多盐,直接把盐罐口封小——盐是少了,但菜也没法调味了,D 的表达能力被削弱得厉害。一年后的 WGAN-GP(WGAN with Gradient Penalty,带梯度惩罚的 WGAN)换了个优雅办法:不硬截参数,而是在损失里加一项惩罚,谁的打分变化太剧烈就罚谁。这个版本成了 2017 到 2020 年间事实上的标准配置。
WGAN 还给了工程师一个梦寐以求的东西:一条真正能看的损失曲线。原始 GAN 的损失曲线上下乱跳、跟生成质量毫无关系,你只能靠肉眼看图;WGAN 的 Critic 损失和生成质量高度相关——曲线往下走,图确实在变好。这听起来是小事,但对调参的人来说,等于从"闭着眼睛开车"变成"有了仪表盘"。
GAN 生成得好不好,怎么打分
这是一个比想象中麻烦得多的问题。评价一个分类器很简单——看准确率就行。但评价一个"画画的"呢?你没有标准答案可以对比,因为它生成的图本来就不该和数据集里任何一张一样(那就是抄了)。所以你需要一把能同时量两件事的尺子:画得像不像(质量)、画得杂不杂(多样性)。
第一代方案叫 IS(Inception Score,Inception 分数)。名字里的 Inception 是谷歌一个著名图像分类网络的名字。IS 的做法很机灵:拿一个现成的、很会认东西的分类器去看 GAN 生成的图,然后看两件事。第一,分类器对每张图的判断是否"果断"——如果它看着这张图说"98% 是金毛犬",说明图画得清楚;如果它说"20% 猫、18% 狗、15% 沙发……",说明这图糊成一团谁也认不出。第二,分类器对整批图的判断是否"五花八门"——如果一万张图它全判成"金毛犬",说明 G 模式崩溃了。
用面馆招人来类比:果断度相当于"每碗面都得是一碗地道的、能叫出名字的面",不能端上来一碗谁也说不清是什么的糊糊;多样度相当于"整个菜单要有牛肉面、阳春面、炸酱面各种品类",不能整本菜单只有一道菜。IS 分数高,意味着这家店既每道菜都做得地道,菜单又足够丰富。
但 IS 有个大漏洞:它压根没看真实数据集一眼。它只问"分类器认不认得出、种类够不够多",不问"你生成的图和真实照片像不像"。理论上你可以生成一堆"分类器很确信、但人眼看着诡异"的图,照样刷出高分。
于是有了第二代方案 FID(Fréchet Inception Distance,弗雷谢-Inception 距离),今天的行业标准。它的思路更实在:把真实图片和生成图片都送进那个分类器,各自取出中间层的特征,然后比较"这两堆特征的统计形状差多远"。所谓比较统计形状,说白了就是比较两堆点云的"中心位置"和"胖瘦形状"。
用鉴宝来体会 FID:一位老师傅看真品瓷器看了三十年,脑子里存着"真品的釉色、器型、胎质大概分布在什么范围"。现在你拿一批仿品给他看,他不是一件件说真假,而是整体判断:"你这批货的整体气质,跟真品那批的整体气质,隔了多远"。隔得越近,FID 越小。注意 FID 是"距离",所以越小越好,这跟 IS 越大越好正好相反,是新手最常搞混的一点。
| 指标 | 方向 | 它到底在量什么 | 短板 |
|---|---|---|---|
| IS(Inception Score) | 越大越好 | 单张图够不够清楚 + 整批图种类够不够多 | 完全不参照真实数据集,可被刷分 |
| FID(Fréchet Inception Distance) | 越小越好 | 生成图这堆点云 vs 真实图那堆点云,整体距离 | 假设特征服从"钟形分布",不总成立;样本量少时数值不稳 |
| KID | 越小越好 | 和 FID 类似,但对样本量少更友好 | 数值不如 FID 那么"人人熟悉" |
| Precision / Recall | 越大越好 | 把"质量"和"多样性"彻底拆成两个数字分别看 | 算起来更麻烦,论文里不如 FID 普及 |
| 人眼评测 | — | 找几十个人做"真假二选一",看猜对率 | 贵、慢、主观,但仍是最终裁判 |
给个可感知的量级:在 CIFAR-10 这个 3.2 万张小图的经典数据集上,2016 年的 GAN 的 FID 大概在 30 以上,2019 年顶尖模型压到 10 以下,今天最好的扩散模型能做到 2 左右。FID 从 30 降到 2,对应的观感差别相当于"一眼假的马赛克脸"到"你翻十遍都挑不出破绽的证件照"。
GAN 干过的那些事
假脸生成——thispersondoesnotexist.com 上每一张脸都是 StyleGAN 编出来的,现实中不存在这个人。
DeepFake 换脸——把电影明星的脸换到另一个人身上,这项技术引发过大量伦理讨论。
老照片修复 / 上色——把黑白祖辈照片上色、模糊照片修高清、破损照片补全。
风格迁移——把你的自拍变成梵高油画、水墨画、动漫风格。
超分辨率——把 480p 视频放大到 4K,靠 GAN "脑补"细节。
时装 / 商品设计——生成从未见过的服装、鞋子、家具样式,让设计师参考。
GAN 家族的四大代表作
下面四小节讲的是 GAN 时代最有影响力的四个变体。它们共同的思路是"在原始 GAN 的骨架上,加一个约束或加一个条件"——而每加一样,就打开一整片新的应用领域。
pix2pix:把 GAN 变成"图片翻译机"
pix2pix(读作"pix to pix",意思是"像素到像素")是 2017 年的一篇论文,它干的事一句话就能说完:给你一对一对的图,教网络学会"从左边那张翻译成右边那张"。比如给它一万对"建筑草图 ↔ 建筑照片",它就学会了把你随手画的草图变成照片;给它一万对"黑白照 ↔ 彩色照",它就学会了上色。
为什么非要用 GAN 才行?直接训一个网络"输入草图、输出照片",用像素差当损失不行吗?可以,但出来的图一定是糊的,这背后有个非常值得理解的道理。假设一张草图对应的合理照片有十种可能(墙可以是红的、白的、灰的……),你用"像素差最小"当目标,网络最理性的策略是输出这十种可能的平均值——而十种颜色一平均,就是一片灰蒙蒙的中间色。这就像让十个人对一道菜的咸淡投票,最后按平均值放盐,谁都不满意,做出来的菜没有味道。
GAN 的判别器解决了这个问题:它不问"你和标准答案差几个像素",只问"你这张看着像不像真照片"。一片灰蒙蒙的墙一眼就假,会被 D 毫不留情地打低分;而一面斑驳的红砖墙,哪怕跟标准答案的颜色完全不同,只要看着真实,D 就给高分。这就把网络从"求平均的怯懦"里解放出来,逼它敢于做出明确的选择。这是 GAN 在图像任务里最本质的贡献之一。
pix2pix 还引入了一个精巧的小设计叫 PatchGAN。普通判别器看完整张图给一个总分,PatchGAN 则把图切成很多 70×70 的小块,每块单独打分,最后取平均。这相当于质检员不看整件衣服的"整体感觉",而是拿放大镜挨个检查每一寸布料的针脚——这样对纹理、细节的把控更严,而且判别器参数少得多、跑得更快,还能直接用在任意大小的图上。
pix2pix 的局限是它要求严格配对的训练数据——每一张草图必须有一张对应的真实照片。这个要求有时候很容易满足(黑白照片就是彩照去色得来的,天然配对),但很多时候完全办不到。你上哪儿去找"同一匹马的马版和斑马版照片"?你不可能把一匹马刷成斑马再拍一张。这个死结,就要靠下面的 CycleGAN 来解。
CycleGAN:马变斑马,没有配对数据也行
CycleGAN 的思路堪称漂亮。它说:既然拿不到配对数据,那我只要两个"堆"就行——一堆马的照片,一堆斑马的照片,两堆之间没有任何对应关系。然后我训练两个转换器:一个负责"马 → 斑马",一个负责"斑马 → 马"。
问题是,没有标准答案,怎么知道转得对不对?CycleGAN 的答案是"循环一致性(Cycle Consistency)",这个词听着抽象,用翻译来解释就秒懂:
你要检验一个翻译软件靠不靠谱,最土也最有效的办法是:把中文翻成英文,再把这句英文翻回中文,看和原文差多远。
如果原文是"今天天气不错",翻成英文再翻回来还是"今天天气不错",说明这两个方向的翻译都靠得住;
如果翻回来变成了"今日的空气有点儿好玩",那中间某一步一定出了岔子。
CycleGAN 就是这么练的:
① 一张马的照片 → 转成斑马 → 再转回马 → 应该和原照片一模一样;
② 一张斑马照片 → 转成马 → 再转回斑马 → 也应该一模一样。
这个"来回一趟要能回到原点"的要求,就替代了配对数据的作用。它逼着网络"只改该改的(毛皮花纹),别乱改不该改的(马的姿态、草地、天空)"——因为你要是把马的姿势也一起改了,转回来就还原不了原图了。
同时还有两个判别器在旁边把关:一个专门看"你生成的斑马像不像真斑马",一个专门看"你生成的马像不像真马"。循环一致性管"内容别丢",判别器管"风格要真"——两个约束一夹,活儿就成了。
CycleGAN 一出,一大批"不可能配对"的转换任务全被打开了:照片 ↔ 莫奈油画(莫奈没法回来给你画同一处风景)、夏天 ↔ 冬天(同一片森林你得等半年才能拍到另一季)、苹果 ↔ 橙子、白天 ↔ 夜晚。今天手机相册里那些"一键把照片变油画/变动漫"的功能,思路源头基本都在这儿。
但 CycleGAN 也有它诚实的局限,论文自己就列了出来。它只能改"纹理和颜色",改不了"形状和结构"——把马变斑马它很行(只需换花纹),把猫变狗它就露怯(要改脸型、耳朵、鼻子的几何结构)。原因是循环一致性这个约束本身就在阻止大幅结构改动:改动越大,越难还原回去。这个"能改衣服颜色,改不了骨架"的性质,正是它的机制决定的。
超分辨率与图像修复:GAN 最实用的两块阵地
超分辨率(Super-Resolution,简称 SR)说白了就是把小图放大成清晰的大图。这事听着像常规操作,其实数学上是个"无解题":一张 100×100 的图放大到 400×400,你要凭空补出 15 万个新像素,而原图根本没有这些信息。传统放大算法(双线性、双三次插值)的做法是"取周围像素的平均值",结果就是糊,越放越糊——因为它在做前面说过的"求平均"。
SRGAN(2017)第一次把 GAN 用上来,效果立刻不一样。它的判别器不问"你补的像素对不对",只问"你补出来的这块看着像真照片的纹理吗"。于是网络学会了"编造合理的细节"——它知道人的皮肤该有毛孔、砖墙该有粗糙感、头发该有一根根的丝,于是它就大胆地"画"上去。
这里有个必须说清的诚实提醒:GAN 补出来的细节是"编"的,不是"还原"的。用修复老照片来体会:一位技艺高超的修复师,看到照片上模糊的一块衣领,他会根据自己见过的上千件同年代衣服,画一个"这里最可能长什么样"的衣领。画出来非常真实、非常合理,但那不是照片里原本那件衣领的样子。所以 GAN 超分绝对不能用在刑侦、医疗诊断这类场合——你把监控里模糊的车牌"超分"出来,出来的号码是 AI 编的,拿去当证据是要冤枉人的。
图像修复(Inpainting)是另一块阵地:照片上有块污渍、有个不想要的路人、有一道折痕,圈出来让 AI 补上。这件事 GAN 特别擅长,因为它有一个天生的优势——修复的关键是"补上去的那块要和周围无缝衔接",而这正是判别器最会评判的东西。判别器一眼就能看出"这块的光照方向不对""这块的颗粒感和旁边不一致",从而逼生成器改。今天 Photoshop 里的"内容识别填充"、手机相册里的"消除路人",早期版本用的就是这类技术。
StyleGAN 之外的另一条路:BigGAN 与"大就是好"
2018 年 DeepMind 的 BigGAN 走了一条跟 StyleGAN 完全不同的路子——不做精巧的架构设计,而是粗暴地把模型和批量都放大。它把批大小(batch size,一次同时看多少张图)从常规的 64 提到 2048,把模型参数放大四倍,在 1000 类、128 万张图的 ImageNet 上训练。结果 IS 分数从当时最好的 52 直接飙到 166。
为什么"批量大"对 GAN 帮助这么明显?可以这么理解:判别器一次看 64 张图,它对"真实世界长什么样"的印象是模糊的、有偏的;一次看 2048 张,它的判断就稳定得多。这相当于验钞员每次只摸 64 张钞票就下结论,跟每次摸 2048 张再下结论——后者显然靠谱得多。批量大同时也让"模式崩溃"更难发生,因为一批里重复太多会更容易被察觉。
BigGAN 还发明了一个很实用的旋钮叫截断技巧(truncation trick):生成时不用完全随机的号码,而是把那些"过于离谱"的随机数字砍掉,只用靠中间的那些。效果是——截断得越狠,图越漂亮但越单调;截断得越松,图越多样但越容易出怪东西。这就是一个直接摆在用户面前的"质量 vs 多样性"滑块,你可以自己决定要哪一头。用做菜类比:只用最保险的家常做法,每道菜都好吃但没惊喜;敢用冷门食材,可能出神作也可能翻车。这个"旋钮"的思路,后来在扩散模型的 CFG 参数上又出现了一次。
BigGAN 的代价是算力惊人——训练要用几百块 TPU 跑好几天,普通实验室完全复现不了。它证明了"GAN 也吃规模效应",但也第一次让人看到"生成模型的门槛正在变成算力门槛"。这个趋势在后来的扩散模型和大语言模型时代变得更加明显。
GAN 训练像两位书法大师互相较劲:一位专门临摹古人字帖(G),另一位专门鉴定"真古人 vs 仿的"(D)。两人越练越厉害,最后临摹的一方几乎可以以假乱真——但真正到了那一天,"临摹者"和"鉴定者"的水平已经不分伯仲。这就是 GAN 收敛的样子。
GAN 的困境与 Diffusion 的接棒
GAN 虽然效果炸裂,但训练极其不稳定、容易"模式崩溃"(只会生成几张固定图像)、可控性差。2020 年之后,扩散模型(Diffusion)横空出世——它训练更稳、生成质量更高、可控性更强,逐渐取代 GAN 成为图像生成的主流。Midjourney、Stable Diffusion、DALL-E、Sora,用的都是 Diffusion,不是 GAN。
但 GAN 并没有退场——在实时生成(速度快)、图像超分、风格迁移等场景,它依然是首选。而且它开创的"对抗训练"思想已经渗透到很多其他领域,比如对抗样本、鲁棒性训练、隐私保护。
为什么 GAN 训练如此难驯服
GAN 的训练是深度学习圈公认的"最难调"之一,因为它违反了梯度下降最喜欢的那种"目标稳定"假设——你在优化 G 时,D 也在动;你在优化 D 时,G 也在动。整个过程像两个人在同一根跷跷板上找平衡,稍不小心就崩:G 太强,D 每次都被骗过去,梯度信号消失;D 太强,G 无论怎么改都被识破,梯度全变负数,直接崩溃到只输出几张固定的假图(这就是臭名昭著的"模式崩溃")。
为此,工程师们发明了一堆花式技巧——WGAN 换了距离度量避免梯度消失、Spectral Norm 限制 D 的能力不让它太强、渐进增长先训小分辨率再加层、Two Timescale 让 G 和 D 学习率不同——每一样都是从血泪教训里总结出来的。你去顶级会议翻 2017-2020 年的 GAN 论文,能看到工程师们对着这台"喜怒无常的机器"绞尽脑汁的样子。
条件 GAN:让"造假"听话
原始 GAN 只能"随机"生成——你不能指定"给我一张笑脸的猫",它只会随机抽签。条件 GAN(cGAN)解决了这一点:把额外的信息(比如类别标签、文本描述、素描草图)也喂给 G 和 D,让 G 学会"按条件造假"、D 学会"按条件判断"。
这一个小改动打开了 GAN 的应用大门——Pix2Pix把它用在图像转换(草图 → 照片),StackGAN 用它做文本生图,StyleGAN 用它把风格向量作为条件精细控制生成人脸的年龄、性别、发型。今天你在网上看到的绝大多数 GAN 应用,本质上都是某种条件 GAN。
StyleGAN:可控性的巅峰
2018 年 NVIDIA 提出的 StyleGAN 是 GAN 时代最闪亮的一颗明珠——它把"生成"这件事拆成了"粗粒度到细粒度"的多个层次:早期层控制脸型、姿势这种大结构,中期层控制五官、发型,后期层控制皮肤纹理、光影。你可以像调音台一样,一层一层拨动这些"风格向量"——瞬间改变发型而保持五官不变、瞬间改变年龄而保持身份识别、瞬间改变光照而保持表情——这是原始 GAN 完全做不到的可控性。
StyleGAN 2 和 StyleGAN 3 进一步解决了闪烁、抖动、"贴纸感"等问题,让生成的假人脸能在动态镜头里也保持真实感。thispersondoesnotexist.com 那些让人分不清真假的头像,全部都出自 StyleGAN 系列。它的架构和思想直接影响了后来的 Diffusion 模型——比如 Stable Diffusion 里也保留着"控制风格"的机制。
为什么 GAN 被扩散模型超越了
2021 年 OpenAI 发了一篇标题极其直白的论文:《Diffusion Models Beat GANs on Image Synthesis》(扩散模型在图像合成上打败了 GAN)。这篇论文相当于给 GAN 时代画了句号。要理解这个翻盘,最好把两者的性质摆在一起对比:
| 维度 | GAN | Diffusion | 大白话解释 |
|---|---|---|---|
| 训练目标 | 两个网络对抗博弈 | 一个网络做回归预测 | GAN 是"打架",Diffusion 是"做作业"——后者当然稳得多 |
| 训练稳定性 | 极差,动辄崩溃 | 极好,几乎不崩 | GAN 要靠玄学调参,Diffusion 照着配置跑就行 |
| 多样性 | 容易模式崩溃 | 天然覆盖全分布 | Diffusion 的目标函数逼它照顾到每一张训练图 |
| 生成速度 | 一步出图,极快 | 要跑几十上百步,慢 | 这是 GAN 唯一还占优的地方 |
| 可控性 | 要专门设计条件机制 | 每一步都能插手干预 | Diffusion 一步步来,所以中途随时能给它塞指令 |
| 规模扩展 | 越大越难训稳 | 越大越好,规律清晰 | 这一条决定了商业化的胜负 |
最关键的其实是最后一条。GAN 的对抗训练在模型规模变大时会变得更加不稳定——BigGAN 已经证明了要投入几百块 TPU 才能勉强训稳。而 Diffusion 的训练是一个老老实实的回归任务(预测噪声),它越大越好、越多数据越好,且规律可预测。当整个 AI 行业进入"算力砸下去就有回报"的阶段时,Diffusion 这种"可扩展性"就是决定性优势。这就好比一门手艺,一个是必须靠师傅手感、规模化就走形的作坊工艺;另一个是能标准化、上流水线、越大越省的工业流程——商业世界只会选后者。
还有一个容易被忽略的原因:Diffusion 天生适合接文字条件。GAN 一步出图,你只有一次机会把提示词的信息塞进去;Diffusion 分几十步慢慢来,每一步都可以重新"看一眼提示词"再决定这步怎么改。这就像画画时你可以一边画一边反复参照参考图,而不是闭着眼睛凭记忆一笔画完。文生图这个最大的商业场景,因此天然倒向了 Diffusion。
GAN 现在还剩什么阵地
说 GAN "被淘汰了"是不准确的。它退出了"高质量文生图"这个主战场,但在几块阵地上依然稳稳占着位置,而这些阵地有一个共同特点:对速度的要求高到扩散模型追不上。
第一块:实时视频处理。视频会议里的虚拟背景、抠像、美颜、实时换脸、直播特效——这类场景要求每秒处理 30 帧,也就是每帧只有 33 毫秒。GAN 生成一张图只需要一次网络前向计算,几毫秒就够;扩散模型哪怕加速到 20 步,也要几百毫秒。33 毫秒 vs 几百毫秒,差了将近十倍,这是硬约束,调参调不过来。所以你手机上那些"实时"的滤镜效果,底层几乎清一色还是 GAN 或 GAN 的变体。
第二块:图像超分与画质修复。Real-ESRGAN 这类模型至今仍是开源社区里放大老照片、修复动漫画质、放大游戏贴图的主力。原因还是速度——你要批量处理一部电影的十万帧,GAN 几小时能跑完,扩散模型要跑几天。而且超分这个任务本身"自由度小"(输出必须紧贴原图),GAN 求平均的毛病在这里反而不太构成问题。
第三块:给扩散模型当"加速器"。这是一个有趣的反转。近两年一批技术(如 ADD、SDXL-Turbo、LADD)把扩散模型"蒸馏"成一步出图的模型,而蒸馏过程中用来保证"一步出的图仍然清晰不糊"的那个组件,正是一个 GAN 判别器。也就是说,扩散模型要想跑得像 GAN 一样快,得请 GAN 的判别器来帮忙。这相当于新一代掌门人打赢了老掌门,却要请老掌门来教自己轻功。
第四块:思想层面的遍地开花。这一块前面已经提过,但值得再强调一遍:GAN 真正不朽的遗产不是架构,而是"用一个学出来的网络当裁判"这个范式。从对抗鲁棒性训练,到大语言模型的奖励模型,到语音合成里的声码器(HiFi-GAN 至今是主流),到医疗数据的隐私脱敏——凡是"标准难以人工定义"的地方,就有 GAN 思想的影子。
如果你要亲手训一个 GAN,记住这几条
假设你今天要从零跑一个 GAN 项目,下面这几条是社区多年血泪浓缩出来的实操建议,读完能省你至少一周时间。
一,从最小的规模起步。不要一上来就冲 512×512 的高清人脸。先跑 MNIST 手写数字(28×28 的黑白小图),确认代码没写错、能生成像样的数字;再上 CelebA 人脸(64×64);确认这一步稳了再往上加分辨率。这就像学做菜先煎鸡蛋,别第一天就做佛跳墙——你连"锅热了没有"都还没手感。
二,一定要存"固定号码"的样本图。训练开始前,先摇 64 组随机号码存下来,之后每隔一千轮就用这同一组号码生成一次图并保存。这样你把这些图按时间排成一排,就能看到"同一个人"随训练慢慢从雪花变成人脸的完整过程——这是判断训练健不健康最直观的手段,比看任何损失曲线都管用。如果每次用新号码,你就分不清"变化"是因为模型进步还是因为换了号码。
三,抄现成的超参,别自创。DCGAN 那套(Adam、学习率 2e-4、β₁=0.5、批 128)是几百篇论文验证过的。你自己拍脑袋改学习率,十次有九次崩。调 GAN 的正确姿势是"先复现别人的成功配置,跑通了再一次只改一个东西"。
四,学会用 EMA。EMA(Exponential Moving Average,指数滑动平均)说白了就是不用当前这一刻的模型参数去生成图,而用"最近几千轮参数的加权平均值"。因为 GAN 训练是振荡的,某一刻的参数可能正好处在低谷;取个平均相当于不看某一天的股价,而看三十日均线,能显著地抹平抖动、提升出图质量。这个技巧几乎零成本,收益却很明显,StyleGAN 和后来的扩散模型都在用。
五,接受"它就是会崩"这件事。做好断点保存,每几千轮存一次完整权重。因为 GAN 有可能在训了三天之后突然崩掉——这时候你需要能回到崩之前那个检查点,而不是从头再来。把 GAN 训练当作一次"随时可能出事的长途驾驶"来准备,而不是一次"按下按钮就等结果"的批处理任务。
GAN 与伦理:一把双刃剑
GAN 造出的"以假乱真"的能力,从诞生第一天起就带着伦理阴影。DeepFake 换脸让人无中生有地"出现"在色情视频、假新闻里,损害了大量普通人的名誉。假身份证 / 假证件照让金融风控头疼不已。虚假历史照片让考古和历史研究面临真假难辨的挑战。
各国政府、平台、研究机构陆续给出反制方案:图像水印、GAN 检测器(反过来训练网络识别 AI 生成图)、法律层面的"深度伪造禁令"。但这场"造假 vs 打假"的对抗游戏,未来几十年都不会有终点——毕竟 GAN 的思想本身就是"造假 vs 打假"。理解 GAN,不光是理解技术,更是理解今天信息时代"眼见不再为实"的根本原因。
GAN 的思想为什么留了下来
虽然 Diffusion 已经在图像生成主战场上取代了 GAN,但 GAN 的核心思想——用一个网络当"评委"来指导另一个网络学习——已经渗透进整个深度学习圈,远远超出了"生成图片"这个原始场景。
对抗训练(Adversarial Training)被用来增强模型的鲁棒性——用一个网络专门找"能骗过模型的对抗样本",用另一个网络学着抵御,双方拉扯让模型更抗攻击。Actor-Critic 强化学习框架里,Actor(做决策)和 Critic(评价)也是一种类似 GAN 的博弈。差分隐私里,用一个网络专门生成"最像真数据的匿名数据"、另一个网络专门试着识别,两者对抗保护隐私。GAN 提出的这套"两个网络较量"的范式,可能是深度学习史上影响最深远的一个 idea——它教会我们,AI 不一定要有明确的目标函数,有时"内部竞争"本身就能催生智能。
GAN = 生成器 G + 判别器 D 的对抗游戏。这个"造假 vs 打假"的循环,教会了神经网络造出以假乱真的图像。它开启了 AI 生成艺术的第一次高潮,也为后来的 Diffusion 铺好了路。今天当你看到"AI 生成的美女不存在于世上"、"老照片一键上色"、"实时换脸滤镜",多半都还有 GAN 的血脉在流动。