小明花大价钱换了一款号称“三重防护、绝对安全”的 AI 智能门锁。可广告吹得越响,他心里越犯嘀咕:锁厂自己测出来的数据再漂亮,万一遇上手法刁钻的开锁高手,这锁扛得住吗?于是他决定搞一场“实战演习”:请来几位开锁师傅,有人拿着锁芯图纸上阵,有人只能隔着门板盲试,每人还被限定了工具与次数。结果,一位师傅仅凭一片锡纸,三秒钟就开了门——锁没坏,可它确实被“骗”开了。这个故事,正是 AI 领域“对抗鲁棒性评估”的缩影:模型就像那扇门锁,对抗样本就像锡纸钥匙,在几乎不被察觉的微小改动下,让强大的模型瞬间失守。本文将以这场攻防演习为主线,带你搞懂什么是鲁棒性评估、攻击者如何出招、我们如何量化模型的安全底线,以及怎样通过评估与对抗训练让模型真正“扛揍”。

岗位关联

学会鲁棒性评估,就掌握了给 AI 模型做“安全质检”的硬本领——这是算法工程师、AI 安全研究员和数据科学家评估模型可信度、通过合规审查的必备核心技能。

目录
  1. 可视化演示
  2. 评估基础概念
  3. 威胁模型定义
  4. 攻击策略选择
  5. 经典攻击实现
  6. 评估指标体系
  7. 评估流程实施
  8. 对抗训练防御
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示对抗鲁棒性评估方法的核心机制,通过总览/传输/转换/输出四种模式展示关键概念与交互流程。

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

对抗鲁棒性评估方法:鲁棒性评 鲁棒性评估的定义与可信评估动机 威胁模型与扰动范数约束的界定 核心机制可视化 对抗鲁棒性评估方法整体架构与关键组件

评估基础概念

小明花大价钱装了“AI 智能门锁”,广告里吹得天花乱坠,可他还是不放心。于是他请来开锁师傅搞实战演习,结果一位师傅用一片锡纸三秒开锁。锁没有坏,开锁方式也完全超出常规——这种“看似正常却瞬间被破解”的输入,在 AI 领域就叫对抗样本。它是在原始数据上施加人眼几乎察觉不到的微小扰动,却能让模型输出完全错误的预测。

给一张“停车”标志贴上几条不干胶,自动驾驶系统就可能把它认成“限速 80”;在猫的照片上叠加一层几乎看不见的噪声,分类器就坚称那是“吉他”。模型在正常样本上表现优异,却在被精心篡改的输入面前频频翻车,这种不稳定的性质就是缺乏鲁棒性。鲁棒性评估要回答的核心问题正是:这个模型面对恶意篡改时,到底有多稳?

我们用一个形式化条件来刻画“鲁棒”:对任意满足约束的扰动,模型输出应保持不变。

就像小明通过演习才发现锁的“锡纸漏洞”,AI 工程师也只有通过系统化的攻防测试,才能发现模型的“对抗漏洞”。评估的意义不是证明模型完美,而是诚实地告诉所有人:它在什么条件下值得信赖,在什么条件下会失守。

f(x)=f(x+δ),∥δ∥p≤εf(x) = f(x + \delta), \quad \|\delta\|_p \le \varepsilon
通俗地说:无论攻击者在输入上做多么微小(但恶意)的改动,模型都必须给出与原来一致的答案。
  1. 模型预测f(x) 表示模型对原始输入 x 的预测结果,它是整个鲁棒性讨论的“基准答案”。
    f:X→Yf: \mathcal{X} \to \mathcal{Y}
  2. 扰动叠加x + δ 是在原始输入上叠加微小扰动 δ 后得到的对抗样本。
    x^=x+δ\hat{x} = x + \delta
  3. 预算约束‖δ‖_p ≤ ε 限制扰动大小,ε 越小改动越隐蔽,p=∞ 时逐元素约束。
    ∥δ∥p≤ε\|\delta\|_p \le \varepsilon
  4. 鲁棒条件要求模型对原始样本与扰动样本给出相同预测;一旦不等,攻击即告成功。
    f(x+δ)≠f(x)  ⇒  attackf(x+\delta) \neq f(x) \;\Rightarrow\; \text{attack}

威胁模型定义

小明的开锁演习并非胡来,而是有严格规则的:师傅们被分成两组,一组拿到锁的内部结构图纸,一组只能隔着门板盲试;每个人都必须说清目标是“打开门就行”还是“必须打开保险柜”;工具也有上限,只许用一根铁丝,不能带电钻。规则定好,演习结果才有可比性。

这套规则在 AI 领域就叫“威胁模型”。评估鲁棒性之前,必须先定义三个要素:攻击者知道什么、想达成什么、能使用多大能力。攻击者知识分为白盒与黑盒:白盒攻击完全掌握模型结构与参数,能直接计算梯度;黑盒攻击对模型一无所知,只能通过查询输入输出或迁移替代模型来构造样本。攻击目标分为无目标攻击与有目标攻击:前者只求“让模型犯错”,后者要求“把样本判成指定类别”。攻击者能力则用扰动预算 ε 来约束。

威胁模型用数学语言写出来,就是一组约束加上一个目标:

规则不同,演习结论就完全不同。白盒测试 100% 攻破的锁,黑盒测试可能只有 30% 攻破率;预算 ε 放宽一倍,准确率可能骤降。所以评估报告必须写清威胁模型——就像开锁演习报告必须注明“是否给了图纸、允许用多大力”。

∥δ∥∞≤ε,f(x+δ)≠y\|\delta\|_\infty \le \varepsilon, \quad f(x+\delta) \ne y
翻译成人话:在“每个像素改动都不超过 ε”的规则下,攻击者的任务就是让模型把样本认错。
  1. 攻击者扰动δ 是攻击者在样本上施加的篡改向量。
    δ∈Rd\delta \in \mathbb{R}^d
  2. 能力约束无穷范数限制每个分量的幅度都不超过 ε。
    ∥δ∥∞=max⁡i∣δi∣≤ε\|\delta\|_\infty = \max_i |\delta_i| \le \varepsilon
  3. 攻击目标让模型预测结果偏离真实标签 y。
    f(x+δ)≠yf(x+\delta) \ne y

攻击策略选择

演习中三位师傅风格迥异。第一位擅长“推理流”,拿着图纸顺着锁芯结构推演出受力最薄弱的点,一击即中;第二位擅长“试探流”,不依赖图纸,反复拨弄弹子,一点点逼近开启位置;第三位更绝,提前在自家同款锁上练了上百遍,总结出通用手法,上场直接复刻。三种流派,各有千秋。

攻击算法同样分三条路线。梯度攻击利用模型反向传播的梯度信息,找到让损失函数上升最快的方向——就像顺着图纸找薄弱点;优化攻击把“找对抗样本”形式化为优化问题,在预算约束下搜索最小扰动;迁移攻击则在本地训练替代模型,把在替代模型上生成的对抗样本直接投给目标模型,用于无法获取梯度的黑盒场景。无论哪条路线,本质都是在求解同一个“最坏扰动”问题:

三种策略没有绝对优劣。梯度攻击快如闪电但容易“用力过猛”;优化攻击效果好却计算昂贵;迁移攻击在纯黑盒下也能奏效但成功率不稳。成熟的评估方案不会只请一位师傅,而是三种流派轮番上阵。

δ∗=arg⁡max⁡∥δ∥∞≤ε  J(θ,x+δ,y)\delta^* = \underset{\|\delta\|_\infty \le \varepsilon}{\arg\max} \; J(\theta, x+\delta, y)
攻击者要找的,就是在预算允许范围内,让模型错得最离谱的那个扰动。
  1. 损失函数J 度量预测与真实标签的差距,损失越大错得越离谱。
    J(θ,x,y)=L(fθ(x),y)J(\theta, x, y) = \mathcal{L}\big(f_\theta(x), y\big)
  2. 攻击者目标在预算内寻找使损失最大的扰动 δ\*。
    max⁡∥δ∥∞≤εJ(θ,x+δ,y)\max_{\|\delta\|_\infty \le \varepsilon} J(\theta, x+\delta, y)
  3. 梯度线索损失对输入的梯度 ∇\_x J 指明损失上升最快的方向,是梯度攻击的关键情报。
    ∇xJ(θ,x,y)\nabla_x J(\theta, x, y)
  4. 预算约束扰动被限制在 ε 球内,保证改动难以察觉。
    ∥δ∥∞≤ε\|\delta\|_\infty \le \varepsilon

经典攻击实现

演习正式开始。第一位“快刀手”师傅出场:瞄准锁芯最薄弱的点,用一根特制铁丝猛地一拧——开了,整个过程不到一秒。这就是 FGSM,单步快速攻击。它沿损失上升最快的方向(梯度符号)迈出一步,是理解对抗攻击的"hello world"。

第二位“磨王”师傅则慢工出细活:一点一点拨动弹子,每拨一下都试探锁芯反应,反复调整力道,直到锁芯松动。这就是 PGD,多步迭代攻击,是目前公认最强的白盒攻击之一。它每一步都沿梯度方向小幅推进,再投影回预算球内。

第三位“细节控”师傅不追求一击必中,而是反复调整工具形变角度,目标是“用最小痕迹打开锁”。这就是 C&W:把“攻破 + 扰动尽量小”写成联合优化目标。

三位师傅各显神通,也各有局限:快刀手够快但一次失手就前功尽弃,磨王更稳但耗时长,细节控最精细但计算开销大。评估时选哪套攻击,取决于模型类型与计算资源——就像不同材质的锁,要派不同专长的师傅去试。

xadv=x+ε⋅sign⁡(∇xJ(θ,x,y))x_{\mathrm{adv}} = x + \varepsilon \cdot \operatorname{sign}\big(\nabla_x J(\theta, x, y)\big)
C&W 像一位追求完美犯罪的锁匠——既要把锁打开,又不想留下任何撬痕。
  1. 隐蔽性项‖δ‖\_p 惩罚扰动的大小,追求“最小痕迹开锁”。
    ∥δ∥p\|\delta\|_p
  2. 攻击性项f(x+δ) 度量距离攻破模型还差多远。
    f(x+δ)≥0  ⇔  攻破f(x+\delta) \ge 0 \;\Leftrightarrow\; \text{攻破}
  3. 权衡系数c 在隐蔽与攻击之间取平衡,c 越大越激进。
    c>0c > 0

评估指标体系

演习结束,小明需要一份量化报告。光说“师傅把锁打开了”不够,他得知道:100 次尝试中成功几次,成功时用了多大的工具,换一把同款锁结果稳不稳定。于是,他定下三把标尺。

第一把标尺是鲁棒准确率:在给定扰动预算 ε 下,对抗样本经过模型后依然被正确分类的比例。第二把标尺是攻击成功率:对抗样本导致模型误判的比例,它与鲁棒准确率此消彼长。第三把标尺是扰动度量:成功攻破所需的扰动有多小,扰动越小说明模型越脆弱。其中鲁棒准确率是最核心的指标,定义如下:

三把标尺各看一面:鲁棒准确率回答“模型还剩多少可用性”,攻击成功率回答“攻击者多容易得手”,扰动度量回答“攻击要付出多大代价”。就像一份完美的开锁报告,既要写攻破率,也要写平均用时与工具痕迹。

RAε=1N∑i=1N1{f(xi+δi)=yi}\mathrm{RA}_{\varepsilon} = \frac{1}{N}\sum_{i=1}^{N}\mathbb{1}\big\{f(x_i + \delta_i) = y_i\big\}
鲁棒准确率回答的是:面对每个样本的最强攻击,模型还能守住多少正确率。
  1. 评估样本N 是评测集中样本总数,每个样本含输入 x\_i 与标签 y\_i。
    {(xi,yi)}i=1N∼Dtest\{(x_i, y_i)\}_{i=1}^{N} \sim \mathcal{D}_{\mathrm{test}}
  2. 最坏扰动δ\_i 是攻击者针对第 i 个样本找到的最坏扰动。
    δi=arg⁡max⁡∥δ∥∞≤ε  J(θ,xi+δ,yi)\delta_i = \underset{\|\delta\|_\infty\le\varepsilon}{\arg\max} \; J(\theta, x_i+\delta, y_i)
  3. 指示函数括号内成立记 1,不成立记 0,只统计“守住”的样本。
    1{true}=1,  1{false}=0\mathbb{1}\{\text{true}\} = 1,\; \mathbb{1}\{\text{false}\} = 0
  4. 鲁棒准确率求和取平均后得到 0~1 之间的比例,越高越鲁棒。

评估流程实施

演习结束后,小明想把报告做成可复现的标准流程。他总结出四步:先选一把“典型门锁”(代表性数据集),再按规则请来不同流派师傅(多种攻击方法),每把锁连续测试多轮并记录数据,最后汇总成报告、标出薄弱环节。

AI 鲁棒性评估的流程与之如出一辙。第一步,准备评估数据集,通常包含标准测试集与专门构造的对抗样本集,确保覆盖常见分布与极端情况;第二步,明确威胁模型并选定攻击方法组合,常见做法是用 FGSM 快速摸底、用 PGD 评估上限、再用迁移攻击模拟真实黑盒;第三步,实施评测,在多个预算 ε 下扫描,记录逐样本结果;第四步,汇总分析,生成鲁棒性曲线、失败样例与归因报告。多次攻击、多档预算的结果还需要一个综合指标来横向比较——取各攻击方法下鲁棒准确率的平均值:

流程的价值在于可复现、可比较。上一季度报告说鲁棒准确率 80%,下一季度换了攻击方法却跌到 60%——到底是模型变差了,还是测试变苛刻了?只有把数据、攻击、预算全部固定下来的标准流程,才能回答这类问题。

Roverall=1K∑k=1KRA(k)R_{\mathrm{overall}} = \frac{1}{K}\sum_{k=1}^{K}\mathrm{RA}^{(k)}
综合鲁棒性 = 各路开锁师傅轮番上阵后,锁依然完好的平均比例。
  1. 攻击方法集合K 表示评估中采用的不同攻击方法数量。
    A={A1,A2,…,AK}\mathcal{A} = \{A_1, A_2, \dots, A_K\}
  2. 单方法指标RA^(k) 是第 k 种攻击下得到的鲁棒准确率。
    RA(k)=RAε(Ak)\mathrm{RA}^{(k)} = \mathrm{RA}_{\varepsilon}^{(A_k)}
  3. 综合均值取平均得到多角度攻击下的总体鲁棒水平。
    Roverall∈[0,1]R_{\mathrm{overall}} \in [0, 1]

对抗训练防御

小明的演习报告揭示了锁的致命缺陷:锡纸开锁之所以奏效,是因为锁芯对这类“旁路手法”毫无防备。他拿着报告找到锁厂,厂家连夜改进工艺:请来一批开锁高手反复测试新方案,每次失败就记录手法、加固结构,直到这些手法全部失效——这叫对抗训练。

对抗训练是目前最有效的鲁棒性提升手段:在训练过程中实时生成对抗样本并加入训练集,让模型在“被攻击”中学会抵抗攻击。它的目标函数是一个内外双层优化问题:

除了对抗训练,防御蒸馏是另一条思路:用大模型(教师)的软标签训练小模型(学生),让决策边界更平滑、梯度信息变微弱,攻击者难以利用梯度构造有效扰动。但它在多步攻击面前防御有限,实际生产中普遍以对抗训练为主线。防御不是一劳永逸——攻击手段在进化,今天的 PGD 攻不破,明天的自适应攻击可能一击即中。鲁棒性评估与对抗训练构成“攻-防-评”闭环:评估找漏洞,训练补漏洞,再评估验效果。

min⁡θ  E(x,y)∼D[max⁡∥δ∥∞≤εL(fθ(x+δ),y)]\min_{\theta} \; \mathbb{E}_{(x,y)\sim\mathcal{D}}\Big[\max_{\|\delta\|_\infty\le\varepsilon} L\big(f_\theta(x+\delta), y\big)\Big]
这个公式描述了一场“攻防博弈”:攻击者(内层)设法让模型最痛,防御者(外层)则要让模型在最痛的情况下依然学得最好。
  1. 内层 max(攻击者)在预算内寻找使损失最大的最坏扰动,相当于让开锁高手尽情发挥。
    max⁡∥δ∥∞≤εL(fθ(x+δ),y)\max_{\|\delta\|_\infty\le\varepsilon} L\big(f_\theta(x+\delta), y\big)
  2. 外层 min(防御者)优化模型参数 θ,让最坏情况下的损失也尽量小。
    min⁡θ  E[max⁡δL]\min_{\theta} \; \mathbb{E}\big[\max_{\delta} L\big]
  3. 期望 E对训练分布中的所有样本求平均,确保护盾对全体样本生效。
    E(x,y)∼D[⋅]\mathbb{E}_{(x,y)\sim\mathcal{D}}[\cdot]
  4. 整体闭环攻防博弈反复进行,模型在“挨打”中不断变强。
    θ∗=arg⁡min⁡θ  E(x,y)∼D[max⁡∥δ∥∞≤εL(fθ(x+δ),y)]\theta^* = \arg\min_{\theta} \; \mathbb{E}_{(x,y)\sim\mathcal{D}}\Big[\max_{\|\delta\|_\infty\le\varepsilon} L\big(f_\theta(x+\delta), y\big)\Big]

AI 应用场景

自动驾驶视觉感知安全评估

阶段:模型部署前的安全评估与合规审查

解决的问题:传统测试只在干净数据上跑分,无法提前暴露感知模型在对抗贴纸、恶劣光照下的失效风险,一旦上路将造成严重安全事故。

具体案例:某自动驾驶团队的感知模型在鲁棒性评估中发现,给“停车”标志贴上几条对抗贴纸,模型就以 82% 的概率将其识别为“限速 80”。评估团队用 PGD 与物理对抗样本组合测试,量化出在 ε=0.05 预算下鲁棒准确率仅 61%,据此推动感知模型补充对抗训练数据,并将鲁棒性指标纳入版本发布门槛。

金融反欺诈模型的对抗鲁棒性监控

阶段:模型上线后的持续鲁棒性监控

解决的问题:欺诈团伙会刻意构造特征样本(如小额多笔、模拟正常用户行为)绕过风控模型,传统评估无法模拟这种恶意特征篡改。

具体案例:某支付平台的信用评分模型在评估中发现,对特征做 0.3 范围内的梯度扰动,欺诈检出率从 91% 跌至 74%;评估团队将 PGD 生成的对抗样本加入重训练集,再次评估时检出率回升至 87%,并将“鲁棒准确率-预算曲线”纳入每月风控模型健康度报告。

内容审核系统的红队测试

阶段:上线前的红队对抗测试

解决的问题:恶意文本通过插入字符变体、同义词替换、嵌套拼写等方式绕过审核模型,黑盒条件下的真实攻击能力难以预判。

具体案例:某平台的违规文本审核模型,用迁移攻击(替代模型生成 + 查询反馈)在黑盒条件下构造对抗文本,绕过率高达 33%。测试报告促使团队引入对抗训练与输入净化(拼写归一化)双重防线,二次评估绕过率降至 5% 以下。

Python 演示

python78 行
import numpy as np def make_data(n=600, seed=0):    rs = np.random.RandomState(seed)    X = rs.randn(n, 2)    y = np.where(X[:, 0] ** 2 + X[:, 1] ** 2 < 3.5, 1.0, -1.0)    return X, y def forward(X, W1, b1, W2, b2):    h = np.maximum(0, X.dot(W1) + b1)    return h.dot(W2) + b2, h def predict(X, p):    W1, b1, W2, b2 = p    s, _ = forward(X, W1, b1, W2, b2)    return np.where(s > 0, 1.0, -1.0) def train(X, y, hidden=16, epochs=400, lr=0.2):    rs = np.random.RandomState(7)    W1 = rs.randn(2, hidden) * 0.4    b1 = np.zeros(hidden)    W2 = rs.randn(hidden) * 0.4    b2 = 0.0    for _ in range(epochs):        idx = rs.choice(len(X), 64)        Xb, yb = X[idx], y[idx]        s, h = forward(Xb, W1, b1, W2, b2)        ds = -yb / (1 + np.exp(yb * s))        W2 -= lr * h.T.dot(ds) / len(Xb)        b2 -= lr * ds.mean()        dh = ds[:, None] * W2        dz = np.where(h > 0, dh, 0.0)        W1 -= lr * Xb.T.dot(dz) / len(Xb)        b1 -= lr * dz.mean(axis=0)    return W1, b1, W2, b2 def grad_input(X, y, p):    W1, b1, W2, b2 = p    z = X.dot(W1) + b1    h = np.maximum(0, z)    s = h.dot(W2) + b2    ds = -y / (1 + np.exp(y * s))    dh = ds[:, None] * W2    dz = np.where(h > 0, dh, 0.0)    return dz.dot(W1.T) def fgsm_attack(X, y, p, eps):    g = grad_input(X, y, p)    return X + eps * np.sign(g) def pgd_attack(X, y, p, eps, steps=20, alpha=0.08):    adv = X.copy()    for _ in range(steps):        g = grad_input(adv, y, p)        adv = adv + alpha * np.sign(g)        adv = np.clip(adv, X - eps, X + eps)    return adv def robust_accuracy(X, y, p, attack, eps):    X_adv = attack(X, y, p, eps)    y_pred = predict(X_adv, p)    return np.mean(y_pred == y) def main():    X, y = make_data()    split = 400    p = train(X[:split], y[:split])    Xte, yte = X[split:], y[split:]    clean_acc = np.mean(predict(Xte, p) == yte)    print("clean acc  = %.4f" % clean_acc)    print("eps   FGSM_RA   PGD_RA")    for eps in [0.1, 0.2, 0.4, 0.6]:        ra1 = robust_accuracy(Xte, yte, p, fgsm_attack, eps)        ra2 = robust_accuracy(Xte, yte, p, pgd_attack, eps)        print("%.1f   %.4f   %.4f" % (eps, ra1, ra2)) if __name__ == "__main__":    main()
目的:训练一个简单的两层神经网络分类器,然后分别用 FGSM 与 PGD 生成对抗样本,扫描不同扰动预算 ε 下的鲁棒准确率,输出一份迷你鲁棒性评估报告。
  1. def grad_input(X, y, p):反向传播求出损失对输入的梯度,这是攻击者最关键的“情报”,相当于掌握了锁芯图纸。
  2. ds = -y / (1 + np.exp(y * s))对逻辑损失求导,得到每个样本损失关于模型输出的梯度。
  3. dz = np.where(h > 0, dh, 0.0)ReLU 掩码让梯度只流过激活的神经元,保证反向传播路径正确。
  4. return dz.dot(W1.T)把梯度传回输入层,得到 FGSM/PGD 构造对抗样本所需的攻击方向。
  5. return X + eps * np.sign(g)FGSM 单步攻击:沿梯度符号方向加扰动,一步生成对抗样本。
  6. adv = np.clip(adv, X - eps, X + eps)PGD 每步投影回预算球内,保证扰动不越界。
  7. return np.mean(y_pred == y)计算鲁棒准确率,作为评估报告的核心指标。

常见误区

误区“我的模型在测试集上准确率 98%,说明它足够鲁棒,不需要专门评估。”

正解干净准确率衡量的是“正常输入下有多准”,鲁棒性衡量的是“恶意篡改下有多稳”。就像一把日常开关顺滑的锁,可能被锡纸三秒捅开;模型在对抗样本面前同样可能瞬间失守。它们是两个维度的指标,必须用对抗样本实测才能下结论。

为何常见:传统机器学习评估长期只看干净数据上的泛化指标,人们习惯用“准确率高”直接断言模型质量好。

误区“我的攻击成功率超过了别人的方法,就说明我的攻击方法更好。”

正解攻击成功率必须在相同威胁模型下比较才有意义:一样的预算 ε、一样的白盒/黑盒设定、一样的模型与数据。预算从 0.01 放宽到 0.3,成功率几乎必然上升;白盒攻击通常碾压黑盒攻击。脱离约束谈成功率,就像不问工具限制就比谁的开锁技术高,毫无意义。

为何常见:人们天然倾向用一个简单数字排名,却忽略了数字背后的前置条件。

误区“拿 FGSM 跑一遍,攻击成功率不高,模型就是鲁棒的。”

正解每种攻击只暴露一个侧面的弱点。FGSM 弱往往只说明“单步攻击失效”,而 PGD、C&W、迁移攻击可能轻松攻破。就像只请一位开锁师傅测过就说锁绝对安全,显然不严谨。标准做法是多种攻击组合、多档预算扫描,取最坏情况作为鲁棒性基准。

为何常见:FGSM 实现简单、跑得快,容易让人误以为“测过了”就等于“测够了”。

误区“做完对抗训练,模型就永久免疫攻击,评估可以不用再做了。”

正解攻防是持续演化的博弈。对抗训练只针对训练时见过的攻击类型,新的攻击手段(如自适应攻击、物理对抗样本)随时可能出现。“评估—训练—再评估”的闭环才是正确姿势:每次出现新攻击都重新评估,发现漏洞后迭代训练,形成持续改进。

为何常见:把“提升鲁棒性”误解为一次性的终点,忽略了攻击方法本身也在不断进化。

面试题

Q1. 对抗样本最本质的特征是什么?

单选题 · easy

  • A.在样本上添加了大幅度的随机噪点
  • B.微小扰动人眼难察却致模型误判← 正确答案
  • C.与训练数据分布存在明显的差异
  • D.训练样本中含有大量的错误标签

答案:B。对抗样本是刻意构造的输入,关键特征是“扰动微小得人眼难以察觉,却能让模型输出错误结果”。随机噪点虽可能影响模型,但并非刻意构造的对抗行为;分布差异与标签错误属于数据质量问题,与对抗样本无关。这就像锡纸开锁——外观几乎没变,却轻松破解了看似坚固的锁。

Q2. 白盒攻击与黑盒攻击的根本区别是什么?

单选题 · easy

  • A.攻击者所拥有计算资源的多寡程度
  • B.是否知道模型结构与参数梯度信息← 正确答案
  • C.攻击过程中所生成对抗样本的数量
  • D.是否调用显卡加速模型训练的过程

答案:B。白盒攻击假设攻击者完全掌握模型结构、参数和梯度,能直接计算攻击方向;黑盒攻击则没有这些信息,只能通过查询输出或迁移替代模型来攻击。计算资源、样本数量、训练加速都不构成二者区别。就像开锁演习里,拿到结构图纸的师傅与只能盲试的师傅,情报差异才是关键。

Q3. FGSM 生成对抗样本的核心公式是哪一个?

单选题 · mid

  • A.x + ε·sign(∇ₓJ(θ,x,y))← 正确答案
  • B.x − ε·∇ₓJ(θ,x,y)
  • C.x + ε·∇ₓJ(θ,x,y)
  • D.x − ε·sign(∇ₓJ(θ,x,y))

答案:A。FGSM 沿损失上升最快的方向(梯度符号)加上扰动,即 x + ε·sign(∇ₓJ(θ,x,y))。B 和 D 沿下降方向走,只会让预测更稳定,与攻击方向相反;C 方向正确但直接用梯度幅值,会导致不同像素改动幅度不一致,不是 FGSM。这正是“顺锁芯最薄弱处猛推一下”的单步手法。

Q4. PGD 相比于 FGSM 的核心改进是什么?

单选题 · mid

  • A.不需要设置扰动预算 ε 的上限
  • B.多步迭代并在每步后投影回预算约束← 正确答案
  • C.只能用于黑盒攻击的评估场景
  • D.不需要计算模型的梯度信息

答案:B。PGD 每步沿梯度符号方向前进 α,然后通过 clip 将样本投影回 ε 预算球内,反复迭代逼近最坏扰动,因此比单步 FGSM 攻击力更强。A 错误,PGD 同样受预算约束;C、D 错误,PGD 是白盒攻击且依赖梯度。就像“磨王”师傅反复拨动弹子,每次都不越界,直到锁芯松动。

Q5. 在鲁棒性评估中,攻击成功率(ASR)的含义是什么?

单选题 · mid

  • A.模型正确识别对抗样本所占的比例
  • B.对抗样本导致模型判断出错的比例← 正确答案
  • C.攻击算法在单位时间内的运行速度
  • D.生成对抗样本所消耗的计算资源

答案:B。攻击成功率衡量攻击者的视角:在给定预算下,有多少对抗样本成功让模型犯错。A 是鲁棒准确率,二者互补;C、D 是攻击的效率与代价,与成功率无关。在理想条件下,攻击成功率 ≈ 1 − 鲁棒准确率,就像开锁报告里“攻破率”与“完好率”互为镜像。

Q6. 约束 ‖δ‖∞ ≤ ε 在图像对抗攻击中的直观含义是什么?

单选题 · hard

  • A.每个像素允许被修改的最大幅度← 正确答案
  • B.全部像素修改幅度的平方和上限
  • C.被修改的像素数量占图像的百分比
  • D.对抗样本与原始样本的欧氏距离

答案:A。无穷范数取的是向量中绝对值最大的分量,因此 ‖δ‖∞ ≤ ε 意味着任意像素的改动幅度都不超过 ε。B 是 L2 范数平方约束,D 是 L2 范数本身,C 描述的是稀疏攻击中限制改动像素比例,均不准确。这相当于规定了开锁工具“最多能用多大力”。

Q7. 对抗训练目标 min_θ E[max_δ L(f_θ(x+δ), y)] 中,内层 max 的作用是什么?

单选题 · hard

  • A.在预算内寻找使损失最大的最坏扰动← 正确答案
  • B.寻找使分类损失最小的模型最优参数
  • C.计算整个训练数据集的平均损失大小
  • D.控制随机梯度下降过程中参数的更新步长

答案:A。内层 max 模拟攻击者视角,在扰动预算内搜索最坏扰动使损失最大化;外层 min 才是防御者视角,希望模型在最坏扰动下损失仍然最小。B、C、D 描述的都是外层或常规训练概念,不符合内层 max 的角色。就像厂家先让开锁高手尽情发挥,再根据最狠的破解手法去加固锁芯。

Q8. 下列哪些属于黑盒攻击的常见策略?

多选题 · easy

  • A.查询模型输出并据此构造对抗样本← 正确答案
  • B.训练替代模型后迁移攻击真实目标← 正确答案
  • C.直接计算目标模型的梯度并反向传播
  • D.在训练集上重新微调目标模型参数

答案:AB。黑盒攻击无法获得目标模型梯度。常见路线有两条:基于查询的边界攻击(A),通过反复查询输入输出逼近决策边界;基于迁移的攻击(B),用替代模型生成对抗样本再投给目标模型。C 是白盒攻击的操作,D 是获取目标模型后的再训练,都不是黑盒策略。

Q9. 一份可信的鲁棒性评估报告应当包含哪些要素?

多选题 · mid

  • A.明确的威胁模型与攻击预算设定← 正确答案
  • B.多种攻击方法组合的测试结果← 正确答案
  • C.鲁棒准确率与攻击成功率指标← 正确答案
  • D.仅报告干净测试集上的准确率

答案:ABC。可信评估必须说明“在什么规则下测的”(威胁模型与预算)、“用什么手段测的”(多种攻击组合)、“测出了什么”(鲁棒准确率、攻击成功率等指标)。只报干净样本准确率恰恰是评估要避免的误导,因为那衡量的是常规性能而非鲁棒性能。完整报告让结论可复现、可比较,就像开锁演习报告要写清规则、手法与结果。

Q10. 关于鲁棒准确率(RA)与攻击成功率(ASR)的关系,正确的说法有哪些?

多选题 · extreme

  • A.在理想条件下两者之和相等于一← 正确答案
  • B.攻击成功率越高鲁棒准确率越低← 正确答案
  • C.两者不受模型结构与参数的任何影响
  • D.两者均衡量模型的对抗鲁棒性能← 正确答案

答案:ABD。当模型对干净样本全部正确分类时,样本要么“被攻破”要么“保持正确”,因此 ASR 与 RA 互补,A 正确;ASR 高意味着更多对抗样本让模型出错,RA 自然下降,B 正确;二者都用于刻画模型的对抗鲁棒性,D 正确。C 错误——模型结构、参数、训练方式会显著影响这两个指标,就像不同材质的锁,攻破率天差地别。