对抗训练:提升模型鲁棒性
一张人眼看不出差别的图片,却能让模型把「熊猫」判成「长臂猿」——这类精心构造的扰动样本揭示了一个事实:模型的判断比我们以为的更脆弱。对抗训练(adversarial training)是目前最主流的鲁棒性加固手段:与其等模型被攻破,不如在训练时就主动把「带毒」样本喂给它,逼它在扰动下依然做对。
对抗样本是什么
对抗样本是在原始输入上叠加一段「人眼几乎无感、却足以骗过模型」的微小扰动。它的存在说明模型的决策边界并不平滑:在输入空间里,正确分类的区域旁边可能紧贴着错误分类的区域。攻击者只要找到朝错误区域迈一小步的方向,就能让模型翻脸。
对抗训练的做法
核心思想是「以攻代守」:每一步训练,先为当前样本构造对抗版本,再拿对抗样本去做监督学习。最常用的是基于投影梯度下降(PGD)的强对抗样本:
def adversarial_step(model, x, y, epsilon=0.03, steps=7, alpha=0.01):
x_adv = x.clone().detach()
for _ in range(steps):
x_adv = x_adv + alpha * sign(grad_loss(model, x_adv, y)) # 朝增大损失方向走
x_adv = clip_to_epsilon_ball(x_adv, x, epsilon) # 限制在扰动半径内
return x_adv # 用其对模型做训练
# 训练时:loss = model_loss(model, x_adv, y) 再反向更新
这样训练出的模型,在对扰动不敏感的方向上被「压平」了决策边界。
鲁棒性提升与代价
收益显而易见:模型对对抗扰动更扛造,在安全风险较高的场景(如视觉识别、内容审核)更值得信赖。
代价也同样真实:
- 干净样本精度可能略降:为了鲁棒而牺牲一点正常输入的精度,是常见的权衡。
- 计算更贵:每步都要额外前向与反向算对抗样本,训练成本明显上升。
- 并非万能:对超出扰动半径、或不同攻击方式的样本,鲁棒性仍可能失效。
与数据增强的区别
对抗训练常被误认为普通数据增强,但二者不同:数据增强靠随机变换(翻转、裁剪)提升泛化,扰动来自「自然变化」;对抗训练用的扰动是「针对模型弱点、刻意最大化损失」的方向性攻击,目标是堵住最易被攻破的方向。前者提升一般泛化,后者专门加固对抗鲁棒性,二者可叠加。
小结
对抗训练在训练阶段主动注入针对模型弱点的微小扰动样本,用「以攻代守」的方式压平决策边界,从而提升对对抗样本的鲁棒性。它带来更可信的安全性,代价是干净样本精度可能略降、训练更昂贵,且不等于普通数据增强——后者提升泛化,前者专门加固对抗脆弱点,两者可互补。
参考与延伸阅读
- Madry et al. Towards Deep Learning Models Resistant to Adversarial Attacks(ICLR 2018)。提出以 PGD 强对抗样本做最小最大训练的主流框架。已核验。
- Goodfellow et al. Explaining and Harnessing Adversarial Examples(ICLR 2015)。快速梯度符号法(FGSM)与对抗样本的早期奠基工作。已核验。
本文累计阅读 — 次