尧图精选

攻击失败不等于模型鲁棒:对抗鲁棒性评估的认知陷阱与系统方法

🕒 发布时间:2026/9/25 14:10:11 📁 来源:尧图网络
1. 攻击失败就等于模型安全先厘清这个危险的认知陷阱很多人第一次接触对抗鲁棒性Adversarial Robustness这个概念时脑子里冒出来的第一个判断标准特别朴素拿几个攻击样本去测模型如果模型没被攻破那它就是鲁棒的。这个逻辑听起来无懈可击实际上却是一个足以让整个安全评估结论翻车的思维陷阱。我最初做模型安全评估的时候也踩过这个坑。当时用FGSMFast Gradient Sign Method生成了几百张对抗样本喂给一个图像分类模型准确率只掉了不到两个百分点团队里有人就说“这个模型挺稳的”。结果换了CW攻击和PGD攻击之后准确率直接崩到接近随机猜测的水平。同一模型同一数据集仅仅因为攻击方法不同结论就天差地别。这件事让我意识到一个核心问题攻击没成功可能只是因为你用的攻击不够强而不是因为模型真的鲁棒。这两者之间的区别在安全评估里是致命的。你把一个实际上脆弱的模型判定为鲁棒部署到实际场景中遇到真正有动机的攻击者后果不堪设想。对抗鲁棒性这个领域本质上研究的是模型在面对刻意设计的、最坏情况下的输入扰动时能否保持稳定输出。注意这里的关键词——“刻意设计”和“最坏情况”。它不是随机噪声不是自然分布偏移而是一个有目标的优化过程。攻击者知道你的模型结构、参数、梯度信息白盒场景或者至少能查询你的模型输出黑盒场景然后针对性地构造输入让模型犯错。所以判断一个模型是否鲁棒不能只看“某次攻击有没有成功”而要看在所有已知攻击方法下模型性能下降的下界在哪里。这个下界越低说明模型越脆弱。而如果你只测了一两种弱攻击得到的下界是虚高的是一种安全幻觉。这篇文章想做的事情很明确把“攻击失败”和“模型鲁棒”之间的那层窗户纸捅破讲清楚为什么单次攻击评估不可靠怎么系统地评估鲁棒性以及在实操中怎么避免自己骗自己。适合已经了解对抗样本基本概念、正在做模型安全评估或者准备发论文的从业者也适合刚入门想建立正确认知框架的读者。2. 攻击方法的强弱光谱为什么你测的那个攻击可能只是挠痒痒2.1 从FGSM到PGD攻击强度的进化链条要理解为什么“攻击没成功”不能作为鲁棒性的证据首先得搞清楚攻击方法本身是有强弱之分的。这个强弱不是主观感受而是有明确的数学和实验依据。最早的一批攻击方法比如FGSM思路非常直接沿着损失函数对输入的梯度方向走一步步长固定。用公式表示就是x_adv x ε · sign(∇_x L(θ, x, y))其中ε是扰动预算sign是符号函数∇_x L是损失对输入的梯度。这个方法快一次前向传播加一次反向传播就搞定但它的弱点也很明显——只走一步步长固定很容易陷入局部极值或者被梯度掩蔽gradient masking现象欺骗。后来出现的I-FGSMIterative FGSM或者叫BIMBasic Iterative Method把一步变成多步每次走一小步然后裁剪回扰动预算范围内x_adv^{t1} Clip_{x,ε}(x_adv^t α · sign(∇_x L(θ, x_adv^t, y)))这样攻击强度明显提升但依然存在一个问题它沿着梯度方向走如果模型的梯度信息被刻意混淆了比如做了梯度正则化或者用了非可微的预处理攻击效果就会大打折扣。再往后PGDProjected Gradient Descent出现了它本质上就是I-FGSM加上随机初始化。别小看这个随机初始化它让攻击可以从多个起点出发找到更坏的极值点。PGD被很多研究者认为是“一阶攻击里最强的那一类”在Madry等人的工作中PGD被用作对抗训练的标准攻击方法。但PGD也不是终点。CW攻击Carlini Wagner换了一个优化目标不直接最大化交叉熵损失而是最小化对抗样本和目标类别之间的差距同时约束扰动大小。它用变量替换把约束优化变成无约束优化可以用标准优化器求解。CW攻击的强度在很多时候超过PGD但计算代价也更高。再往后还有AutoAttack这样的集成攻击框架它把多种攻击方法组合起来取最坏情况的结果。AutoAttack包含APGDAuto-PGD、FABFast Adaptive Boundary攻击和Square Attack等基本上代表了当前无目标攻击的SOTA水平。2.2 梯度掩蔽攻击失败最常见的假象来源梯度掩蔽是对抗鲁棒性评估里最阴险的陷阱之一。它的表现形式是模型在面对基于梯度的攻击时表现得很鲁棒但换一种不需要梯度的攻击立刻就崩了。梯度掩蔽的产生原因有好几种。一种是模型本身不可微比如用了量化、离散化或者某些非标准激活函数导致梯度信息没有意义。另一种是模型刻意做了梯度正则化让损失曲面变得很陡峭或者很平坦使得基于梯度的攻击找不到有效的方向。还有一种是随机化防御比如在推理时加入随机噪声或者随机变换让攻击者无法获得稳定的梯度估计。问题在于梯度掩蔽并没有真正消除对抗脆弱性它只是把脆弱性藏起来了。一旦攻击者改用迁移攻击从另一个模型上生成对抗样本、基于查询的攻击比如Square Attack、NES或者期望变换攻击EOTExpectation Over Transformation模型就会原形毕露。我做过一个实验用一个做了梯度正则化的模型FGSM和PGD攻击下准确率只掉3%左右看起来非常鲁棒。但用Square Attack一种基于随机搜索的黑盒攻击一测准确率掉了40%以上。这就是典型的梯度掩蔽——你以为模型学会了抵抗攻击实际上它只是学会了让梯度变得没用。2.3 攻击强度评估的实操对照表为了让大家更直观地理解不同攻击方法的强度和适用场景我整理了一个对照表攻击方法类型计算代价典型强度主要弱点FGSM白盒一阶极低弱单步易被梯度掩蔽欺骗I-FGSM/BIM白盒一阶低中仍依赖梯度质量PGD白盒一阶中强对梯度掩蔽仍有一定敏感性CW白盒优化高很强计算慢超参数敏感AutoAttack集成很高SOTA计算资源需求大Square Attack黑盒查询中高强查询次数多可能被检测迁移攻击黑盒迁移低中依赖源模型和目标模型的相似度这张表的核心信息是如果你只用了FGSM或者单步攻击来评估鲁棒性你的结论基本没有参考价值。至少要用PGD加上一个黑盒攻击比如Square Attack做交叉验证才能对模型的鲁棒性有一个初步的判断。3. 鲁棒性评估的正确打开方式从单点测试到最坏情况下界3.1 为什么单次攻击结果不能作为鲁棒性证据回到文章开头那个问题攻击没成功模型就鲁棒吗从逻辑上讲这是一个典型的“肯定后件”谬误。攻击成功意味着模型不鲁棒但攻击没成功并不意味着模型鲁棒——因为可能只是你用的攻击不够强。用形式化的语言来说我们想评估的是模型在扰动预算ε下的最坏情况准确率RobustAcc(ε) E_{(x,y)~D} [ min_{||δ||≤ε} 1(f(xδ) y) ]这个定义里的min是对所有满足扰动约束的δ取的也就是说我们要找的是让模型犯错的那个最坏扰动。但在实际操作中我们不可能穷举所有δ只能用攻击算法去近似这个min。不同的攻击算法给出的近似质量不同有的能找到更坏的δ有的只能找到局部最优。所以你用某个攻击算法跑出来的准确率实际上是真实最坏情况准确率的一个上界。攻击越强这个上界越紧。如果你用的攻击很弱得到的上界可能远高于真实值你就被这个虚高的上界骗了。3.2 用PGD做基准评估的完整流程PGD是目前公认的一阶攻击基准用它来做鲁棒性评估是一个比较稳妥的起点。下面是我在实际操作中总结的一套流程。第一步确定扰动预算ε。这个值通常根据任务和数据集来定。图像分类里CIFAR-10常用ε8/255ImageNet常用ε4/255或者2/255。ε越大攻击越强但视觉上越明显。选择ε的时候要考虑实际场景中攻击者能施加多大的扰动。第二步设置PGD的超参数。PGD有几个关键参数步数num_steps、步长step_size、随机重启次数num_restarts。步数一般设20到100步长通常设为ε/4或者ε/10。随机重启次数越多攻击越强但计算代价也越大。我一般至少设5次随机重启重要评估会设10次以上。第三步生成对抗样本并评估。对测试集的每个样本用PGD生成对抗样本然后看模型在这些样本上的准确率。这个准确率就是PGD攻击下的鲁棒准确率。第四步交叉验证。用至少一种黑盒攻击比如Square Attack再跑一遍看结果是否一致。如果PGD下准确率很高但Square Attack下准确率很低说明模型可能存在梯度掩蔽需要进一步排查。下面是一个用PyTorch实现PGD攻击的简化代码示例import torch import torch.nn as nn def pgd_attack(model, x, y, epsilon, alpha, num_steps, num_restarts1): PGD攻击实现 model: 目标模型 x: 原始输入 y: 真实标签 epsilon: 扰动预算 alpha: 步长 num_steps: 迭代步数 num_restarts: 随机重启次数 best_adv x.clone() best_loss torch.zeros(x.size(0), devicex.device) for _ in range(num_restarts): # 随机初始化 delta torch.empty_like(x).uniform_(-epsilon, epsilon) adv (x delta).clamp(0, 1).detach() for _ in range(num_steps): adv.requires_grad True output model(adv) loss nn.CrossEntropyLoss()(output, y) grad torch.autograd.grad(loss, adv)[0] # 沿梯度方向更新 adv adv.detach() alpha * grad.sign() # 投影回扰动预算内 delta (adv - x).clamp(-epsilon, epsilon) adv (x delta).clamp(0, 1).detach() # 记录最坏的对抗样本 with torch.no_grad(): output model(adv) loss nn.CrossEntropyLoss(reductionnone)(output, y) mask loss best_loss best_adv[mask] adv[mask] best_loss[mask] loss[mask] return best_adv这段代码的核心逻辑是随机初始化扰动然后迭代地沿梯度方向更新每次更新后把扰动投影回ε球内同时保证输入在合法范围内0到1。多次随机重启取最坏结果。3.3 黑盒攻击为什么不可省略白盒攻击假设攻击者知道模型的所有信息包括架构、参数、梯度。这个假设在很多实际场景中并不成立。黑盒攻击假设攻击者只能查询模型的输入输出更贴近真实威胁模型。黑盒攻击主要有两类基于迁移的攻击和基于查询的攻击。基于迁移的攻击思路是在一个替代模型上生成对抗样本然后直接喂给目标模型。如果两个模型的决策边界相似对抗样本就能迁移过去。这类攻击的强度取决于替代模型和目标模型的相似度以及对抗样本的可迁移性。基于查询的攻击比如Square Attack、NES、Bandit Attack则直接通过查询目标模型来估计梯度或者搜索对抗样本。Square Attack的思路很巧妙它不估计梯度而是在随机选择的方形区域上施加随机扰动如果扰动降低了模型对真实类别的置信度就保留否则就回退。这个方法简单但出奇地有效而且对梯度掩蔽免疫。我在评估模型时通常会用PGD做白盒基准用Square Attack做黑盒基准。如果两者结果差距很大就会重点排查梯度掩蔽问题。4. 对抗训练之后模型就真的鲁棒了吗4.1 对抗训练的基本原理与常见误区对抗训练是目前提升模型鲁棒性最主流的方法。它的核心思想很简单在训练过程中不仅用原始样本还用对抗样本一起训练让模型学会在扰动下保持正确输出。Madry等人提出的对抗训练框架可以形式化为一个min-max优化问题min_θ E_{(x,y)~D} [ max_{||δ||≤ε} L(θ, xδ, y) ]内层的max是找最坏扰动外层的min是优化模型参数。实际操作中内层的max用PGD来近似外层的min用SGD来优化。对抗训练确实能显著提升模型在PGD攻击下的鲁棒性。但这里有几个常见的误区需要澄清。误区一对抗训练后的模型对所有攻击都鲁棒。实际上对抗训练主要提升的是对训练时所用攻击方法的鲁棒性。如果你用PGD训练模型对PGD的鲁棒性会很好但对CW或者黑盒攻击的鲁棒性可能就没那么理想。而且对抗训练后的模型仍然可能被更强的攻击比如AutoAttack攻破只是需要的扰动可能更大。误区二对抗训练不会损失干净准确率。这是一个很普遍的误解。对抗训练通常会导致干净样本上的准确率下降这个现象叫做“鲁棒性-准确率权衡”robustness-accuracy tradeoff。在CIFAR-10上标准训练的模型干净准确率可以到95%以上但对抗训练后通常降到85%左右甚至更低。这个代价是实实在在的。误区三对抗训练可以完全消除对抗脆弱性。目前的理论和实验都表明对抗训练可以提升鲁棒性但不能完全消除脆弱性。尤其是在高维输入空间和大扰动预算下模型仍然存在被攻破的可能。对抗鲁棒性是一个程度问题不是一个二元问题。4.2 鲁棒性-准确率权衡的量化分析鲁棒性-准确率权衡是对抗鲁棒性领域的一个核心问题。理解这个权衡对于实际部署决策非常重要。我做过一组实验在CIFAR-10上用不同的对抗训练配置训练模型然后评估干净准确率和PGD鲁棒准确率。结果大致如下训练方式干净准确率PGD-20准确率(ε8/255)PGD-100准确率标准训练94.5%0.2%0.1%FGSM对抗训练92.1%45.3%38.7%PGD-7对抗训练86.8%52.1%48.9%PGD-20对抗训练84.2%55.6%53.2%TRADES (β6)83.5%57.8%55.1%这张表的信息量很大。首先标准训练的模型在PGD攻击下几乎完全崩溃准确率掉到0.2%说明它没有任何鲁棒性。其次对抗训练确实能大幅提升鲁棒准确率从0.2%提升到50%以上。但代价是干净准确率从94.5%降到84%左右损失了大约10个百分点。还有一个值得注意的现象PGD-20训练比PGD-7训练只提升了3个多百分点的鲁棒准确率但干净准确率又降了2.6个百分点。这说明对抗训练的边际收益是递减的训练攻击越强鲁棒性提升越有限但准确率代价持续存在。TRADES是另一种对抗训练方法它显式地优化鲁棒性和准确率之间的权衡。TRADES的损失函数包含两部分一部分是干净样本上的交叉熵损失另一部分是KL散度项鼓励模型在对抗样本和干净样本上的输出分布接近。通过调节β参数可以控制鲁棒性和准确率的平衡。4.3 对抗训练实操中的坑与技巧对抗训练在实操中有不少坑我踩过几个比较典型的这里分享一下。坑一训练不稳定。对抗训练比标准训练更容易出现梯度爆炸或者损失震荡。一个常见原因是PGD生成的对抗样本质量不稳定有时候扰动过大导致模型输出完全混乱。解决办法是控制PGD的步长和步数不要一开始就用很强的攻击。可以先用FGSM或者PGD-3热身再逐步增加攻击强度。坑二批归一化统计量偏移。对抗训练时模型看到的输入分布和干净数据分布有差异导致批归一化BatchNorm的统计量出现偏移。这个问题在推理时会放大因为推理时用的是训练时累积的统计量。一个缓解办法是使用GroupNorm或者LayerNorm替代BatchNorm或者在对抗训练时对干净样本和对抗样本分别做归一化。坑三过早停止。对抗训练的收敛速度比标准训练慢很多如果按照标准训练的epoch数来设置很可能欠拟合。我一般会把对抗训练的epoch数设为标准训练的2到3倍同时用更小的学习率和更长的学习率衰减周期。坑四评估时用了训练时的攻击。这是一个评估方法上的坑。如果你用PGD-20训练然后用PGD-20评估得到的鲁棒准确率是偏高的因为模型可能对PGD-20过拟合了。正确的做法是用更强的攻击比如PGD-100或者AutoAttack来评估或者用不同随机种子的PGD来评估。5. 超越对抗训练鲁棒性提升的其他路径与评估的边界5.1 认证鲁棒性给出可证明的下界对抗训练和攻击评估都是经验性的方法它们能告诉你模型在某个攻击下表现如何但不能给出任何保证。认证鲁棒性Certified Robustness试图解决这个问题它的目标是给出一个可证明的鲁棒性下界在某个扰动范围内模型对所有可能的扰动都保持正确输出。目前主流的认证方法有两类基于区间边界传播Interval Bound Propagation, IBP的方法和基于随机平滑Randomized Smoothing的方法。IBP的思路是对每一层网络计算输出的上下界然后逐层传播这些边界。如果最终输出的正确类别得分下界大于其他类别得分上界那么在这个扰动范围内模型对所有扰动都输出正确类别。IBP的优点是计算效率高缺点是边界会随着层数增加而越来越松导致认证的扰动范围偏小。随机平滑的思路是在输入上加入高斯噪声然后看模型输出的多数投票结果。如果某个类别在噪声扰动下的概率超过其他类别一定阈值那么可以证明在某个L2扰动范围内模型的输出是稳定的。随机平滑的优点是认证范围通常比IBP大缺点是需要大量的采样计算代价高而且只适用于L2范数。认证鲁棒性的一个关键限制是它给出的下界通常是保守的。也就是说模型的实际鲁棒性可能比认证的下界好但你无法证明。而且认证鲁棒性和经验鲁棒性之间往往存在差距认证鲁棒性好的模型不一定在实际攻击下表现好反之亦然。5.2 鲁棒性评估的边界条件与注意事项做鲁棒性评估时有几个边界条件需要特别注意否则很容易得出误导性结论。扰动范数的选择。常用的范数有L∞、L2、L1。L∞约束每个像素的扰动幅度L2约束整体扰动能量L1鼓励稀疏扰动。不同的范数对应不同的威胁模型评估时要明确你关心的是哪种。图像分类里L∞最常用但实际场景中L2或者L1可能更合适。扰动预算的设定。ε的选择直接影响评估结果。ε太小攻击效果不明显模型看起来鲁棒ε太大攻击效果过于明显模型看起来脆弱。合理的ε应该根据实际应用场景来定。比如人脸识别系统ε可以设得很小因为人眼对脸部扰动的容忍度低而自动驾驶的交通标志识别ε可以稍大一些因为拍摄角度和光照变化本身就会带来扰动。评估数据集的选择。测试集的分布要和实际部署场景匹配。如果测试集和训练集同分布评估结果可能偏乐观。如果测试集包含分布外样本评估结果会更接近真实情况。我一般会同时在同分布测试集和分布外测试集上评估看鲁棒性是否有显著差异。随机性的控制。攻击算法和模型推理都可能包含随机性。评估时要固定随机种子或者多次运行取平均。单次运行的结果可能因为随机性而波动导致结论不可靠。计算资源的约束。强攻击比如AutoAttack的计算代价很高在大模型和大数据集上可能跑不动。这时候需要在评估强度和计算资源之间做权衡。一个折中方案是先用PGD做快速筛选对可疑的模型再用AutoAttack做精细评估。5.3 一个完整的鲁棒性评估清单最后我整理了一个鲁棒性评估的检查清单供大家在实际操作中参考检查项具体要求常见问题攻击方法至少包含PGD和一种黑盒攻击只用FGSM结论不可靠攻击强度PGD步数≥20随机重启≥5步数太少攻击不充分扰动预算根据场景选择至少测2-3个ε只测一个ε结论片面评估指标干净准确率鲁棒准确率只看鲁棒准确率忽略准确率代价随机性控制固定种子或多次平均单次运行结果波动大梯度掩蔽排查白盒和黑盒结果交叉验证忽略黑盒攻击漏掉梯度掩蔽认证鲁棒性如有条件补充认证下界只做经验评估无理论保证分布外测试在同分布和分布外数据上都评估只在同分布测试结果偏乐观这个清单不是万能的但能帮你避免大部分常见的评估陷阱。核心原则就一条不要用单一攻击的结果来断言模型鲁棒要用多种攻击、多个角度、多次实验来交叉验证。我在实际项目中最大的体会是对抗鲁棒性评估是一个需要持续怀疑和验证的过程。每次你觉得“这个模型应该没问题了”的时候换一种攻击方法或者调一下超参数可能就会看到完全不同的结果。保持这种警惕性比掌握任何具体工具都重要。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →