期末考试的深夜,学渣小张偷偷摸进办公室,手里攥着一支笔,想改几道答案。他不想整张重写,而是想在“不被老师发现”的前提下,让分数产生质变。这个画面,正是 AI 安全里对抗样本的缩影:攻击者在原始图像或文本上叠加细微改动,人类肉眼几乎分辨不出差异,AI 模型却瞬间从“确信”变成“误判”。小张面临的三个抉择,恰好对应三种度量改动的“标尺”:每一笔的力度能有多大?整张卷子的总用墨量有多少?一共能改动几个字母?第一把尺叫 L∞,限制每处变化的最大幅度;第二把尺叫 L2,限制扰动的总量;第三把尺叫 L0,数的是被改动的点位个数。而“老师会不会发现”的紧张感,就是扰动在人类眼中的可感知性。接下来,我们跟着小张的三次偷改尝试,理解对抗样本的威胁建模——动手之前先讲清规则,这决定了后续所有攻防实验的公信力。

岗位关联

对 AI 从业者而言,掌握 L∞、L2、L0 三类范数的扰动度量,是评估模型鲁棒性、设计针对性防御方案的底层能力——它决定了你的安全测试是否公平、防御投入是否打在要害上。

目录
  1. 可视化演示
  2. 威胁建模基础:先弄清“能改几笔”
  3. L∞ 范数约束:处处蜻蜓点水
  4. L2 范数约束:总量定死的涂改液
  5. L0 范数约束:只动几个命门
  6. 范数选择与感知:改法决定攻守
  7. 扰动量级与攻击强度:改多少才够奏效
  8. 威胁建模与防御设计:老师如何见招拆招
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

三步展示L∞/L2/L0范数约束下对抗扰动的不同分布特性:逐像素上限、能量受限与稀疏扰动,对比感知可检测性。

本节配有交互动效(进入视口后自动加载,约 3KB)。

L∞逐像素上限约束 所有像素均被微小扰动每个不超过ε 扰动均匀分布难以被人眼察觉 ||δ||∞ = max|δᵢ| ≤ ε 逐像素上限约束是白盒攻击中最常用的范数选择。

威胁建模基础:先弄清“能改几笔”

小张站在英语试卷前,没有急着动笔。他环顾四周,先盘算三件事:改卷老师什么时候来?自己是白天混进教室的普通学生,还是深夜潜入档案室的管理员?他想达到什么效果——只要总分多拿五分,还是必须把某道完形填空从 A 改成 B?这些提前的盘算,在 AI 安全领域有一个正式名字:威胁建模。威胁建模不是攻击的招式,而是攻击发生之前,把攻击者的画像、能力范围、行动目标写清楚的一张“行动计划书”。

在对抗样本的研究中,威胁建模需要明确四个关键要素。第一,攻击者的知识水平:他是否知道模型的结构、参数和梯度信息?知道就是“白盒”,完全不知道只能在输入输出上摸索就是“黑盒”。第二,攻击者能改什么:他能否直接修改输入数据,还是只能通过操控外部环境来间接影响输入。第三,攻击目标:只是想让模型随便犯个错(无目标攻击),还是要让模型精确输出某个指定错误结果(定向攻击)。第四,扰动预算:攻击者允许的改动幅度上限,这正是范数要度量的东西。

把这四个要素用数学语言对齐,对抗样本的求解可以写成一个优化问题:在允许的扰动范围内,寻找能让模型误判的最小改动。

威胁建模的严谨性直接决定后续攻防实验的可信度。小张如果连“改卷老师几点来”都没搞清楚就动手,大概率是白忙一场;安全工程师如果连攻击者预算都没有定义就做评估,得出的鲁棒性数字也只是一纸空文。规则先于招式,这是所有攻防故事的第一页。

min⁡δ  1[ f(x+δ)≠y ]s.t.∥δ∥p≤ε\displaystyle \min_{\delta} \; \mathbf{1}[\,f(x+\delta) \ne y\,] \quad \text{s.t.} \quad \|\delta\|_p \le \varepsilon
这个式子像一张“改卷记分牌”:扰动 δ 是改动向量,f(x+δ) 是模型对改后答案的判断,‖δ‖_p 是改动幅度,ε 是小张允许的最大用笔量。攻击者希望在不超过 ε 的前提下,让记分牌从“判对”翻转为“判错”。
  1. 指示函数当模型在扰动样本上判断错误时取 1,相当于攻击成功的记分指示灯
    1[ f(x+δ)≠y ]=1\mathbf{1}[\,f(x+\delta) \ne y\,] = 1
  2. 模型预测输出f(x+δ) 表示模型对扰动后输入给出的预测类别
    f(x+δ)f(x+\delta)
  3. 范数预算约束‖δ‖_p ≤ ε 限定扰动必须落在半径为 ε 的允许改动范围内
    ∥δ∥p≤ε\|\delta\|_p \le \varepsilon
  4. 最小化目标外面的 min 表示攻击者希望用尽量小的改动实现误判
    min⁡δ\min_{\delta}

L∞ 范数约束:处处蜻蜓点水

小张的第一种方案,是“全卷普改”。他拿起一支极细的铅笔,在几乎每道题的答案旁都轻轻点了一个印记——每一笔轻到像是纸上的灰尘,肉眼不凑近根本看不见。他赌的是:老师阅卷时快速扫过,根本不会发现这些浅浅的痕迹。这个策略的核心只有一个词:均匀且轻微。每一处的力度都被卡死在同一个微小上限之下,哪怕全卷都被改过,单看任何一处都不起眼。

这个“每一处都不能超过某个力度”的约束,在数学上就是 L∞ 范数。它度量的是扰动向量中绝对值最大的那个分量,也就是“改动最狠的那一笔有多重”。只要最重的一笔不超过 ε,整份改动就满足 L∞ 预算。最常见的 L∞ 攻击是快速梯度符号法(FGSM):沿着让模型损失增大的梯度方向,每个像素统一加上或减去 ε,一步完成。

小张的“全卷普改”有个致命弱点:虽然每一笔都浅,但架不住改的地方多。整张卷子布满密密麻麻的浅痕,凑近一看就像蒙了一层灰。L∞ 扰动同理——它限制的是“每像素最大变化”,当维度很高时,总改动量其实可能相当可观,人眼细看依然能识别出异常。这种“广而浅”的扰动模式,是 L∞ 最鲜明的性格标签。

∥δ∥∞=max⁡i∣δi∣≤ε\displaystyle \|\delta\|_\infty = \max_i |\delta_i| \le \varepsilon
L∞ 像一把“限高尺”:所有笔迹的浓淡都不得超过 ε 这条线。FGSM 之所以配合 L∞,是因为它只需要知道每个像素应该往哪个方向改,幅度统一设成 ε,计算极快。
  1. 最大值算子max_i 遍历所有像素,挑出改动幅度最大的那一个
    max⁡i∣δi∣\displaystyle \max_i |\delta_i|
  2. 绝对值的含义|δ_i| 表示第 i 个像素被改动的幅度大小,只看大小不看方向
    ∣δi∣|\delta_i|
  3. 统一上限约束最大的幅度也不超过 ε,意味着每个像素都被同一把限高尺卡住
    ∥δ∥∞≤ε\|\delta\|_\infty \le \varepsilon
  4. 方形约束区域在二维平面上,满足 L∞ 约束的点构成一个以原始样本为中心的正方形
    {δ:∥δ∥∞≤ε}\left\{\delta : \|\delta\|_\infty \le \varepsilon\right\}

L2 范数约束:总量定死的涂改液

小张换了个思路:我不再全卷都动,而是只选一部分题目下手。有的题涂得重一些,有的题轻轻带过,唯一的要求是整瓶涂改液的总量不能超过一小管。他揣着一管涂改液走进办公室,心里盘算:浓度的分配完全自由,只要总墨量不变,怎么挥霍都行。

这个“总量封顶、分配自由”的约束,就是 L2 范数。它把每个像素的改动平方后加起来再开根号,得到的是一个“总能量”的度量。平方的好处是正负方向的改动不会互相抵消:一个像素向右移 0.1、另一个向左移 0.1,在 L2 看来都是真实的改动能量。L2 约束下的扰动可以集中在少数像素上形成明显修改,也可以均匀分散到大量像素上各自轻轻一碰,只要总能量不超过 ε。

小张把涂改液用得很聪明:他把大半管墨都涂在分值最高的几道大题上,剩下的零头随便点了点小题。老师阅卷时,粗看卷面还算干净,只有个别地方涂痕略重——只要不盯着细看,很难察觉。这正是 L2 的战术哲学:用有限的能量创造最大的分数收益,既不像 L∞ 那样“全卷留痕”,也不像后面要说的 L0 那样“单点暴击”。

∥δ∥2=∑i=1nδi2≤ε\displaystyle \|\delta\|_2 = \sqrt{\sum_{i=1}^{n} \delta_i^2} \le \varepsilon
L2 像一管“限量涂改液”:总墨量固定,怎么分配是攻击者的事。著名的 DeepFool 攻击就是迭代地寻找让模型越过决策边界的最小 L2 扰动,所以它在 L2 度量下格外漂亮。
  1. 平方求和把所有像素扰动平方后相加,正负方向不会抵消
    ∑i=1nδi2\displaystyle \sum_{i=1}^{n} \delta_i^2
  2. 开根号还原尺度平方和开根号后得到与欧氏距离一致的“总能量”
    ∑i=1nδi2\displaystyle \sqrt{\sum_{i=1}^{n} \delta_i^2}
  3. 能量上限总能量不超过 ε,但能量在像素之间可以自由集中或分散
    ∥δ∥2≤ε\|\delta\|_2 \le \varepsilon
  4. 圆形约束区域在二维平面上,L2 约束是一个圆形区域,方向没有偏好
    ∥δ∥2=δ12+δ22\|\delta\|_2 = \sqrt{\delta_1^2 + \delta_2^2}

L0 范数约束:只动几个命门

小张越玩越精。他这次只带了笔,没带涂改液——全卷他只想改三处:把“100“改成”400“,把”B“改成”D“,把”第 5 题”选项涂掉重选。每一笔都浓墨重彩,改动幅度极大,但改动的位置极少。他心想:老师阅卷时大概率不会注意到这几个孤立的小改动,但只要改对了地方,分数就能暴涨。

数“改了几笔”的约束,就是 L0 范数。它统计扰动向量中非零元素的个数,也就是被实际修改的像素数量。L0 的数学写法很特殊:它不是把数值加起来,而是在数“谁不为零”。正因为如此,L0 不满足范数的齐次性和三角不等式,严格来说只是一个“拟范数”或计数函数。它的优化问题也异常棘手:要找到“最少的改动点达到攻击目的”本质上是组合搜索问题,复杂度极高,通常用贪心算法或进化算法近似求解。

小张的“三处重改”策略有一体两面:改动点少,老师随机抽查时大概率撞不上;但一旦撞上,那几处笔迹重得扎眼,立刻穿帮。L0 攻击也是同样的处境——它最隐蔽也最冒险。对于防御方来说,检测“少数像素的剧烈异常”恰恰是最容易下手的方向,这也是 L0 攻击在实际系统中常常折戟的原因。

∥δ∥0=#{i:δi≠0}≤k\displaystyle \|\delta\|_0 = \#\{i : \delta_i \ne 0\} \le k
L0 像一句“只准改 k 笔”的军令:不改则已,改则必是重手。著名的单像素攻击就是 L0 的极端形态——把一张图彻底翻转,只靠修改一个像素的值。
  1. 计数符号# 表示集合中元素的个数,这里数的是被改动的位置数量
    #{i:δi≠0}\displaystyle \#\{i : \delta_i \ne 0\}
  2. 非零判定条件δ_i ≠ 0 表示第 i 个像素确实发生了改动
    δi≠0\delta_i \ne 0
  3. 修改数量上限非零个数不超过 k,即最多只允许改 k 个像素
    ∥δ∥0≤k\|\delta\|_0 \le k
  4. 稀疏性表达当 k 远小于总像素数 n 时,扰动呈现高度稀疏的形态
    k≪nk \ll n

范数选择与感知:改法决定攻守

三种改法摆在桌上,小张陷入了选择困难。他发现,“怎么改”本身就是一种战术声明:全卷浅改、限量涂改、定点重改,这三种方案在“被发现的风险”和“改分的效率”上各有优劣。选择哪一种,取决于他对老师的观察结论:老师是快速扫视(防不住 L∞),还是逐题细看(L0 立刻穿帮),又或是喜欢抽查局部(L2 可能漏网)。

范数选择的本质,是定义“什么样的扰动才算可接受”。L∞ 要求每一点都温和,适合攻击那些依赖局部特征的模型;L2 允许能量集中,适合在人眼不敏感的区域做较大改动;L0 追求最少修改点,适合模拟真实世界中的物理篡改,比如贴一张小贴纸。三者对应的攻击难度也不同:L∞ 有 FGSM 这样的一步解法,L2 有 DeepFool 的迭代算法,L0 则基本要靠组合搜索,难度递增。

更重要的是,同一份扰动用不同的尺子量出的“大小”完全不同。数学上有一个恒成立的关系:

小张最终意识到,选择改法不是拍脑袋,而是对“对手行为”的推理结论。防御设计同样如此:不同的范数预算意味着不同的攻击者能力假设,也就对应着不同的防御投资方向。范数选择是攻防博弈的第一颗棋子,落子的位置决定了整盘棋的走向。

∥δ∥∞≤∥δ∥2≤∥δ∥1\displaystyle \|\delta\|_\infty \le \|\delta\|_2 \le \|\delta\|_1
这三把尺子不是彼此独立的标度,而是有严格的层级关系:任何一点的最大变化都不可能超过总能量,总能量又不可能超过绝对值之和。所以安全评估报告里必须写清楚用哪把尺子,否则“扰动很小”这句话毫无意义。
  1. 逐点不超过总量任意单一像素的改动幅度,不可能超过所有像素的平方和开根
    ∣δi∣≤∑jδj2\displaystyle |\delta_i| \le \sqrt{\sum_{j} \delta_j^2}
  2. L∞ 与 L2 的关系取最大值后,得到 L∞ 不超过 L2
    ∥δ∥∞≤∥δ∥2\|\delta\|_\infty \le \|\delta\|_2
  3. L2 与 L1 的关系平方和的平方根不超过绝对值求和,因为平方会放大较小项的比例
    (∑iδi2)1/2≤∑i∣δi∣\displaystyle \left(\sum_i \delta_i^2\right)^{1/2} \le \sum_i |\delta_i|
  4. 统一标尺的必要性同一个扰动向量,用不同范数量出的数值不同,比较预算前必须先统一度量
    ∥δ∥∞≤∥δ∥2≤∥δ∥1\|\delta\|_\infty \le \|\delta\|_2 \le \|\delta\|_1

扰动量级与攻击强度:改多少才够奏效

小张开始了他的“剂量实验”。第一晚,他每笔都改得极轻,结果分数一分没涨——改动太小,连判卷机器都没感觉到变化。第二晚,他把涂改液整瓶倒上去,分数确实暴涨,但卷面目不忍睹,第二天就被老师叫去谈话。他需要找到一条曲线:横轴是扰动幅度,纵轴是“改分成功率”。曲线上升得太慢说明改得太轻,上升得太快说明迟早暴露。

这条曲线在对抗样本中就是“扰动预算 vs 攻击成功率”的关系。扰动预算 ε 是攻击者的最大允许扰动幅度,也可以理解为攻击者的“胆量”;预算越大,攻击成功率通常越高,但扰动也就越容易被人类感知或防御算法检测。鲁棒性评估的核心工作之一,就是画出一族这样的曲线,观察模型在哪个预算水平上开始崩溃。

另一个关键指标是“最小成功扰动”:对每个样本,寻找能让模型误判的最小扰动大小。这个值越大,说明模型越难被骗。

小张的剂量实验最终画出了那条“改分曲线”,他找到了一个微妙的平衡点:改动大到足以改变答案,又小到不至于惊动老师。AI 安全里的威胁建模也是一样——设置合理的扰动预算,既不能小到让攻击者毫无威胁,也不能大到让防御方草木皆兵。这个平衡点的选择,本身就是风险评估的艺术。

\displaystyle \varepsilon^\* = \min_{\delta} \|\delta\|_p \quad \text{s.t.} \quad f(x+\delta) \ne y
ε* 是“刚好改分成功”的临界浓度。它相当于攻击者需要的“最小胆量”——模型越鲁棒,这个临界值就越高,攻击者需要冒更大的暴露风险才能得手。
  1. 最小化扰动度量对每个目标样本,寻找能让模型误判的所有扰动中最小的那个
    min⁡δ∥δ∥p\displaystyle \min_{\delta} \|\delta\|_p
  2. 误判约束条件候选扰动必须使模型预测结果不等于真实标签
    f(x+δ)≠yf(x+\delta) \ne y
  3. 临界扰动值这个最小化的结果记为 ε*,即攻击成功所需的临界扰动大小
    \displaystyle \varepsilon^\* = \min_{\delta} \|\delta\|_p
  4. 鲁棒性的直觉ε* 越大,说明攻击者需要越明显的篡改才能骗过模型
    \varepsilon^\* \uparrow \;\Rightarrow\; \text{鲁棒性} \uparrow

威胁建模与防御设计:老师如何见招拆招

班主任终于发现了小张的勾当。他连夜制定对策:第一,以后所有试卷统一用圆珠笔誊写一遍,铅笔改痕全部失效——这相当于输入预处理;第二,每道大题由两位老师独立阅卷,取一致性结果——这相当于分类器集成;第三,增加一轮“笔迹复查”,专门盯着那些改动突兀的地方——这相当于异常检测。老师的对策有一个共同点:全部是针对小张“具体改法”的精准反制。

这揭示了防御设计的第一性原则:防御必须与威胁模型对齐。如果威胁模型假设攻击者使用 L∞ 预算,那么最有效的防御是对抗训练——在训练过程中不断生成对抗样本,让模型见过这些“坏样本”后变得强壮。对抗训练的数学形式是一个“攻防嵌套”的优化问题:内层是攻击者在找最痛的扰动,外层是模型在练最硬的盾。

班主任的三条对策对应着三类经典防御:输入变换(JPEG 压缩、去噪滤波)、模型加固(对抗训练、鲁棒正则化)、异常检测(统计扰动分布特征)。但没有任何一套防御能同时防住所有范数的攻击——针对 L∞ 训练的模型,可能在 L2 的大扰动下依然脆弱;专门检测 L0 稀疏异常的系统,也对 L∞ 的均匀噪声无感。完整的威胁建模报告应当包含多范数下的鲁棒性评估,这才是一份能经得起红队推敲的安全答卷。

min⁡θ  E(x,y)[max⁡∥δ∥p≤εL(fθ(x+δ), y)]\displaystyle \min_{\theta} \; \mathbb{E}_{(x,y)} \left[ \max_{\|\delta\|_p \le \varepsilon} \mathcal{L}\big(f_\theta(x+\delta),\,y\big) \right]
这个内层取 max 的式子是在对每个样本主动求“最坏情况”:想象你每天都在被最厉害的学渣用最刁钻的方式偷改,久而久之,你对所有改法都麻木了。
  1. 内层最大化找最坏扰动固定模型参数,在预算内寻找使损失最大化的对抗样本
    max⁡∥δ∥p≤εL(fθ(x+δ), y)\displaystyle \max_{\|\delta\|_p \le \varepsilon} \mathcal{L}(f_\theta(x+\delta),\, y)
  2. 外层最小化练盾调整模型参数 θ,让最坏情况下的损失也尽量小
    min⁡θ\displaystyle \min_{\theta}
  3. 期望运算符对数据分布求期望,意味着模型要在所有样本上统一满足鲁棒性
    E(x,y)\mathbb{E}_{(x,y)}
  4. 攻防嵌套总目标对抗训练的思想是先当攻击者找最痛的点,再当防守者补最痛的伤
    min⁡θE(x,y)[max⁡∥δ∥p≤εL(fθ(x+δ), y)]\displaystyle \min_{\theta} \mathbb{E}_{(x,y)} \left[ \max_{\|\delta\|_p \le \varepsilon} \mathcal{L}(f_\theta(x+\delta),\, y) \right]

AI 应用场景

人脸识别门禁系统的红队测试

阶段:模型上线前的安全评估

解决的问题:传统评估只看正常通过率,忽略了攻击者可以用打印的对抗贴纸贴在眼镜框上骗过活体检测。红队工程师先按威胁建模约定攻击者能力(黑盒、L2 预算 0.6),再批量生成扰动样本,评估系统在不同预算下的错误接受率。

具体案例:某园区门禁在红队测试中,用 L∞ 预算 0.05 的快速梯度符号法攻击,发现识别错误率从 0.1% 飙升到 23%,立刻要求供应商补充对抗训练与输入去噪模块,并建立每周复测机制。

自动驾驶交通标志识别的物理攻击防护

阶段:感知模型的鲁棒性加固

解决的问题:路边的“停止”标志被贴上小片污渍后,模型可能识别成“限速 40”。这类物理篡改天然是 L0 稀疏扰动——改动区域很小但幅度很大,恰好能用 L0 范数建模。

具体案例:某自动驾驶团队的感知模型在仿真中引入 L0 单像素攻击测试,发现仅修改标志上 3 个关键像素就能让分类置信度骤降。团队随后在训练管线中加入 JPEG 压缩与中值滤波预处理,并针对高梯度敏感区域做掩码正则,将最小攻击像素数从 3 提高到 17。

内容审核模型的威胁建模报告

阶段:生成式 AI 服务的安全合规审核

解决的问题:内容审核模型要防的不是普通用户的无心输入,而是恶意用户精心构造的对抗性文本或图像。安全团队需要一份同时覆盖 L∞、L2、L0 三种预算下的鲁棒性曲线,才能判断模型是否达到上线门槛。

具体案例:某大模型平台的审核模块在评估报告中新增“多范数鲁棒性矩阵”:横轴是三种范数预算,纵轴是绕过率。结果显示模型在 L2 预算 3.0 下绕过率达 12%,团队据此优先加固 L2 方向的防御,而不是盲目增加模型规模。

Python 演示

python63 行
import numpy as np def make_data():    rng = np.random.default_rng(7)    X = rng.standard_normal((120, 3))    w_true = np.array([1.5, -1.0, 0.8])    y = np.where(X @ w_true + rng.normal(0, 0.5, 120) > 0, 1, -1)    return X, y def train_lr(X, y, iters=800, lr=0.2):    w = np.zeros(X.shape[1])    b = 0.0    for _ in range(iters):        z = X @ w + b        p = 1.0 / (1.0 + np.exp(-y * z))        w -= lr * np.mean((p - 1) * y[:, None] * X, axis=0)        b -= lr * np.mean((p - 1) * y)    return w, b def grads(x, y, w, b):    p = 1.0 / (1.0 + np.exp(-y * (x @ w + b)))    return -y * (1.0 - p) * w def attack_inf(x, y, eps, w, b):    return eps * np.sign(grads(x, y, w, b)) def attack_l2(x, y, eps, w, b):    g = grads(x, y, w, b)    return eps * g / np.linalg.norm(g) def attack_l0(x, y, k, w, b):    g = grads(x, y, w, b)    idx = np.argsort(np.abs(g))[-k:]    d = np.zeros_like(x)    d[idx] = 0.6 * np.sign(g[idx])    return d def norms(delta):    return [        int(np.count_nonzero(delta)),        round(float(np.linalg.norm(delta)), 4),        round(float(np.max(np.abs(delta))), 4),    ] def main():    X, y = make_data()    w, b = train_lr(X, y)    i0 = next(i for i in range(len(X)) if np.sign(X[i] @ w + b) == y[i])    x, y0 = X[i0], y[i0]    pred0 = int(np.sign(x @ w + b))    print("original sample prediction:", pred0, "label:", y0)    attacks = [        ("Linf(eps=0.05)", attack_inf(x, y0, 0.05, w, b)),        ("L2(eps=0.6)", attack_l2(x, y0, 0.6, w, b)),        ("L0(k=1)", attack_l0(x, y0, 1, w, b)),    ]    for name, delta in attacks:        pred = int(np.sign((x + delta) @ w + b))        L0, L2, Linf = norms(delta)        print(f"{name}: L0={L0} L2={L2} Linf={Linf} pred={pred}") if __name__ == "__main__":    main()
目的:训练一个简单的逻辑回归分类器,对同一个样本分别施加 L∞、L2、L0 三种范数约束的攻击,打印每种扰动的三个范数值与攻击前后的预测结果,直观感受同一攻击意图在不同标尺下的度量差异。
  1. p = 1.0 / (1.0 + np.exp(-y * z))计算逻辑回归对正负样本的预测概率,这是计算梯度的基础
  2. w -= lr * np.mean((p - 1) * y[:, None] * X, axis=0)梯度下降更新权重,让模型先学会正确分类
  3. return -y * (1.0 - p) * w求损失对输入 x 的梯度,告诉攻击者“往哪个方向改能最快激怒模型”
  4. return eps * np.sign(grads(x, y, w, b))L∞ 攻击:每个特征都按梯度符号改满 eps,一步完成
  5. return eps * g / np.linalg.norm(g)L2 攻击:沿梯度方向走固定总能量,方向最陡、总量受控
  6. idx = np.argsort(np.abs(g))[-k:]L0 攻击:找出梯度绝对值最大的 k 个特征,只在命门上动手
  7. d[idx] = 0.6 * np.sign(g[idx])对选中的极少数特征施加大幅扰动,体现 L0 的“少而重”
  8. np.count_nonzero(delta)统计 L0 值:数一数到底改了几个特征
  9. next(i for i in range(len(X)) if np.sign(X[i] @ w + b) == y[i])挑一个当前预测正确的样本,保证攻击演示从“成功辨对”走向“被忽悠”更有说服力

常见误区

误区L0 不就是统计非零个数吗?跟 L1、L2 一样都是范数家族,应该也满足范数的一切性质,可以用常规梯度法优化。

正解L0 只统计非零元素的个数,不满足范数的齐次性(把扰动整体放大 10 倍,非零个数不变)和三角不等式,严格说是“拟范数”或计数函数。它的优化是组合搜索问题,梯度法完全失效,只能靠贪心、进化算法等手段近似。把它当普通范数用梯度下降,梯度处处为零,寸步难行。

为何常见:教材和论文里习惯性写成“L0 范数”,符号上与 L1、L2 并列,初学者很容易默认它继承了范数的全部性质。

误区L∞ 限制每个像素的最大变化,所以每个像素都改得很小,那整个扰动的总能量肯定也很小,肉眼肯定看不出来。

正解L∞ 只限制最大分量,不限制分量个数。一个含 100 万像素的图像,如果每个像素都被扰动了 ε,那么 L2 范数会达到 ε 乘以 1000,总量相当可观。L∞ 攻击在维度很高时常常产生“全图均匀蒙尘”的效果,人眼细看完全能察觉。

为何常见:直觉上认为“最大值小 = 整体小”,忽略了高维空间中大量小值的累加效应。

误区攻击要强力,预算 ε 就要往大了设,反正模型越错越说明攻击有效。

正解预算越大,攻击成功率确实越高,但扰动也会越容易被人类察觉,防御侧的异常检测器也越容易抓到你。真实攻击的目标是“在人眼不察觉或物理可实现的前提下骗过模型”,预算的选择本质是攻击成功率与可感知性之间的权衡。评估时也会限定预算,超出预算的攻击即使成功也不在威胁模型允许范围内。

为何常见:只看模型精度不看人类感知,把“更猛”和“更强”画了等号。

误区反正都是度量扰动大小的,L2 和 L∞ 差不多,报告里写哪个都一样。

正解两者定义了完全不同的扰动空间:L∞ 是方形球,限制每个坐标的绝对值;L2 是圆形球,限制总能量。同一个攻击向量在两种标尺下的数值可能差异巨大,模型在 L∞ 鲁棒性评估中表现好,不代表在 L2 评估中同样安全。严谨的鲁棒性报告必须同时给出多种范数预算下的指标。

为何常见:二者都叫“距离”,日常图像处理又常用均方误差(本质是 L2),容易让人忽略它们约束的空间形状完全不同。

误区模型做过对抗训练,报告上的鲁棒性数字很漂亮,那不管对手用什么范数攻击应该都扛得住。

正解标准对抗训练是在某一种范数(通常是 L∞)和固定预算下生成训练样本的。它只见过这种形状的扰动,面对 L2 的大能量集中攻击或 L0 的稀疏点攻击时,泛化能力有限。要覆盖多种威胁模型,需要做多范数联合训练或在评估时分别报告各范数预算下的鲁棒精度。

为何常见:只看到“鲁棒性提升 80%”这类总体指标,没有深究这个指标是在哪把尺子、哪个预算下量出来的。

面试题

Q1. 下列哪项最符合“对抗样本”的定义?

单选题 · easy

  • A.随机噪声导致的识别失败
  • B.精心设计的小扰动,使模型出错← 正确答案
  • C.训练数据中被标注错误的样本
  • D.模型参数被外部攻击者篡改

答案:B。对抗样本是攻击者刻意构造的、人眼不易察觉的微小扰动,目的是让模型输出错误结果。A 的随机噪声缺少“刻意构造”和“定向误导”;C 是数据质量问题;D 是模型本身的篡改。就像小张偷改试卷是有目标、有节制的行为,而不是试卷被风吹皱。

Q2. L∞ 范数衡量的是扰动的哪个属性?

单选题 · easy

  • A.各分量平方和的平方根
  • B.非零分量的总个数
  • C.分量绝对值中的最大值← 正确答案
  • D.所有分量绝对值之和

答案:C。L∞ 取的是扰动向量中绝对值最大的分量,相当于“最重的那一笔有多重”。A 是 L2 的定义,B 是 L0 的定义,D 是 L1 的定义。小张想限制“每一笔的最大力度”,就应该用 L∞。

Q3. 扰动向量 δ=(0.1,-0.2,0.05) 的 L∞ 范数是多少?

单选题 · easy

  • A.0.05
  • B.0.10
  • C.0.20← 正确答案
  • D.0.35

答案:C。L∞ 是各分量绝对值的最大值。绝对值为 0.1、0.2、0.05,最大的是 0.2。0.35 是三个数的绝对值之和(属于 L1),0.1 是第一个分量,0.05 是第三个分量。取“最重一笔”正是 L∞ 的语义。

Q4. L2 范数约束主要限制的是?

单选题 · mid

  • A.每个像素的最大变化幅度
  • B.被修改像素的数量上限
  • C.扰动向量的总能量大小← 正确答案
  • D.扰动方向必须唯一固定

答案:C。L2 把各分量平方求和后开根号,度量的是扰动的总能量。A 是 L∞ 的限制,B 是 L0 的限制,D 与 L2 无关——L2 只限制能量大小,不限制方向。就像小张的涂改液总量固定,但涂在哪些题上完全自由。

Q5. 关于 L0 范数正确的说法有哪些?

多选题 · mid

  • A.统计向量中非零元素的个数← 正确答案
  • B.它的优化属于凸优化问题
  • C.追求修改尽可能少的像素← 正确答案
  • D.严格满足范数三角不等式

答案:AC。L0 数的是非零元素个数,对应“最少修改点”的稀疏攻击,A、C 正确。L0 优化是组合搜索问题,非凸,B 错误;L0 不满足三角不等式(如 (1,0) 和 (0,1) 合并后非零个数从 1 变 2),不是严格范数,D 错误。

Q6. 快速梯度符号法(FGSM)主要配合哪种范数?

单选题 · mid

  • A.L0 范数
  • B.L1 范数
  • C.L2 范数
  • D.L∞ 范数← 正确答案

答案:D。FGSM 让每个像素都沿着梯度符号方向改动同一个 ε,充分利用 L∞ 约束下“每像素上限相同”的特点,一步生成对抗样本。它不需要 L0 的组合搜索,也不像 L2 攻击那样需要计算归一化方向。

Q7. 已知扰动向量满足 L2≤0.5,其 L∞ 范数必然?

单选题 · mid

  • A.同样小于等于 0.5← 正确答案
  • B.必然大于等于 0.5
  • C.恰好等于 0.5
  • D.与 L2 没有任何关系

答案:A。任意分量的绝对值都不可能超过所有分量平方和的开根号,所以 L∞ 必然不超过 L2。既然 L2≤0.5,L∞ 也必然≤0.5。这是范数层级关系 ‖δ‖∞ ≤ ‖δ‖₂ 的直接推论。

Q8. 威胁建模时需要明确的要素有哪些?

多选题 · mid

  • A.攻击者知识是白盒还是黑盒← 正确答案
  • B.扰动范数与预算的大小← 正确答案
  • C.攻击目标与期望误判← 正确答案
  • D.模型的训练优化器类型

答案:ABC。威胁建模要回答“谁能攻击、能改多少、想达成什么”:攻击者知识(A)、扰动预算(B)、攻击目标(C)都是核心要素。D 的训练优化器是模型内部实现细节,威胁建模阶段不需要也不应该受其约束。

Q9. 对抗训练的核心思想是?

单选题 · mid

  • A.扩大训练数据集的规模
  • B.训练时注入对抗样本增强鲁棒性← 正确答案
  • C.增加网络层数以提升模型容量
  • D.提升输入图像的分辨率大小

答案:B。对抗训练是在训练过程中动态生成对抗样本并让模型学会正确分类,即“先当攻击者找最痛的点,再当防守者补最痛的伤”。A、C、D 都是常规提升性能的手段,但没有针对恶意扰动的建模,无法提升鲁棒性。

Q10. 对抗扰动预算 ε 增大时,通常会出现哪些现象?

多选题 · extreme

  • A.攻击成功率随之上升← 正确答案
  • B.扰动更容易被人类察觉← 正确答案
  • C.防御方需调整安全边界← 正确答案
  • D.模型的精度必然同步提升

答案:ABC。预算增大意味着攻击者可以改得更狠,成功率上升(A),扰动也更显眼、更容易被感知或检测(B),防御方需要重新评估安全边界(C)。D 完全错误——扰动预算与模型在干净数据上的精度没有正向关系,反而可能因过度防御而下降。