1. 对抗性攻击入门从FGSM开始说起第一次接触对抗性攻击时我被这个看似简单的概念震撼到了——只需要对图像做微小的扰动就能让训练好的模型完全失明。这就像在停车标志上贴几个几乎看不见的贴纸就能让自动驾驶汽车把它误认成限速标志。FGSM快速梯度符号法是最基础的对抗攻击方法它的核心思想出奇地简单。想象你在爬山梯度下降是找最快的下山路径而FGSM则是找最快的上山路径。具体实现只需要三行关键代码x_adv x epsilon * grad.sign()这里的epsilon控制扰动强度通常设置为8/255这样扰动对人眼几乎不可见。我在CIFAR-10数据集上测试时发现用这个简单方法就能把ResNet110模型的准确率从95%打到59%。不过FGSM有个明显缺点它像盲人摸象只根据当前梯度走一步容易陷入局部最优。2. 迭代优化I-FGSM与MI-FGSM的进化2.1 I-FGSM小步快跑的智慧I-FGSM迭代FGSM改进了这个问题它像谨慎的登山者把一大步拆成多个小步。每次迭代时它会将扰动限制在[原图-epsilon, 原图epsilon]范围内for i in range(num_iter): x_adv x_adv alpha * grad.sign() x_adv torch.clamp(x_adv, x-epsilon, xepsilon)实测发现设置alpha0.8/255迭代20次时攻击成功率能达到99%。但新问题出现了——这种贪婪策略容易过拟合代理模型导致生成的对抗样本在黑盒场景下转移性差。2.2 MI-FGSM动量带来的稳定性MI-FGSM引入了动量项就像给登山者加了惯性导航。它通过累积历史梯度方向来避免震荡grad decay * momentum grad/(grad.abs().sum() 1e-8) momentum grad这个改进效果惊人。在相同迭代次数下使用decay1.0的动量能使攻击成功率提升约15%。我观察到动量项特别擅长处理那些梯度变化剧烈的区域比如图像中的边缘部分。3. 黑盒攻击的终极武器DIM-MIFGSM3.1 输入变换的魔法DIM多样化输入是提升黑盒可转移性的关键。它的核心思想是通过随机resize和padding来防止过拟合if torch.rand(1).item() p: rnd torch.randint(29, 33, (1,)).item() x_adv transforms.Resize((rnd, rnd))(x_adv) x_adv transforms.Pad([left, top, right, bottom])(x_adv)这种数据增强相当于给攻击算法戴上了老花镜迫使它学习更通用的特征。实验显示设置p0.5时攻击转移性最佳。3.2 集成攻击的协同效应单独使用DIM-MIFGSM已经很强大但结合集成攻击才是真正的大杀器。我建议选择3-5个结构差异大的模型model_names [resnet110_cifar10, densenet40_cifar10, vgg19_cifar10] ensemble ensembleNet(model_names)在CIFAR-10上的测试表明这种组合能使黑盒攻击成功率从单模型的40%提升到75%以上。关键在于模型多样性——就像委员会决策差异越大泛化能力越强。4. 实战技巧与避坑指南4.1 参数调优经验经过多次实验我总结出这些黄金参数组合epsilon8/255L∞约束alpha0.8/255~1.6/255迭代次数20-50次动量衰减0.9-1.0DIM概率0.3-0.7特别注意alpha与epsilon的关系——alpha太大容易振荡太小则收敛慢。我的经验公式是alpha ≈ epsilon/10。4.2 常见问题排查遇到过最棘手的问题是攻击后模型准确率不降反升。这通常是因为梯度爆炸添加梯度裁剪过拟合降低迭代次数或增强DIM模型防御尝试不同的代理模型组合有个实用技巧可视化对抗样本的扰动模式。健康的扰动应该像细密的噪声如果出现明显条纹或块状说明算法可能出了问题。