news 2026/8/29 10:16:45

CVPR2018 | MI-FGSM | 动量迭代攻击的迁移性奥秘与实战解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CVPR2018 | MI-FGSM | 动量迭代攻击的迁移性奥秘与实战解析

1. 从“过拟合”到“泛化”:MI-FGSM如何让对抗样本“一通百通”

想象一下,你是一个技艺高超的锁匠,专门研究一种万能钥匙。传统的万能钥匙(比如早期的FGSM攻击)可能只能打开一两种特定型号的锁(模型),一旦锁的内部结构稍有变化(换成另一个模型),这把钥匙就完全失效了。而MI-FGSM,就像是在你打造钥匙的过程中,加入了一个“经验记忆库”,让你每一次打磨钥匙的动作,都不仅仅基于当前锁芯的触感,还融合了之前尝试过的所有锁芯的“感觉”。最终,你打造出的这把钥匙,不仅轻松打开了手头这把锁,还能神奇地打开一大批你从未见过的、结构各异的锁。这就是MI-FGSM的核心魅力——极大地提升了对抗样本的“迁移性”

在CVPR 2018上发表的这篇论文《Boosting Adversarial Attacks with Momentum》,正是为了解决这个“一把钥匙开一把锁”的困境。当时,对抗攻击领域已经发现,像I-FGSM(迭代快速梯度符号法)这样的迭代攻击方法,虽然能在已知模型(白盒)上达到近乎100%的攻击成功率,但生成的对抗样本“过拟合”现象严重。它太过于针对当前这个模型的“弱点”进行优化,以至于生成的扰动路径非常崎岖、特异,一旦换到另一个模型上,这些精心设计的扰动就完全不起作用了,黑盒攻击成功率很低。

那么,MI-FGSM是怎么做到的呢?它的核心思想借鉴了深度学习模型训练中一个非常经典的技术:动量(Momentum)。在训练神经网络时,动量优化器(如SGD with Momentum)通过累积过去梯度的指数加权平均,来稳定参数的更新方向,帮助模型跳出局部最优的“坑”,更快地收敛到更好的解。论文的作者们敏锐地意识到,生成对抗样本的过程,本质上也是一个优化过程:我们是在输入图像的像素空间里,寻找一个微小的扰动方向,使得模型的损失函数(比如分类错误)最大化。这个过程同样会陷入针对当前模型的局部最优“陷阱”。

于是,他们将动量机制引入了迭代攻击。简单来说,在每一次迭代更新扰动时,MI-FGSM不只是看当前这一步的梯度方向,还会把之前所有迭代步骤的梯度方向,以一个衰减因子加权“记忆”下来,形成一个“速度”向量。当前的更新方向,就是这个速度向量的方向。这样做有两个巨大的好处:第一,它平滑了更新轨迹,避免了I-FGSM那种“贪婪地”只朝当前最陡方向走,结果在决策边界附近来回震荡、陷入局部尖峰的情况。第二,这种平滑的、更具“惯性”的更新方向,往往更贴近多个模型共享的、更本质的“脆弱方向”,从而让生成的对抗样本具备了更强的泛化能力,也就是我们说的迁移性。

我刚开始复现这个算法时,最直观的感受就是,MI-FGSM生成的对抗噪声,在视觉上似乎比I-FGSM的“纹理”更自然、更平滑一些。虽然都是人眼难以察觉的微小扰动,但MI-FGSM的扰动模式看起来不那么“尖锐”和“随机”,这或许就是其迁移性更好的一个外在表现。对于安全测试工程师或者AI模型的研究者来说,掌握MI-FGSM意味着你能用更少的代价(无需知道目标模型内部细节),构造出威胁性更强的对抗样本,从而更全面地评估你手中模型的鲁棒性。

2. 动量迭代攻击的“内功心法”:算法拆解与实战代码

光说不练假把式,要真正理解MI-FGSM,我们必须把它从数学公式变成可以运行的代码。别担心,我会用最直白的语言和代码,带你一步步拆解这个算法的“内功心法”。我们先从最基础的非目标攻击、L∞范数约束的场景开始。

首先,我们明确一下“战场”和“武器”:

  • 输入:一张干净的图片x,它的真实标签y
  • 目标:找到一个对抗样本x_adv,使得模型将它错误分类,同时要求x_advx在每个像素上的最大差异(L∞范数)不超过一个很小的阈值epsilon(比如16/255,意味着像素值变化不超过16)。
  • 武器:我们有一个可以访问的白盒模型model,能获取它对任意输入图片的损失函数loss和梯度gradient

MI-FGSM的算法流程,可以概括为以下几步,我把它和I-FGSM放在一起对比,你就能看出关键区别:

I-FGSM(传统迭代法)

  1. 初始化对抗样本x_adv = x
  2. 对于迭代次数t从 1 到T
    • 计算当前x_adv的损失梯度g = gradient(x_adv, y)
    • 更新x_adv = x_adv + alpha * sign(g)。这里alpha = epsilon / T是单步步长,sign是取符号函数(将梯度方向变为+1, -1或0)。
    • x_adv裁剪回[x - epsilon, x + epsilon]的范围内。
  3. 输出最终的x_adv

MI-FGSM(动量迭代法)

  1. 初始化对抗样本x_adv = x同时初始化一个速度向量velocity = 0。这个velocity就是动量的载体。
  2. 对于迭代次数t从 1 到T
    • 计算当前x_adv的损失梯度g = gradient(x_adv, y)
    • 关键一步:更新速度向量velocity = mu * velocity + g / norm(g)。这里mu是动量衰减因子(通常设为1.0),norm(g)是梯度g的L1范数(所有梯度绝对值之和)。这一步将当前梯度的“方向”(归一化后)累积到历史速度中。
    • 更新x_adv = x_adv + alpha * sign(velocity)注意,这里我们用的是速度向量velocity的符号,而不是当前梯度g的符号
    • 同样,将x_adv裁剪回允许的扰动范围内。
  3. 输出最终的x_adv

看到区别了吗?I-FGSM就像一个短视的登山者,每一步都只朝着当前最陡的方向(当前梯度符号)爬,很容易掉进一个小坑(局部最优)里出不来。而MI-FGSM则像一个有经验的登山者,他有一个“方向感”,当前这一步不仅看脚下的陡坡,还会考虑之前走过的总体方向(速度向量),这样就更有可能避开小坑,朝着山脊(更通用的脆弱方向)前进。

下面是一个使用PyTorch实现的简化版MI-FGSM核心代码块,你可以直接拿来尝试:

import torch import torch.nn as nn def mi_fgsm_attack(model, images, labels, epsilon=16/255, alpha=1.6/255, iterations=10, mu=1.0): """ 针对单个模型的非目标MI-FGSM攻击。 model: 白盒模型(需要能返回损失和梯度)。 images: 原始干净图像,形状为 [batch, C, H, W]。 labels: 图像的真实标签。 epsilon: 允许的最大扰动(L∞范数)。 alpha: 每次迭代的步长,通常为 epsilon/iterations。 iterations: 迭代次数。 mu: 动量衰减因子。 """ # 克隆原始图像,作为对抗样本的起点 adv_images = images.clone().detach().requires_grad_(True) # 初始化速度向量为零 velocity = torch.zeros_like(adv_images) for i in range(iterations): # 前向传播,计算损失 outputs = model(adv_images) loss = nn.CrossEntropyLoss()(outputs, labels) # 清零过往梯度,计算当前梯度 model.zero_grad() if adv_images.grad is not None: adv_images.grad.zero_() loss.backward() # 获取当前输入图像的梯度 grad = adv_images.grad.data # MI-FGSM核心:更新速度向量(梯度归一化使用L1范数) grad_norm = torch.norm(grad.view(grad.shape[0], -1), p=1, dim=1) grad = grad / grad_norm.view(-1, 1, 1, 1) # 归一化 velocity = mu * velocity + grad # 根据速度向量的符号方向更新对抗样本 adv_images = adv_images + alpha * velocity.sign() # 将对抗样本的扰动限制在 epsilon 球内 delta = torch.clamp(adv_images - images, min=-epsilon, max=epsilon) adv_images = torch.clamp(images + delta, min=0, max=1).detach().requires_grad_(True) return adv_images

这段代码清晰地展示了动量累积的过程。velocity = mu * velocity + grad这一行就是算法的灵魂。当mu=1.0时,速度向量本质上是所有历史梯度方向的(归一化后)累加。通过velocity.sign()来决定每一步扰动的方向,使得更新更加稳定和一致。

3. 从“单挑”到“群殴”:集成攻击打造通用对抗样本

掌握了针对单个模型的MI-FGSM,我们已经能造出一把不错的“万能钥匙”了。但论文的作者们并不满足于此,他们提出了一个更强大的思路:为什么不直接针对一群模型来打造这把钥匙呢?如果一个对抗样本能同时欺骗多个结构各异的模型,那么它很可能抓住了这些模型共有的、更深层次的脆弱性,其迁移到未知模型(黑盒)的成功率自然会大幅提升。这就是“攻击模型集成”的核心思想,也是实现“构造一个能同时欺骗多个预训练模型的通用对抗样本”这一实战场景的关键。

但是,如何“攻击”一个模型集成呢?最简单粗暴的想法是,分别用每个模型的梯度来更新对抗样本,但这样计算量大,且效果未必好。论文中探索并对比了三种集成策略,而实验结果明确指出,在Logits层面进行集成(Ensemble in Logits)是最有效的方法。

让我来解释一下这三种策略:

  1. 在损失函数上平均(Ensemble in Loss):计算对抗样本在每个模型上的损失,然后求平均,用这个平均损失的梯度来更新。J_total = (J_model1 + J_model2 + ...) / K。这相当于让对抗样本同时朝着让每个模型都犯错的方向努力,但损失函数经过Softmax后已经非线性化了,直接平均可能不是最优。
  2. 在预测概率上平均(Ensemble in Predictions):计算每个模型输出的预测概率(Softmax之后的结果),然后对概率进行平均,再基于这个平均概率计算损失。p_total = (p_model1 + p_model2 + ...) / K。这种方式比损失函数平均更平滑一些。
  3. 在Logits上平均(Ensemble in Logits)这是论文推荐的最佳方法。Logits是模型最后一层线性层的输出,即Softmax激活之前的原始分数。它包含了模型对于每个类别最“原始”的置信度信息,没有经过非线性压缩。我们将所有模型的Logits直接加权平均:l_total = sum(w_k * l_model_k),然后基于这个融合后的Logits计算交叉熵损失。这样做的好处是,融合发生在非线性激活之前,能最大程度地保留各个模型的梯度信息,让对抗样本的优化过程能更直接地利用所有模型的“意见”。

在实战中,我们只需要对之前的单模型MI-FGSM代码做一个关键的修改:在每次迭代计算梯度时,我们不再使用单一模型的损失,而是使用集成模型的损失。以下是核心的修改部分:

def mi_fgsm_attack_ensemble(models, weights, images, labels, epsilon=16/255, alpha=1.6/255, iterations=10, mu=1.0): """ 针对模型集成的非目标MI-FGSM攻击。 models: 一个包含多个模型的列表。 weights: 对应每个模型的集成权重列表,总和应为1。 """ adv_images = images.clone().detach().requires_grad_(True) velocity = torch.zeros_like(adv_images) for i in range(iterations): # 初始化融合后的logits为零 ensemble_logits = None # 遍历所有模型,累加加权后的logits for model, weight in zip(models, weights): logits = model(adv_images) # 假设模型直接输出logits if ensemble_logits is None: ensemble_logits = weight * logits else: ensemble_logits += weight * logits # 基于融合后的logits计算损失 loss = nn.CrossEntropyLoss()(ensemble_logits, labels) # ... 后续计算梯度、更新速度向量和对抗样本的步骤与单模型版本完全相同 ... model.zero_grad() # 注意需要清空所有模型的梯度 if adv_images.grad is not None: adv_images.grad.zero_() loss.backward() grad = adv_images.grad.data grad_norm = torch.norm(grad.view(grad.shape[0], -1), p=1, dim=1) grad = grad / grad_norm.view(-1, 1, 1, 1) velocity = mu * velocity + grad adv_images = adv_images + alpha * velocity.sign() delta = torch.clamp(adv_images - images, min=-epsilon, max=epsilon) adv_images = torch.clamp(images + delta, min=0, max=1).detach().requires_grad_(True) return adv_images

通过这种集成攻击,我们生成的对抗样本就像是经过了“多模型联合训练”。论文中的实验数据令人印象深刻:使用Inception-v3, Inception-v4, Inception-ResNet-v2三个模型集成生成的对抗样本,去攻击一个全新的、未见过的ResNet-152模型,其黑盒攻击成功率比攻击单个模型后再迁移过去要高出非常多。更厉害的是,即使是那些经过“对抗训练”(一种专门防御对抗攻击的训练技术)的强防御模型,在这种集成攻击面前,防御也被大幅削弱。这为我们评估模型在最坏情况下的鲁棒性,提供了一个极其强大的基准工具。

4. 实验深潜:数据背后的原理与调参实战

读论文最怕只看结论不看实验,而这篇论文的实验部分恰恰是精华所在。它不仅仅展示了MI-FGSM效果有多好,更通过一系列精巧的实验设计,向我们揭示了为什么动量能提升迁移性,以及如何设置关键参数才能达到最佳效果。这部分内容对于我们在自己的任务中应用和调优MI-FGSM至关重要。

首先,我们来看那个揭示“稳定性”奥秘的图——余弦相似度分析。论文中比较了I-FGSM和MI-FGSM在迭代过程中,连续两次更新方向之间的余弦相似度。你可以把“更新方向”想象成登山者每一步的前进方向。I-FGSM的余弦相似度波动很大,时正时负,说明它经常“朝三暮四”,前后步伐方向不一致,在原地打转或陷入局部陷阱。而MI-FGSM的余弦相似度始终保持在很高的正值(接近1),这说明它的更新方向非常稳定,每一步都坚定地朝着一个大致相同的方向前进。这种稳定性使得扰动能够逃离单个模型决策边界附近那些复杂的、特化的“局部最优”区域,从而找到一条更平坦、更通用的路径去误导模型。这正是迁移性提升的直观解释。

其次,关于核心超参数mu(动量衰减因子)和迭代次数T的选择。论文通过详实的实验给出了黄金指南:

  • 衰减因子mu:图2展示了mu从0到2变化时,黑盒攻击成功率的变化。当mu=0时,MI-FGSM退化为I-FGSM。随着mu增大,黑盒攻击成功率快速上升,在mu=1.0附近达到峰值,之后开始下降。mu=1.0意味着历史梯度信息被完全保留(无衰减累加),这通常是最优选择。在实际应用中,如果你没有时间精细调参,直接设置mu=1.0是一个稳妥且高效的选择。
  • 迭代次数T:图3的对比非常经典。对于I-FGSM,随着迭代次数增加,白盒攻击成功率很快达到100%,但黑盒攻击成功率却显著下降,这就是“过拟合”白盒模型的典型表现。反观MI-FGSM,随着迭代增加,白盒攻击成功率保持高位,而黑盒攻击成功率基本保持稳定甚至略有提升。这完美印证了动量机制缓解了“攻击能力”与“迁移性”之间的权衡。在实践中,迭代次数通常设置为10次左右,在计算成本和攻击效果间取得良好平衡。步长alpha一般设为epsilon / T

为了让你更清楚不同参数的影响,我整理了一个简单的参数效果表,你可以把它当作实战速查手册:

参数作用典型值/范围影响与调参建议
epsilon扰动上限8/255, 16/255越大攻击越强,但噪声越明显。16/255是ImageNet上常用基准。
T(迭代次数)优化步数10太少攻击不充分,太多可能过拟合(对I-FGSM)或增加计算量。MI-FGSM对T不敏感。
alpha(步长)单步扰动大小epsilon / T通常按此公式设置,保证T步后总扰动不超过epsilon。
mu(动量因子)历史梯度权重1.0关键参数。0退化为I-FGSM,1.0效果最佳,大于1可能导致不稳定。
集成权重w_k各模型重要性均等或自定义攻击集成时使用。通常设为均等。若已知某个模型与黑盒目标更相似,可适当增加其权重。

最后,关于扰动大小epsilon的权衡。图5展示了随着epsilon增大,各种方法的攻击成功率变化。一个有趣的发现是:对于黑盒攻击,要达到相同的攻击成功率,MI-FGSM所需的epsilon比FGSM和I-FGSM都要小。这意味着,MI-FGSM可以用更轻微、更不易察觉的扰动,实现同样甚至更好的攻击效果。这在追求对抗样本隐蔽性的场景下,是一个巨大的优势。

在我自己的项目中,当我需要评估一个模型对黑盒攻击的鲁棒性时,我的标准流程是:首先使用epsilon=16/255, T=10, mu=1.0的MI-FGSM进行单模型攻击作为基线;如果攻击成功率不高,我会转而采用集成攻击,挑选3-4个不同架构的经典模型(如VGG, ResNet, DenseNet, MobileNet)进行Logits集成;如果还想进一步加压,我会适当增加epsilon到32/255,或者微调集成权重。这套组合拳下来,基本上能摸清一个模型防御能力的底。

5. 超越竞赛:MI-FGSM的遗产与当代启示

MI-FGSM不仅仅是一个在NIPS 2017竞赛中夺冠的算法,它更重要的价值在于为对抗攻击领域开辟了一条清晰的技术路径,其思想影响深远。论文末尾那个精妙的“类比”讨论,将寻找对抗样本比作训练模型,将对抗样本的迁移性比作模型的泛化性,一下子拔高了整个工作的立意。既然动量、集成这些技巧能提升模型泛化性,那么用它来提升对抗样本的“泛化性”(即迁移性)就是顺理成章的。这个元视角启发了后续大量研究。

如今,MI-FGSM已经成为黑盒对抗攻击的标准基线方法强基准工具。任何新的防御方法,如果无法有效抵御MI-FGSM(特别是其集成攻击变种),那么其鲁棒性就要打上一个大大的问号。同时,它的思想也被众多后续工作吸收和发展。例如,后来的NI-FGSM(Nesterov Iterative FGSM)引入了Nesterov加速梯度思想,可以看作是动量方法的一个变体,进一步提升了攻击效率。VMIFGSM(方差调整动量)等工作则在动量基础上加入了自适应调整机制。在更复杂的攻击如基于查询的黑盒攻击中,动量思想也被用于平滑梯度估计,减少查询次数。

对于我们现在从事AI安全、模型鲁棒性研究的从业者来说,MI-FGSM给我们留下了几点宝贵的实战经验:

  1. 理解“过拟合”是核心:对抗攻击和模型训练一样,都要警惕过拟合。I-FGSM是过拟合白盒模型的典型,而MI-FGSM通过引入“记忆”来追求泛化。
  2. 集成是王道:无论是为了提升模型性能还是增强攻击迁移性,集成学习都是一个极其强大的策略。攻击一个模型集成,是构造高迁移性对抗样本最可靠的手段之一。
  3. 从优化视角思考问题:将对抗样本生成看作一个优化问题,那么所有能改进优化器性能的技术(动量、自适应学习率、Lookahead等)都可能被借鉴过来改进攻击算法。这仍然是一个活跃的研究方向。

回看这篇2018年的工作,它没有使用任何复杂的技巧,只是巧妙地借鉴了优化领域的经典思想,就解决了当时的一个关键难题。这提醒我们,有时候最好的创新,来自于跨领域的、对基础原理的深刻理解和巧妙应用。当你下次需要评估自己模型的鲁棒性时,别忘了祭出MI-FGSM这把“老枪”,它很可能依然是你武器库里最趁手、最可靠的家伙之一。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 17:11:38

深入解析Carla中的坐标系转换:从世界坐标到像素坐标的实战指南

1. 为什么坐标转换是自动驾驶仿真的“基本功” 如果你正在用Carla做自动驾驶仿真,想把一个路牌、一个行人,或者你自己车辆的未来轨迹,准确地画在相机拍到的图像上,那你一定会遇到一个绕不开的难题:坐标转换。这听起来像…

作者头像 李华
网站建设 2026/7/14 17:11:51

FireRedASR快速上手:音频上传、识别、结果复制,完整操作流程演示

FireRedASR快速上手:音频上传、识别、结果复制,完整操作流程演示 你是不是经常需要把会议录音、采访内容或者课程音频转换成文字?手动听写不仅耗时耗力,还容易出错。今天,我要给你介绍一个能彻底解决这个痛点的工具—…

作者头像 李华
网站建设 2026/7/14 17:11:38

3步实现视频转文字:开源工具Bili2text提升转录效率指南

3步实现视频转文字:开源工具Bili2text提升转录效率指南 【免费下载链接】bili2text Bilibili视频转文字,一步到位,输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 在信息爆炸的时代,视频内容已成…

作者头像 李华
网站建设 2026/7/14 17:11:50

荔枝派Nano全志F1C100s开发板实战:从uboot到buildroot的完整烧录指南

荔枝派Nano全志F1C100s开发板实战:从uboot到buildroot的完整烧录指南 最近有不少朋友开始玩起了那些小巧又便宜的ARM开发板,其中全志F1C100s这颗芯片因为其极致的性价比和相对完整的生态,吸引了不少嵌入式爱好者和初学者的目光。荔枝派Nano作…

作者头像 李华
网站建设 2026/7/14 17:11:48

MFC标签控件CTabCtrl实战:从基础创建到动态标签管理

1. 初识CTabCtrl:你的第一个标签页应用 如果你用过Windows系统的“系统属性”或者任何一个带标签页的软件设置界面,那你对标签控件(Tab Control)一定不陌生。它就像我们办公桌上的文件夹标签,点击不同的标签&#xff0…

作者头像 李华
网站建设 2026/7/14 17:11:49

KUKA机器人CCU板信号指示灯故障诊断与维护指南

1. 认识你的机器人“心脏”:CCU板与它的“眼睛” 大家好,我是老张,在工业自动化这行摸爬滚打了十几年,跟KUKA机器人打交道的时间比跟我家孩子都长。今天咱们不聊那些复杂的编程和轨迹规划,就说说机器人控制柜里一个特别…

作者头像 李华