造假者与鉴定师:GAN
Goodfellow, Pouget-Abadie, Mirza, Xu, Warde-Farley, Ozair, Courville, Bengio · NIPS 2014 · arXiv:1406.2661
让两个神经网络互相欺骗,直到假的骗过真的——这听起来像歪理,却是十年来生成式 AI 最优雅的思想之一。论文里那些吓人的词——极小极大博弈、纳什均衡、JS 散度——你一个都不用记。你只需要会做一件人人天生就会的事:分辨真假。来,先试试你的眼力。
你来当鉴定师
桌上放着八张钞票,四真四假。你是鉴定师。为了能画在一张图上,我们把一张钞票压缩成一个数:墨色深浅(0 最淡,100 最浓)。真钞出自同一台印钞机,墨色稳定;假钞嘛……你看了就知道。
点出你认为是假钞的圆点(再点一次可以取消),然后按「揭晓」——没什么大不了的,凭直觉点就行。
然而,被你识破的造假者不会认输。麻烦在于:它连真钞长什么样都没见过——它手里只有一台掷骰子的机器,和你刚打出的分数。这样也能学会造假?
造假者的车间
造假者(Generator,生成器,下文叫造假者 G)的车间里没有真钞样本,只有一个噪声源:每次吐一个随机数,你可以想成掷一把很多面的骰子。G 做的事是给噪声变形——把骰子点数乘一个「胖瘦」、加一个「中心」,变成一张钞票的墨色。造一万张,就得到一条红色的分布曲线。变形参数对了,红曲线就会盖住绿曲线。
先替它干一次活。拖动「中心」和「胖瘦」两个滑块,把红色的假钞曲线贴到绿色的真钞曲线上。拖的时候盯着右上角那个数字。
注意那个正确率:两条曲线一重合,它就从九十多一路往 50% 跌——曲线盖住的区域里,一张钞票既可能是真的也可能是假的,再火眼金睛的鉴定师也只能掷硬币。造假的目标不是造出"一张"以假乱真的钞票,是让假钞的整体分布盖住真钞的分布。
然而你能拖对,是因为你看得见绿线。G 看不见——真实分布对它是黑箱,它连自己造得像不像都无从知道。它唯一能拿到的信号,是鉴定师打出的那个分数。一个看不见答案的学生,一个不停打分的老师——把这两位锁进同一个房间,会发生什么?
锁进同一个房间
零件齐了:你在第一节亲手当过的鉴定师 D,你在第二节替它拖过滑块的造假者 G。GAN(Generative Adversarial Network,生成对抗网络)就是把两者锁在一起轮流出招。一回合 = D 先进化一步(拿最新的假钞重新校准打分曲线),再轮 G 进化一步(顺着 D 的打分曲线,往分数更高的方向挪自己的分布)。
图里那条蓝色虚线就是 D 的打分曲线——对 G 来说,它是一张登山地图:哪边分数高,就往哪边爬。连按「下一回合」,看红线一步步爬向绿线;每隔几回合,按「抽 6 张考考我」,亲自验收造假者的手艺。
第 0 回合你随手满分;第四、五回合你开始犹豫;到第 8 回合,你和世界上最强的鉴定师一样,正确率被钉死在 50%——只能掷硬币。不是你变笨了,是假分布和真分布重合了。再注意一个奇妙的分工:G 从头到尾没见过一张真钞,它对"真"的全部知识,都是从 D 的打分里一回合一回合偷学来的。D 越是努力抓假,就越是把"真钞长什么样"泄露给了对手。
论文里的那一行公式,其实就是这个房间的规则(可跳过)
minG maxD V(D,G) = Ex[log D(x)] + Ez[log(1−D(G(z)))]
中括号里的 V 是鉴定师的总成绩:给真钞(x)打高分、给假钞(G(z))打低分,成绩就高。D 想把成绩推到最大(max),G 想把它压到最小(min)——"你压我一头,我再扳回来",这就是极小极大(minimax)博弈。看一个数值例:
| D 给某张假钞打分 | log(1−D) | 对 G 意味着 | |
|---|---|---|---|
| 改进前 | 0.10(一眼假) | −0.11 | 成绩项接近 0,D 得意 |
| 改进后 | 0.40(开始像了) | −0.51 | 把 V 压小了,G 得分 |
你按的每一下「下一回合」,就是 D 和 G 各对 V 做一步 max 和 min——论文叫交替梯度下降。
然而,"最强鉴定师也只能掷硬币"听起来像系统坏了——花这么大力气,就为把一个好好的鉴定师训练到报废?为什么论文说 D 输出 ½ 恰恰是大功告成?
一张写着 ½ 的毕业证书
关键在"最强"两个字。给定真假两条曲线,存在一个谁也超不过的最优鉴定师,而且它有公式(论文 Proposition 1):在墨色 x 这一点,D*(x) = 真(x) / (真(x) + 假(x))——真钞密度占总密度的比例。这不是某个网络学出来的,是数学给出的天花板。
拖动「重合程度」滑块,从完全分开扫到完全重合,亲眼验证这个天花板在每一档的位置:
拖到头你会看到:两条曲线完全重合时,公式的分子分母处处相等,D*(x) 在每一点都等于 ½——打分曲线被压成一条死平线,正确率上限落在 50%。这不是哪个鉴定师学艺不精,是数学上不存在更好的鉴定师。所以 D 输出 ½ 不是故障报告,是毕业证书:它证明 G 的分布已经和真实分布重合。论文的 Theorem 1 说的就是这件事——整场博弈有唯一的全局最优点,当且仅当 假分布 = 真分布,此时 D* ≡ ½。判别器的失败,就是生成器的成功;整场博弈的终点线,画在 ½。
Theorem 1 还偷偷回答了一个更深的问题(可跳过)
G 的真正目标是"让假分布靠近真分布"——但"靠近"得有把尺子。麻烦在于:真实分布没有公式可查,我们手里只有一堆样本,这把尺子没法直接造。
论文证明了一件漂亮的事:当 D 达到最优时,博弈的总成绩 V 恰好等于两个分布之间的 JS 散度(Jensen–Shannon divergence,白话:一种衡量"两条曲线差多远"的距离)再加一个常数。也就是说——
D 本身就是那把尺子。G 每压低一分 V,就是在实打实地缩短与真实分布的距离。你在上图拖动"重合程度"时看到的正确率上限,就是这把尺子的读数:上限 92% 表示距离还很远,上限 50% 表示距离归零(JS 散度 = 0 当且仅当两分布相等)。训练一个鉴定师,其实是现场造了一台"距离测量仪"。
然而,这是黑板上的剧本。2014 年之后无数工程师会红着眼眶告诉你:这场博弈在现实里翻车翻得臭名昭著。第一种翻车,叫偷懒。
偷懒的造假者:模式坍缩
把设定换得更接近现实一点:真钞其实有两版——旧版墨色偏淡,新版偏浓,绿色分布有两座峰。现在想想,造假者最省力的策略是什么?只仿一版。因为 D 只回答"这张像不像真的",从不回答"你造的花色全不全"——只要仿得像,一招鲜也能拿高分。
按「播放」,看这场猫鼠游戏怎么循环(拖动滑块可以逐帧细看):
看红峰的走位:它扑向旧版,把旧版仿到乱真;D 察觉"旧版扎堆得可疑",把那一带的分数压下去;红峰立刻弃旧投新,整个搬到新版;D 再追过去,它再搬回来……循环往复,右上角的覆盖率永远卡在一半上下——两座峰,它永远只占一座。这就是模式坍缩(mode collapse,白话:一招鲜)——GAN 最著名的失败模式:生成的每一张单看都像真的,但翻来覆去总是那几张。D 管"像不像",没人管"全不全"——多样性这件事,赛场上没有裁判。
然而,就算 G 不偷懒,这场博弈还有一种更隐蔽的死法:两个对手,不搭。
棋逢对手
回想第三节的登山地图:G 的每一步,都踩在 D 打分曲线的坡度上。这注定了两种死法。D 太弱,打分曲线是一团乱麻,坡度一会儿指东一会儿指西,G 跟着噪声乱飘;D 太强,它直接把假钞区的分数全打成 0——打分曲线成了"平地 + 悬崖",而平地上没有坡度,G 站在原地一步也迈不动(论文原文就警告过这种梯度消失,还为此专门换了一版 G 的目标函数)。
最后这间实验室交给你。拖动「鉴定师功力」,按「运行 10 回合」,把三个区间都试一遍——挑战:找出能让红线真正贴上绿线的功力范围。
太弱是噪声,太强是悬崖,只有中间那一段坡度是路。对抗不是你死我活,是互相当陪练——陪练太菜或太狠,都练不出功夫。训练 GAN 的工程师每天的日常,就是想方设法让两个对手始终棋逢对手:这就是 GAN"难训练"恶名的来源,也是后来 WGAN、谱归一化这一整个小行业存在的理由。
假的骗过真的之后
这套博弈出自 Goodfellow 等人 2014 年的《Generative Adversarial Nets》。真实的 GAN 里,G 和 D 都是深度网络,样本不是一个墨色数字,而是几万维的图像——但你玩过的每一样都原封不动地在论文里:你按的「下一回合」是它的交替梯度下降,你拖到重合的两条曲线是 Theorem 1 的全局最优点,你在第五、六节亲眼看过的偷懒和悬崖,是此后十年整个领域排队要填的坑。
说句诚实的:今天你手机里的图像生成器,多半已经不是 GAN 了。2020 年代,扩散模型接过了图像生成的王座——恰恰因为它绕开了你刚撞过的那两堵墙:不用维持两个对手的微妙平衡,也不容易只学会一招鲜。GAN 交出了王座。
杠精清单:三个你可能正想问的问题
"D 最后只能掷硬币,那花力气训练它干嘛?"——D 是脚手架,不是产品。整场博弈真正要的是 G;D 的价值在过程里:它每一回合的打分,都是 G 唯一的教材。毕业典礼之后,脚手架照例拆掉。
"为什么不直接让 G 最小化'与真实分布的距离',非要绕个对手?"——因为真实分布没有公式,只有样本,"距离"根本没处算。GAN 的狡猾正在于此(见上一节的折叠区):训练 D 等于现学出一把量距离的尺子,量的和造的同步进化。
"一维高斯也太玩具了吧?"——承认,而且必须承认。真实 GAN 的样本是几万维的图像,坍缩的样子不是"红峰搬家",而是"翻来覆去生成同几张脸";平衡的难度也远比一个滑块残酷——所以才有了 DCGAN、WGAN、StyleGAN 这一整条修补链,人脸才从 2014 年的噪点马赛克进化到 2019 年的以假乱真。骨架,就是你玩过的这一套。
但"对抗"这个思想没有退场。用一个网络监督另一个网络——你在第三节里每按一次「下一回合」,扮演的就是那个不断进化、专挑破绽的对手——这个角色今天有了新名字:大模型上线前要过红队测试,一群人专职扮演骗子攻击它,逼它在对抗中变得更结实;deepfake 生成器和 deepfake 检测器正在互联网上真实上演你看过的那场追逐;"对抗样本""对抗训练"成了 AI 安全的日常词汇。鉴定师和造假者互相成就的那个循环,从论文里走出来,成了这个行业检验"真"的基本姿势。
所以,下次看到"AI 内容检测器又被新模型骗过"的新闻,你可以想起那条被你亲手考到 50% 的正确率线,并且比大多数人多懂一层:只要检测器还赢得了,就说明生成器还没毕业——而它们谁也离不开谁。