你在生产环境部署了一个图像分类模型,准确率 99.8%。我把一张熊猫图片加上一点点肉眼看不见的噪声,模型就信心十足地把它识别成长臂猿。这个故事你可能听过很多遍,但有一个问题很少被认真思考:防御者不断加固模型,攻击者不断寻找漏洞,这种对抗到底会不会停下来?如果会,停下来时的那副画面,是不是就是纳什均衡?

我第一次听到“对抗样本”时,以为这是模型训练不充分导致的缺陷。后来读到 Goodfellow 等人的对抗样本论文,才发现自己完全低估了这件事。它不是一个漏洞,而是高维空间里分类器行为的必然结果。
攻防其实是同一个优化问题的两边
攻击者的目标很简单:找到一个极小的扰动 δ,让模型在输入 x+δ 上给出错误答案。为什么需要极小?因为如果扰动肉眼可见,人类就不会再信任这个模型。攻击者要的是“模型错,人类看不出”。
2014 年提出的 FGSM 方法给出了一个异常简单的答案:沿着损失函数对输入的梯度方向,迈一小步。神经网络在高维空间里非常“线性”,这个梯度方向可以直接指向决策边界附近。你不需要理解模型内部,只需要能求导。
所以一次典型攻击的流程只有这四步:
- 准备一个替代模型,或者直接用目标模型;
- 计算损失函数对输入样本的梯度;
- 在梯度方向上添加一个受限的扰动;
- 把新样本喂给模型,观察是否被误判。
防御者的思路正好反过来。他无法一一枚举所有可能的攻击,所以只能考虑“最坏情况”。Madry 等人的论文把攻防写成了一个 min-max 优化问题:先让攻击者在受限的扰动空间内选择使损失最大的那个 δ,再让防御者去最小化这个最坏情况损失。这里的关键是,形式上是 防御者先选参数,攻击者再选扰动,所以这是一个由防御者领导的 Stackelberg 博弈,而不是双方同时出招的一次性博弈。
这个框架最优雅的地方,是它把“如何防御”变成了“如何求解一个带约束的优化问题”,而不是靠直觉堆技巧。
“We formulate the problem of robust model construction as a minimax game: minimize over the model parameters the worst-case loss over perturbations.”
——Madry et al., 2018
纳什均衡听起来很美,但攻防世界里它很难存在
如果把攻防看成博弈,一个自然的问题就是:这个博弈有均衡吗?
纳什均衡的定义听起来很简单:在一组策略组合下,给定其他人的策略,任何人都没有动机单方面改变自己的策略。放在 AI 安全里,就是给定攻击者的攻击分布,防御者已经把模型调到了最优;给定防御者的模型参数,攻击者也已经找到了最优扰动。此时双方都没有“换策略”的冲动,于是对抗就稳定下来。
听起来很美,对吧?但现实里这个均衡从未真正出现过,至少在目前的公开文献里,我还没看到过令人信服的实证。原因可以归结为两条:
- 策略空间不一致。攻击者的策略空间远超防御者所假设的扰动空间。这次攻击可能是一小段 L-inf 球内的噪声,下一次可能是修改少量像素的 L0 扰动,再下一次可能是旋转、平移这类几何变换。防御者只能根据自己设定的扰动空间来做对抗训练,而攻击者的真实策略空间往往更大。
- 信息不对等。真实攻击里,攻击者大概率不知道目标模型的内部参数,防御者也不知道攻击者会采用什么替代模型、什么损失函数。纳什均衡要求双方对彼此的策略空间有共同知识,这在开放环境下基本不成立。
为什么我的模型在未知攻击面前总是裸奔?
正因为上述原因,防御最难的地方不是“变得更强”,而是“不知道对手从哪个方向来”。
对抗训练是当前最主流的方法:把攻击样本混进训练集,让模型见过这些样本。但这个方法有一个致命的框架性假设:攻击者的扰动类型和训练时一模一样。如果攻击者把 L-inf 扰动换成 L0(修改少量像素)或者旋转、平移这类几何变换,对抗训练的效果就大幅下降。
雪上加霜的是,Athalye 等人的研究表明,很多看似安全的防御其实使用了“混淆梯度”,也就是让攻击者的梯度因为数值不稳定或随机跳过而失效。一旦攻击者绕过梯度,这些防御就会崩溃。通俗地说,你以为城墙很坚固,其实只是用纸糊的。
更麻烦的是对抗样本的可迁移性。训练好的攻击在替代模型上生成的样本,经常也能骗过目标模型。这意味着攻击者不需要知道目标模型的参数,只要有知识分布类似的一个开源模型就够了。防御者面对的是所有可能攻击的全体,攻击者只需要找到一扇开着的门。
我整理了一个简表,很多团队在做的防御策略基本都落在下面这几类里:
| 防御策略 | 原理 | 典型局限 |
|---|---|---|
| 对抗训练 | 在训练数据中混入对抗样本 | 只对生成这些样本的攻击类型有效;会降低干净样本上的精度 |
| 输入预处理 | 去噪、压缩、随机变换后再输入模型 | 攻击者可针对预处理过程求梯度,使防御失效 |
| 异常检测器 | 把输入投射到低维空间,判断是否远离数据流形 | 攻击者可以专门生成能骗过检测器的对抗样本 |
你可能会问,那把多种防御策略叠起来,会不会好一点?很遗憾,攻击者可以把随机化、去噪这些预处理手段都嵌入梯度计算,甚至针对整个防御管道生成攻击。防御的复杂度在增长,攻击的复杂度也在增长,而且攻击往往增长更快,因为攻击者只需要打破链条里最弱的一环。
为什么对抗训练会让模型在干净数据上变笨?
因为模型要从“在原始点上分类正确”升级到“在原始点周围一个小区间内都分类正确”。对于落在这两个要求边界上的样本,模型必须牺牲其中一种表现。Tsipras 等人 2019 年的理论分析指出,在某些数据分布下,鲁棒性和标准准确率之间存在根本性的此消彼长,不是调参能解决的。
我曾在纳什均衡上犯过一个错
我最早以为,只要把当前已知的所有攻击方式都防住,模型就达到了一个“防御均衡”。后来有一天我想通了:这个想法只看到了一张很窄的地图。
我试着在小模型上跑过对抗训练,把所有能想到的攻击都塞进训练集,模型确实变稳了。但换一种用语义扰动生成的攻击,准确率还是直线往下掉。后来我读到Ilyas 等人的论文,它给了我一个完全不同的视角:模型学习到的很多特征,在我们人类看来完全不相关,但对模型来说非常可靠。攻击者利用的正是这些“不可感知特征”,而不是模型逻辑上的漏洞。
这意味着,防御者不能指望靠给训练集“打补丁”来逼近均衡。你每封住一条攻击路径,攻击者只要一转身,就能换到一条你没有定义过的路。你训练的每一个防御,都只是在某一个“策略空间子集”里找局部最优,而不是在所有可能攻击策略里找全局均衡。
即便有均衡,也是上一秒的均衡
退一万步说,即使你真的到达一个均衡点,它也会瞬间移动。因为在真实世界里,防御者会开源模型,攻击者会在新模型上再训练;攻击者发布新攻击,防御者又会把它吸收进训练集。攻防双方都在不断修改自己的策略空间。这个循环没有终点,而且每一轮变化都会改变之前“均衡”的位置。
博弈论里这叫动态博弈,而且是不完全信息的动态博弈。每一时刻的均衡都依赖于当前信息结构,信息一变,均衡就消失。所以你问“纳什均衡在哪里”,我的回答是:它不存在于任何静态模型里,只存在于你为攻防双方设定的规则里。规则一变,均衡就消失。
博弈论留给我们的最后一个问题
最后说一点我的判断。今天的 AI 安全,尤其是对抗鲁棒性,仍然是一个“局部博弈”的解决方案:在某个明确的扰动空间里,你能做得非常出色;一旦离开这个空间,防御的脆弱就暴露无遗。这不代表对抗训练没有价值,而是提醒我们不要把条件结果误当成万能钥匙。
博弈论给 AI 安全最大的价值,不是提供一个“找到均衡”的算法,而是逼你回答三个问题:攻击者的策略空间到底是什么?防御者的策略空间是否覆盖了攻击者的可能行动?双方各自观察到什么信息?如果你能回答这三个问题,你就知道自己站在一个什么样的博弈里。如果回答不了,那所谓的“安全”很可能只是暂时的无知。
均衡在哪里?或许它根本不在终点,而在你不断重新界定规则的过程里。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/401.html