在《谍影重重》的续集里,开锁匠阿凯收到一单神秘委托:打开一栋银行金库的厚重钢门。客户报酬惊人,条件却苛刻得离谱——阿凯既不能拆开金库的锁芯,也不能接触锁的内部结构,只能隔着门板试探锁孔。这就是“黑盒”:你只能输入、只能观察输出,却看不到里面的齿轮与弹子。 换作普通人早就放弃了,可阿凯是行家。他跑到五金店,买了一把与金库同厂家同系列的家用锁,带回工作室拆了个底朝天。在这把“代理锁”上,他反复打磨出一把奇特的钥匙——它插不进普通锁,却在特定角度轻轻一转,锁芯便应声而开。更神奇的是,当阿凯把这把钥匙插进金库的门锁时,它竟然真的转动了。 为什么一把在复刻锁上磨出来的钥匙,能打开从未见过的真锁?因为同厂同系列的锁,内部弹子的排列规律惊人地相似。这正是“对抗样本迁移性”的核心:在代理模型上生成的对抗样本,往往也能骗过从未接触过的目标模型。本文就带你走进这套“万能钥匙”的锻造车间,从原理到实战,一步步拆解黑盒攻击迁移性。

岗位关联

掌握对抗样本的迁移性分析方法,你将具备在不接触目标模型权重的情况下评估其安全性的独特能力——这是 AI 红队测试、第三方模型审计与安全合规评估中最稀缺的实战技能。

目录
  1. 可视化演示
  2. 概念基础
  3. 迁移机理
  4. 代理模型
  5. 经典方法
  6. 增强策略
  7. 量化评估
  8. 防御对抗
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示对抗样本从白盒模型生成并迁移攻击黑盒模型的完整过程,以及不同扰动强度下的迁移成功率对比。

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

对抗样本迁移攻击流程 输入:原始干净样本数据 白盒:已知梯度的源模型 扰动:对抗噪声叠加 黑盒:未知目标模型 成功率 ∝ 扰动强度 × 迁移性 对抗样本跨模型迁移攻击

概念基础

阿凯坐在工作室里,面前摊着两样东西:一把从五金店买来的同厂家家用锁(代理模型),和一张金库门锁的草图——草图只有锁孔外圈的尺寸,内部结构一片空白。这就是黑盒攻击的真实图景:攻击者面对一个“只进不出的黑匣子”,可以提交输入、观察输出,却拿不到梯度、权重和中间特征。所谓黑盒,不是攻击者能力弱,而是信息受限。

白盒攻击像拿着设计图纸拆锁,模型结构、参数、梯度样样透明;黑盒攻击则像盲人摸象,只能靠“捅锁孔”积累经验。但阿凯悟出了一个关键现象:他为家用锁磨出的钥匙,插进金库锁孔竟然也能转动。凡是在代理模型上成功的对抗样本,放到目标模型上往往依然有效——这个性质就是对抗样本的迁移性。

工程上,我们把攻击者手握的代理模型记为 f_a,被攻击的目标模型记为 f_b。先在 f_a 上用白盒方法生成对抗样本集合 X_a,再逐个喂给 f_b,统计其中有多少个能让 f_b 犯错,就得到迁移成功率。它是衡量黑盒攻击威力的头号指标:

对阿凯而言,迁移率就是他的“出单率”:工作室里十把钥匙,有几把能真正打开金库?白盒攻击是训练场上的满分答卷,黑盒迁移才是真实考场上的临场发挥。理解了这把“钥匙为什么能通用”,后面的每个章节都在回答同一个问题:钥匙怎么磨、怎么试、怎么衡量、怎么防。

Ta→b=1N∑i=1N1 ⁣[fb ⁣(xiadv)≠yi],xiadv∈Xa\displaystyle T_{a \to b} = \frac{1}{N} \sum_{i=1}^{N} \mathbb{1}\!\left[ f_b\!\left( x_i^{adv} \right) \ne y_i \right], \quad x_i^{adv} \in \mathcal{X}_a
公式读作:从模型 a 迁移到模型 b 的成功率,等于能让 b 改变判断的对抗样本在总体中的占比。
  1. 对抗样本集合先在代理模型 a 上用白盒攻击生成 N 个对抗样本,它们全部能骗过 a。
    Xa={x1adv,x2adv,…,xNadv}\mathcal{X}_a = \{ x_1^{adv}, x_2^{adv}, \dots, x_N^{adv} \}
  2. 目标模型判定把每个对抗样本送给目标模型 b,检查 b 的预测是否不等于真实标签 y_i,若不等则计 1,否则计 0。
    1 ⁣[fb(xiadv)≠yi]\mathbb{1}\!\left[ f_b(x_i^{adv}) \ne y_i \right]
  3. 样本平均对 N 个样本的指示函数求和再除以 N,得到 0 到 1 之间的迁移成功率。
    Ta→b=1N∑i=1N1[⋅]T_{a \to b} = \frac{1}{N} \sum_{i=1}^{N} \mathbb{1}[\cdot]

迁移机理

阿凯把家用锁拆开后,把弹子一颗颗排在工作台上,发现了一个惊人的规律:同厂同系列的锁不仅零件通用,弹子长度的排列规律也几乎一致。锁匠行业的这条潜规则,对应到深度学习世界就是——在相似数据上训练出来的模型,它们的决策边界惊人地相似。正是这种“共有的锁芯基因”,让万能钥匙成为可能。

深度模型在训练时,本质上是在从数据分布中提炼可迁移的特征表示。两个模型即使架构不同(比如 ResNet 和 VGG),只要训练数据高度重叠,它们学到的边缘、纹理、形状等特征就会大量重合。决策边界在这些特征空间上的几何形态相似,意味着“在模型 A 的边界附近,模型 B 的边界往往也在附近”。

这种相似性可以用梯度方向的一致性来量化。对同一个输入 x,两个模型各自认为“往哪个方向改变 x 最能影响判断”,如果这两个方向高度一致,那么在 A 上生成的扰动,对 B 同样致命。常用余弦相似度衡量两个梯度的对齐程度:

但这把钥匙有个致命局限:它只对“同厂锁芯”有效。如果银行把锁换成瑞士进口的铍铜合金锁,弹子排列逻辑完全不同,阿凯的钥匙就彻底失效。这正是第七节防御策略的理论根基——只要打破模型间的梯度对齐,迁移性就会崩塌。

cos⁡ ⁣(θ)=∇xJa(x,y)  ⋅  ∇xJb(x,y)∥∇xJa(x,y)∥2 ∥∇xJb(x,y)∥2\displaystyle \cos\!\left( \theta \right) = \frac{\nabla_x \mathcal{J}_a(x, y) \; \cdot \; \nabla_x \mathcal{J}_b(x, y)}{\left\| \nabla_x \mathcal{J}_a(x, y) \right\|_2 \, \left\| \nabla_x \mathcal{J}_b(x, y) \right\|_2}
公式读作:两个模型梯度的余弦夹角越接近 1,说明它们对“同一句话会怎么理解”的态度越一致,扰动越容易迁移。
  1. 两个梯度向量分别计算代理模型和目标模型损失函数对输入 x 的梯度,这是各自“认为最有攻击性的方向”。
    ∇xJa,∇xJb\nabla_x \mathcal{J}_a, \quad \nabla_x \mathcal{J}_b
  2. 向量内积两个方向越一致,内积越大;完全垂直则内积为零;方向相反则内积为负。
    ∇xJa⋅∇xJb\nabla_x \mathcal{J}_a \cdot \nabla_x \mathcal{J}_b
  3. 长度归一化除以两个梯度的 L2 模长之积,消除幅度差异,得到纯夹角余弦。
    cos⁡(θ)∈[−1,1]\cos(\theta) \in [-1, 1]

代理模型

磨钥匙之前,阿凯先得回答一个问题:买哪把锁当模板?五金店货架上摆着几十个系列,买错了,磨出来的钥匙必然插不进金库。代理模型的选择,直接决定了迁移攻击的天花板——它既是攻击者的“练习靶”,也是扰动方向的风向标。

选代理模型讲究“猜家世”:攻击者会先推测目标模型的血统——它最可能由哪类数据集训练而来(ImageNet、OpenImages 还是自采数据),最可能采用什么结构(ResNet 系、EfficientNet 系还是 Transformer 系)。在数据分布和结构上尽量贴近目标模型,再在其上训练出代理模型,白盒攻击的迁移性才会高。

若目标模型开放查询接口,攻击者还能进一步“偷师”。做法是:采样一批数据,送给目标模型拿到输出,再用这些输出当标准答案去训练代理模型,让代理的输出逼近目标的输入输出行为。这就是知识蒸馏式的替代训练:

阿凯的实战经验还有一条:别只买一把锁。多买几把同系列锁,轮流在上面试钥匙胚,凡是被所有锁共同认可的开法,就是锁厂的设计灵魂,真锁也大概率认。代理模型的多样性——多数据、多结构、多初始化——是迁移性的天然助推器。

θs∗=arg⁡min⁡θs  1m∑i=1m∥fs ⁣(xi;θs)−ft ⁣(xi)∥22\displaystyle \theta_s^{*} = \arg\min_{\theta_s} \; \frac{1}{m} \sum_{i=1}^{m} \left\| f_s\!\left( x_i; \theta_s \right) - f_t\!\left( x_i \right) \right\|_2^{2}
公式读作:调整代理模型参数,使它对采样数据的输出尽量逼近目标模型的输出,从而“复制”目标的决策行为。
  1. 采样考题从代理分布(如同一数据集)中取 m 个样本,作为偷师的考题。
    {xi}i=1m∼Dproxy\{ x_i \}_{i=1}^{m} \sim \mathcal{D}_{proxy}
  2. 黑盒提问把考题发给目标模型,记下输出作为标准答案。
    ft(xi)f_t(x_i)
  3. 输出对齐训练代理模型,让它的输出与标准答案的平方误差之和最小。
    min⁡θs1m∑i=1m∥fs(xi)−ft(xi)∥22\min_{\theta_s} \frac{1}{m} \sum_{i=1}^{m} \| f_s(x_i) - f_t(x_i) \|_2^2

经典方法

模板锁到手,阿凯打开祖传工具箱。工具箱里的锉刀分四种流派:快刀、连锉、惯性锉和精雕锉。每一种对应一类经典的对抗样本生成算法,也是锻造迁移钥匙的基本功法。

快刀是“快速梯度符号法”(FGSM):不求精细,只沿梯度方向使劲推一步,简单、廉价、可解释,是理解所有后续算法的起点。连锉是“投影梯度下降”(PGD):把 FGSM 的一步拆成许多小步,每迈一步都检查是否越界,逼近扰动约束下的最坏情况。惯性锉是“动量迭代法”(MIM):在连锉基础上加入上一步的方向记忆,避免在局部极值处来回震荡。精雕锉是 CW 攻击:把“开锁”建模成最优化问题,同时最小化扰动幅度与犯错概率,质量高但计算昂贵。

FGSM 的数学本质只有一行。设损失函数为 J,它衡量当前模型对输入 x、标签 y 的“困惑程度”。沿着困惑上升最快的方向,加一个肉眼难察的小扰动 ε,就能让模型改变判断:

磨过一轮钥匙的阿凯深知:快刀虽快,却容易刮花钥匙表面,插不进锁孔。真正实战时,他往往先用 PGD 多锉几刀,再用 MIM 的惯性稳住方向。方法没有高下之分,只有“够不够用”之分——而迁移攻击的终极目标,从来不是白盒上的漂亮分数,而是黑盒里那一声清脆的“咔嗒”。

xadv=x+ε⋅sign⁡ ⁣(∇xJ(θ,x,y))\displaystyle x^{adv} = x + \varepsilon \cdot \operatorname{sign}\!\left( \nabla_x \mathcal{J}(\theta, x, y) \right)
公式读作:对抗样本等于原样本加上一个符号梯度方向的小步长扰动。符号函数负责“只借方向,不借大小”。
  1. 求损失梯度用白盒代理模型计算损失对输入 x 的梯度,这一项指示“每个像素朝哪个方向微调最能让模型判错”。
    ∇xJ(θ,x,y)\nabla_x \mathcal{J}(\theta, x, y)
  2. 取符号压缩sign 函数把梯度压缩成只含 +1 或 -1 的方向向量,保证扰动均匀、可控,不漏掉任何像素。
    sign⁡ ⁣(∇xJ(θ,x,y))\operatorname{sign}\!\left( \nabla_x \mathcal{J}(\theta, x, y) \right)
  3. 缩放叠加乘以步长 ε 后加到原图上,得到最终对抗样本,ε 越小越隐蔽。
    xadv=x+ε⋅sign⁡(⋅)x^{adv} = x + \varepsilon \cdot \operatorname{sign}(\cdot)

增强策略

阿凯发现,单把锁上磨出的钥匙,偶尔也会在真锁上失灵。于是他给自己立了条规矩:凡是出师的钥匙,必须同时通过至少三把复刻锁的检验。这就是迁移性增强的第一个法门——集成攻击,让扰动对准所有复刻锁的共同“软肋”,而不是某一把的偶然瑕疵。

除了集成,还有三招。其一是“输入变换”:磨钥匙时不停变换握姿(对输入做随机缩放、平移、Padding),让钥匙适应不同的插入角度,防止扰动过拟合单一图像的纹理。其二是“动量累积”:迭代时记住历史梯度方向,像给锉刀装上惯性,平滑穿越震荡区域,方向更稳。其三是“多模型融合”:在数据、结构、训练方式三个维度上制造多样的代理模型,再取它们的共识梯度。

动量迭代是数学上最优雅的一招。设第 t 步的梯度为 g_t,用 L1 范数归一化后累加到动量项上,既保留历史方向,又避免梯度爆炸:

这一套组合拳下来,阿凯的钥匙从“能开一把锁”晋升为“能开一扇门”。多条弹子规律被同时捕捉,迁移成功率普遍提升十几个百分点。记住一个心法:增强的本质,是把代理模型上“偶然的脆弱点”过滤掉,只留下“必然的共性弱点”。

gt+1=μ⋅gt+∇xJ(θ,xt,y)∥∇xJ(θ,xt,y)∥1\displaystyle g_{t+1} = \mu \cdot g_t + \frac{\nabla_x \mathcal{J}(\theta, x_t, y)}{\left\| \nabla_x \mathcal{J}(\theta, x_t, y) \right\|_1}
公式读作:新动量等于旧动量打折扣后,加上归一化的当前梯度。μ 控制记忆长度,通常取 0.9 左右。
  1. 动量衰减上一步的动量乘上衰减系数 μ,让历史方向随步数渐忘,μ 越接近 1 记忆越长。
    μ⋅gt,μ∈[0,1)\mu \cdot g_t, \quad \mu \in [0, 1)
  2. 当前梯度归一化用 L1 范数把梯度缩放为单位尺度,保证每次迭代的推进幅度一致。
    ∇xJ∥∇xJ∥1\frac{\nabla_x \mathcal{J}}{\| \nabla_x \mathcal{J} \|_1}
  3. 动量叠加两者相加作为新一代扰动方向,再乘以步长更新对抗样本。
    gt+1=μgt+∇xJ∥∇xJ∥1g_{t+1} = \mu g_t + \frac{\nabla_x J}{\| \nabla_x J \|_1}

量化评估

钥匙打磨完毕,阿凯需要在交付单上填一个数字:成功率。没有度量就没有改进,迁移性研究同样离不开一套严谨的尺子。雇主关心的从来不是“钥匙设计得多精巧”,而是“插进锁孔能转动的概率有多高”。

评估体系围绕三个指标展开。第一是白盒攻击成功率:对抗样本在代理模型上有多大比例骗过了它——这衡量磨钥匙的基本功。第二是黑盒迁移成功率:同一批对抗样本在目标模型上有多大比例依然有效——这是迁移性最直接的证据。第三是扰动幅度:用 ε、L2 距离或 LPIPS 衡量样本被改了多少,追求“改动小、骗得狠”。

工程报告中,常用代理成功率 S_a 与目标成功率 S_t 的比值作为归一化的迁移成功率。它排除了“代理模型本身就攻不破”的干扰,只专注衡量“有效性从代理到目标的衰减程度”:

评估报告里还要画一张“鲁棒性对比表”:同一批对抗样本,分别测试素模型、对抗训练模型、蒸馏模型的成功率。就像阿凯会同时带钥匙去试普通锁、加固锁和瑞士锁,只有横评多把锁,才能知道手里这把钥匙的真实成色。

Sa=1N∑i=1N1 ⁣[fa(xiadv)≠yi],St=1N∑i=1N1 ⁣[ft(xiadv)≠yi],Ta→b=StSa\displaystyle S_a = \frac{1}{N} \sum_{i=1}^{N} \mathbb{1}\!\left[ f_a(x_i^{adv}) \ne y_i \right], \quad S_t = \frac{1}{N} \sum_{i=1}^{N} \mathbb{1}\!\left[ f_t(x_i^{adv}) \ne y_i \right], \quad T_{a \to b} = \frac{S_t}{S_a}
公式读作:迁移成功率 = 目标模型攻击成功率 ÷ 代理模型攻击成功率。比值越接近 1,迁移性越好。
  1. 代理成功率先在代理模型 f_a 上统计对抗样本的即时命中率,通常接近 1。
    Sa=1N∑i=1N1[fa(xiadv)≠yi]S_a = \frac{1}{N} \sum_{i=1}^{N} \mathbb{1}[f_a(x_i^{adv}) \ne y_i]
  2. 目标成功率在同一批对抗样本(不许重新生成)上统计目标模型 f_t 的命中率。
    St=1N∑i=1N1[ft(xiadv)≠yi]S_t = \frac{1}{N} \sum_{i=1}^{N} \mathbb{1}[f_t(x_i^{adv}) \ne y_i]
  3. 归一化比值两者相除得到迁移成功率,例如 S_a = 1.0、S_t = 0.65,则迁移率为 0.65。
    Ta→b=St/SaT_{a \to b} = S_t / S_a

防御对抗

阿凯第一次“试开”成功的消息传开后,银行立刻请来锁厂总工程师。工程师的防御思路极其朴素:既然万能钥匙钻的是“同厂锁芯共性”的空子,那就把这共性彻底废掉。每一种防御策略,本质上都是让模型不再具有“可被预测的决策边界”。

四种主流防线各显神通。对抗训练:把对抗样本混进训练集,让模型亲眼见过这些“刁钻钥匙”,相当于给锁芯换上异形弹子。输入预处理:在推理阶段先压缩、平滑、随机化输入,把钥匙上的毛刺磨平。模型蒸馏:用教师模型的知识训练一个更“钝感”的学生模型,相当于把金库换成瑞士锁。检测机制:在锁孔旁安装传感器,遇到可疑插入直接报警。

对抗训练是理论根基最扎实的一招。它的目标函数是一个 min-max 博弈:内层要在扰动球内找到最让模型难受的样本,外层要在这些“最坏样本”上最小化损失,让模型越打越皮实:

对抗训练后的模型,决策边界被“熨”得平缓顺滑,梯度方向不再与旁系模型对齐。阿凯在代理锁上磨出的钥匙,插进金库锁孔后纹丝不动——迁移性被釜底抽薪。攻防的齿轮就此咬合:攻击者追求共性,防御者消灭共性,这场永恒博弈的胜负手,始终藏在“决策边界相似性”这把钥匙里。

min⁡θ  E(x,y)∼D ⁣[max⁡∥δ∥∞≤εL ⁣(θ,x+δ,y)]\displaystyle \min_{\theta} \; \mathbb{E}_{(x, y) \sim \mathcal{D}} \!\left[ \max_{\| \delta \|_{\infty} \le \varepsilon} \mathcal{L}\!\left( \theta, x + \delta, y \right) \right]
公式读作:对每个样本,先找出半径 ε 内最恶劣的扰动 δ,再训练模型在该扰动下损失最小。这就是“先挨最毒的打,再练最硬的功”。
  1. 内层最大化在 L∞ 扰动球内寻找让模型损失最大的对抗样本,相当于模拟攻击者最狠的一招。
    max⁡∥δ∥∞≤εL(θ,x+δ,y)\max_{\| \delta \|_{\infty} \le \varepsilon} \mathcal{L}(\theta, x + \delta, y)
  2. 外层最小化在这些最坏样本上更新模型参数,让模型对最坏情况也保持低损失。
    min⁡θmax⁡∥δ∥∞≤εL(θ,x+δ,y)\min_{\theta} \max_{\| \delta \|_\infty \le \varepsilon} \mathcal{L}(\theta, x + \delta, y)
  3. 期望汇总对训练分布中的所有样本求期望,完成对整个数据分布的加固。
    E(x,y)∼D[⋅]\mathbb{E}_{(x,y) \sim \mathcal{D}}[\cdot]

AI 应用场景

红队安全测试

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

解决的问题:传统渗透测试需要模型权重和梯度(白盒),但线上模型往往封装在 API 后面,测试人员拿不到内部信息。借助黑盒迁移攻击,红队可以训练一个同源的代理模型,在其上生成对抗样本库,再对线上模型发起大规模“盲测”,在不接触权重的前提下评估其真实鲁棒性。

具体案例:某金融科技公司上线人脸识别支付系统前,安全团队用公开人脸数据集训练了 3 个代理模型(ResNet50、MobileNetV3、ViT-Base),集成生成对抗样本后对线上黑盒 API 发起迁移攻击,发现 37.8% 的对抗样本能成功绕过活体检测,推动团队在发布前完成修复。

第三方模型审计与合规

阶段:供应链模型采购评估

解决的问题:企业在采购第三方 AI 服务(如内容审核、风控模型)时,供应商通常只提供 API 而拒绝透露模型细节。购买方需要验证模型的鲁棒性是否符合合规要求,黑盒迁移攻击成为唯一可行的“体检手段”。审计方通过查询式代理训练与迁移攻击,量化目标模型在恶意扰动下的失败率,形成合规报告。

具体案例:某电商平台在接入第三方智能风控 API 前,用查询-反馈方式训练代理模型,使代理与目标 API 的预测一致性达 92.3%,随后测得在 ε=0.05 扰动下模型欺诈拦截准确率从 99.2% 骤降至 64.7%,据此在采购合同中加入了鲁棒性验收条款。

防御算法效果排行榜评测

阶段:模型鲁棒性对比研究

解决的问题:论文和评测榜单中,防御算法往往只接受白盒攻击检验,而真实攻击者大多采用黑盒迁移策略。为了公平评估防御的真实强度,评测平台需要用一套统一的代理模型与迁移攻击流程,横向对比各防御模型在“未知攻击者”下的表现,避免“纸面鲁棒性”。

具体案例:某 AI 安全比赛将参赛防御模型部署为黑盒服务,对每个模型使用相同的 5 个代理模型集成攻击流水线进行测试,最终排名与白盒评测结果差异显著——一个声称鲁棒的模型被迁移攻击打穿,其 L∞ 扰动仅 0.03,引发社区对评估方案的反思。

Python 演示

python51 行
import numpy as np  def make_data(n=400, seed=0):    # 生成圆形区域的二维数据, 模拟同类数据集    rng = np.random.default_rng(seed)    x = rng.uniform(-2, 2, size=(n, 2))    y = (x[:, 0] ** 2 + x[:, 1] ** 2 < 1.6).astype(int) * 2 - 1    return x, y  def train_linear(x, y, lr=0.3, epochs=300, seed=0):    # 合页损失线性分类器, 一把复刻锁对应一个随机种子    rng = np.random.default_rng(seed)    w = rng.normal(0, 0.1, size=2)    b = 0.0    for _ in range(epochs):        margin = y * (x @ w + b)        hinge = (margin < 1.0).astype(float)        gw = np.mean(-y[:, None] * x * hinge[:, None], axis=0)        gb = np.mean(-y * hinge)        w = w - lr * gw        b = b - lr * gb    return w, b  def predict(w, b, x):    return np.sign(x @ w + b)  def fgsm_attack(x, y, w, b, eps=0.35):    # FGSM 符号梯度: 沿合页损失上升方向推输入    grad_sign = -np.sign(y)[:, None] * np.sign(w)[None, :]    return x + eps * grad_sign  def transfer_report(eps=0.35):    # 在代理模型上生成对抗样本, 再到目标模型上统计迁移率    x, y = make_data(seed=0)    w_s, b_s = train_linear(x, y, seed=0)    w_t, b_t = train_linear(x, y, seed=2)    x_adv = fgsm_attack(x, y, w_s, b_s, eps)    sa = np.mean(predict(w_s, b_s, x_adv) != y)    st = np.mean(predict(w_t, b_t, x_adv) != y)    print("surrogate success %.3f" % sa)    print("target success    %.3f" % st)    print("transfer ratio    %.3f" % (st / max(sa, 1e-9)))  if __name__ == "__main__":    transfer_report()
目的:用两个随机种子训练“同源不同参”的线性模型,在代理模型上生成 FGSM 对抗样本,再统计目标模型上的迁移成功率。
  1. y = (x[:, 0] ** 2 + x[:, 1] ** 2 < 1.6).astype(int) * 2 - 1制造一个“圆形决策区域”的二分类数据集,模拟同源数据分布,标签为 +1 或 -1。
  2. margin = y * (x @ w + b)计算每个样本的分类余量,正数越大代表模型越有把握。
  3. gw = np.mean(-y[:, None] * x * hinge[:, None], axis=0)合页损失对权重 w 的梯度,只罚那些余量小于 1 的样本。
  4. w_t, b_t = train_linear(x, y, seed=2)换一个随机种子再训练一个模型,模拟“同源但参数不同”的目标模型,即阿凯手里的真锁。
  5. grad_sign = -np.sign(y)[:, None] * np.sign(w)[None, :]FGSM 的符号梯度方向,推着输入往越过边界的方向走。
  6. x_adv = x + eps * grad_sign叠加扰动生成对抗样本,等价于在代理锁上锉出钥匙齿。
  7. st = np.mean(predict(w_t, b_t, x_adv) != y)在黑盒目标模型上统计对抗样本的成功率,即迁移成功率。

常见误区

误区“攻击者连目标模型的参数都看不到,黑盒攻击怎么可能成功?所谓迁移性只是论文里的理想情况吧。”

正解黑盒攻击恰恰依赖迁移性这个“反直觉”的事实:在相似数据上训练的模型决策边界高度重合,代理模型上生成的对抗样本对目标模型同样有效。真实攻防中,迁移攻击的成功率可以高达 60%-90%,远没有到“攻不破”的程度。阿凯的钥匙能在复刻锁上转动,就大概率能在同厂真锁上转动。

为何常见:人们容易把“信息不全”等同于“攻击无效”,忽略了模型间共享的统计规律远比想象中强。

误区“选最先进的网络、最全的数据集训练代理模型,迁移攻击就一定更强。”

正解迁移性取决于代理与目标模型的“相似度”,而不是代理模型的绝对实力。用 ImageNet 训练的超大模型去攻击一个在医疗影像数据上训练的小模型,迁移成功率往往惨不忍睹。选代理模型要“门当户对”:数据分布、任务类型、结构风格尽量贴近目标。同一训练集上不同随机种子训练的两个模型,迁移性都远高于两个异源模型。

为何常见:把系统工程思维误套到对抗攻击上,忘了攻击的本质是“借力打力”,而非“降维打击”。

误区“把 ε 调到 0.5 甚至 0.8,扰动这么明显,目标模型肯定被骗。”

正解扰动过大有两个恶果:一是突破扰动约束后,样本可能跨到目标模型决策边界的另一侧,反而被正确分类或落入不确定区域;二是人眼可见的扰动直接暴露攻击意图,在真实场景毫无意义。迁移性研究的核心恰恰是“小扰动、高迁移”,专业的做法是在多个 ε 下做网格评估,观察迁移率曲线,而不是一味加码。

为何常见:直观上“力气越大越能撬动”很合理,但决策边界是几何问题,不是力矩问题。

误区“模型做过对抗训练,又上过防御榜单,黑盒攻击肯定拿它没办法。”

正解对抗训练只会对训练阶段见过的扰动范式(通常是 PGD 白盒扰动)产生鲁棒性,而迁移攻击使用的是代理模型上的梯度方向,与防御模型的扰动分布可能完全不同。已有多项研究表明,集成迁移攻击可以在对抗训练模型上取得 30%-50% 的成功率。防御需要持续对抗评估,任何“绝对免疫”都是危险的承诺。

为何常见:对抗训练的宣传过于响亮,且其收益在常见基准上表现亮眼,让人忽略了分布外扰动的风险。

误区“能拿到梯度当然是白盒攻击最强,黑盒迁移攻击只是退而求其次的方案。”

正解白盒攻击强在“针对特定模型”的攻击成功率,但真实生产环境几乎不存在完全白盒的部署。黑盒迁移攻击具有更强的实战价值和隐蔽性:不需要触碰目标模型权重,攻击行为难以追溯;加上集成增强后,黑盒迁移攻击对许多模型的实际破坏力甚至超过单独的白盒攻击。两者的“强”不在同一个维度上。

为何常见:实验室里白盒基准分数更高,导致人们忽视黑盒攻击在真实约束下的不可替代性。

面试题

Q1. 在黑盒攻击场景中,攻击者无法直接获取以下哪项信息?

单选题 · easy

  • A.模型输出的类别标签
  • B.模型内部的梯度信息← 正确答案
  • C.模型输出的置信度分数
  • D.模型接收的输入数据

答案:B。黑盒攻击只能通过提交输入并观察输出来“试探”模型,类别标签、置信度、输入数据都是可观测的;而梯度信息藏在模型内部,只有白盒攻击才能获得。就像阿凯只能捅钥匙孔试探,却看不到锁芯弹子的排列。

Q2. 对抗样本的迁移性是指什么?

单选题 · easy

  • A.对抗样本从代理模型迁移到目标模型← 正确答案
  • B.攻击代码从一台服务器迁移到另一台
  • C.训练数据从源域迁移到目标域
  • D.模型参数从云端迁移到本地设备

答案:A。迁移性指在代理模型(白盒)上生成的对抗样本,无需改动即可使目标模型(黑盒)犯错。B、C、D 分别描述的是部署、迁移学习和模型部署场景,与对抗攻击无关。

Q3. FGSM 中 sign(符号)函数的主要作用是什么?

单选题 · easy

  • A.计算梯度的精确数值大小
  • B.只保留梯度方向的信息← 正确答案
  • C.完全消除梯度信号影响
  • D.将梯度放大到最大幅度

答案:B。sign 把每个像素的梯度压缩成 +1 或 -1,只保留“往哪个方向推”的信息,从而让扰动在 L∞ 约束下均匀可控。若保留梯度大小,扰动会集中在少数大梯度像素上,既破坏图像又降低迁移性。

Q4. 以下哪种操作最能提升对抗样本的跨模型迁移性?

单选题 · mid

  • A.集成多个代理模型的梯度方向← 正确答案
  • B.增大输入图像的对比度
  • C.减小扰动值直至接近零
  • D.提高模型训练时的学习率

答案:A。集成攻击取多个代理模型的共识梯度,过滤单个模型的偶然脆弱点,只保留共有的决策边界弱点,因此显著提升迁移性。对比度调整与攻击无关,扰动为零则攻击失效,学习率是训练阶段的超参数。

Q5. 不同模型间梯度方向高度对齐的根本原因是?

单选题 · mid

  • A.它们共享了相同的随机种子
  • B.相似数据训练出重叠的特征← 正确答案
  • C.所有模型都使用交叉熵损失
  • D.攻击算法强制梯度保持一致

答案:B。在相似数据分布上训练的深度模型,即使架构不同,学到的边缘、纹理、形状等特征表示也大量重叠,决策边界几何相似,因此梯度方向自然对齐。随机种子、损失函数、攻击算法都不是根因。

Q6. 对抗训练(Adversarial Training)的核心思想是?

单选题 · mid

  • A.训练集混入对抗样本来提升鲁棒性← 正确答案
  • B.删除所有攻击样本对应的训练数据
  • C.对模型输出做随机化后处理
  • D.使用更深网络来拟合对抗样本

答案:A。对抗训练用 min-max 目标,先找最坏扰动再在其上最小化损失,本质是让模型在训练时就“见过”对抗样本。删除数据、随机化输出、加深网络都无法从根本上打平决策边界的脆弱点。

Q7. 用查询-反馈方式训练代理模型的目的是?

单选题 · mid

  • A.窃取目标模型的全部网络权重
  • B.让代理模型模仿目标的输入输出行为← 正确答案
  • C.替代目标模型对外提供预测服务
  • D.消除代理模型对目标模型的依赖

答案:B。查询-反馈(蒸馏式)训练通过不断提问目标模型、用其输出当标准答案,使代理模型在行为层面逼近目标模型,从而让白盒攻击的方向更贴合黑盒目标。权重无法通过查询获取,替代服务也不是攻击目标。

Q8. 对抗训练后的模型仍可能被迁移攻击破解,主要原因是?

单选题 · hard

  • A.对抗训练导致模型参数量急剧膨胀
  • B.迁移扰动不在训练时的扰动分布内← 正确答案
  • C.对抗训练大幅降低了模型精度
  • D.迁移攻击使用了更大的迭代步数

答案:B。对抗训练只对训练阶段模拟的扰动范式(通常是白盒 PGD 类)鲁棒。迁移攻击的扰动来自代理模型的梯度方向,与防御模型训练时的扰动分布不同,属于分布外扰动,因此仍能绕过。参数膨胀、精度下降、步数大小都不是本质原因。

Q9. 以下哪些策略能够有效提升黑盒攻击的迁移性?

多选题 · hard

  • A.在多个代理模型上做集成攻击← 正确答案
  • B.对输入做随机缩放与填充变换← 正确答案
  • C.在迭代过程中累积梯度动量← 正确答案
  • D.直接在目标模型上计算梯度

答案:ABC。集成攻击取多个模型的共识梯度,输入变换防止扰动过拟合单一纹理,动量迭代平滑方向、穿过局部极值,三者均从不同角度增强迁移性。D 是白盒攻击,黑盒场景下无法获得目标模型梯度。

Q10. 关于迁移成功率的评估,下列说法正确的是?

多选题 · extreme

  • A.评估时应在同一批对抗样本上统计← 正确答案
  • B.归一化迁移率等于目标与源成功率之比← 正确答案
  • C.扰动幅度越大迁移率一定单调上升
  • D.评估需要固定扰动预算进行对比← 正确答案

答案:ABD。迁移率必须在“同一批对抗样本”上对比源和目标成功率,归一化定义为 S_t / S_a;固定扰动预算(ε)才能公平对比不同方法。C 错误:扰动过大可能跨过决策边界反而降低迁移率,“单调上升”不成立。