模型对抗与鲁棒性
2025/12/18大约 5 分钟
模型对抗与鲁棒性
本文适合
已经掌握 对抗样本基础,需要评估模型在攻击下是否稳定、是否存在防御绕过或梯度遮蔽的学习者。学完你能:制定威胁模型,用 FGSM/PGD/随机重启评估鲁棒准确率,识别梯度遮蔽,并把防御是否有效写成可复现证据
一句话判断
鲁棒性题不是问“模型平时准不准”,而是问它在明确威胁模型和扰动约束下还能不能保持正确。
题目中常见信号
提到 robust accuracy
说明:要算攻击后准确率
第一反应:明确攻击方法和 eps
给防御模型/净化器
说明:可能要绕过防御
第一反应:检查是否梯度遮蔽
FGSM 失败但黑盒成功
说明:梯度可能不可用
第一反应:用 PGD、随机重启、迁移攻击
输入变换、JPEG、resize
说明:防御可能依赖预处理
第一反应:做 EOT 或保存后重读验证
认证半径、randomized smoothing
说明:有可证明鲁棒范围
第一反应:区分经验攻击和认证防御
核心概念
鲁棒性评估必须包含四个要素:
威胁模型 = 攻击者知道什么 + 能改什么 + 约束是多少 + 成功标准是什么常见评估指标:
- Clean accuracy:干净样本准确率。
- Robust accuracy:攻击后仍正确的比例。
- Attack success rate:攻击成功比例。
- Perturbation norm:扰动大小。
- Confidence margin:正确类别和目标类别分数差。
警惕梯度遮蔽:攻击看似失败,不一定代表模型鲁棒,可能只是梯度不可用、预处理不可导或攻击参数太弱。
最小分析流程
- 写威胁模型:白盒/黑盒、
Linf/L2、eps、targeted/untargeted。 - 跑干净基线:记录 clean accuracy 和样例输出。
- 跑弱攻击:FGSM 快速探测。
- 跑强攻击:PGD 多步、随机重启、不同 alpha。
- 查梯度遮蔽:增加步数是否更强,黑盒迁移是否反而成功。
- 输出表格:每种攻击的准确率、成功率、平均扰动。
最小验证示例
鲁棒准确率评估骨架
import torch
def evaluate_attack(model, loader, attack_fn):
total = clean_ok = robust_ok = 0
for x, y in loader:
with torch.no_grad():
clean_pred = model(x).argmax(1)
adv = attack_fn(model, x, y)
with torch.no_grad():
adv_pred = model(adv).argmax(1)
clean_ok += (clean_pred == y).sum().item()
robust_ok += (adv_pred == y).sum().item()
total += y.numel()
return {
"clean_acc": clean_ok / total,
"robust_acc": robust_ok / total,
}输出解释:
clean_acc 高,robust_acc 低 -> 模型普通准确但不鲁棒
clean_acc 和 robust_acc 都低 -> 模型本身或预处理有问题
FGSM robust_acc 高,PGD robust_acc 低 -> 弱攻击误判了防御梯度遮蔽探测
for steps in [10, 20, 50, 100]:
for restarts in [1, 5]:
result = run_pgd_eval(model, loader, eps=8/255, steps=steps, restarts=restarts)
print(steps, restarts, result["robust_acc"])如果步数和随机重启增加后攻击成功率明显上升,原防御评估不足。
常见利用 / 解题路线
路线总览:
路线一:证明模型不鲁棒
- 明确 eps 和范数。
- 复现 clean accuracy。
- 用 PGD 生成攻击样本。
- 输出 robust accuracy 降低证据。
路线二:绕过输入变换防御
- 查防御是否包含 resize、JPEG、bit-depth、随机裁剪。
- 保存后重读或把变换加入攻击循环。
- 对随机防御做多次采样取平均梯度。
- 验证远程同样失效。
路线三:识别虚假鲁棒
- FGSM 失败不下结论。
- 改 alpha、steps、random restart。
- 做迁移攻击对照。
- 若黑盒成功而白盒失败,检查梯度遮蔽。
路线四:评估对抗训练
- 同时记录 clean accuracy 和 robust accuracy。
- 比较普通训练模型与对抗训练模型。
- 确认对抗训练 eps 与评估 eps 一致。
- 避免用训练时同一弱攻击夸大防御效果。
常见失败原因
防御看起来 100% 有效
可能原因:攻击太弱或梯度遮蔽
排查动作:增加 PGD 步数和随机重启
robust accuracy 数值不稳定
可能原因:随机防御未固定统计
排查动作:多次评估并报告均值
攻击样本超出 eps
可能原因:没有投影
排查动作:每步 clamp 到扰动球
认证半径被误解
可能原因:经验攻击和认证防御混淆
排查动作:写清 radius 对应的范数和置信度
迷你案例
题目声称“模型做了 JPEG 防御,PGD 无效”。直接用普通 PGD,robust accuracy 为 92%。但攻击样本保存为 JPEG 后再读取,模型输出开始变化。把 JPEG 近似变换加入攻击循环后,robust accuracy 降到 18%。
结论:原评估没有把防御变换纳入威胁模型,导致误判鲁棒。S 级 WP 要写 clean accuracy、攻击参数、是否包含防御变换、最终 robust accuracy。