一、基础概念
为什么需要对抗训练:
在CV领域,我们需要通过对模型的对抗攻击和防御来增强模型的稳健型,比如在自动驾驶系统中,要防止模型因为一些随机噪声就将红灯识别为绿灯。在NLP领域,类似的对抗训练也是存在的,不过NLP中的对抗训练更多是作为一种正则化手段来提高模型的泛化能力
对抗:
一个是生成对抗网络(Generative Adversarial Networks,GAN),代表着一大类先进的生成模型;
另一个则是跟对抗攻击、对抗样本相关的领域,它跟GAN相关,但又很不一样,它主要关心的是模型在小扰动下的稳健性。
对抗样本
对于人类来说“看起来”几乎一样、但对于模型来说预测结果却完全不一样的样本,如下:
对抗攻击:想办法造出更多的对抗样本
对抗防御:想办法让模型能正确识别更多的对抗样本
对抗训练:属于对抗防御的一种,它构造了一些对抗样本加入到原数据集中,希望增强模型对对抗样本的鲁棒性。
二、基于快速梯度上升的对抗训练及其在NLP中的应用
2.1 原理:Min-Max
对抗训练可以统一写成如下格式:
其中D代表训练集,x代表输入,y代表标签,θ是模型参数,L(x,y;θ)是单个样本的loss,Δx是对抗扰动,Ω是扰动空间。
1、往属于x里边注入扰动Δx,Δx的目标是让L(x+Δx,y;θ)越大越好,也就是说尽可能让现有模型的预测出错;
2、当然Δx也不是无约束的,它不能太大,否则达不到“看起来几乎一样”的效果,所以Δx要满足一定的约束,常规的约束是∥Δx∥≤ϵ,其中ϵ是一个常数;
3、每个样本都构造出对抗样本x+Δx之后,用(x+Δx,y)作为数据对去最小化loss来更新参数θ(梯度下降);
4、反复交替执行1、2、3步。
整个优化过程是max和min交替执行,这确实跟GAN很相似,不同的是,GAN所max的自变量也是模型的参数,而这里max的自变量则是输入(的扰动量),也就是说要对每一个输入都定制一步max。
2.2 实现:快速梯度
现在的问题是如何计算Δx,它的目标是增大L(x+Δ,y;θ),而我们知道让loss减少的方法是梯度下降,那反过来,让loss增大的方法自然就是梯度上升,因此可以简单地取
当然,为了防止Δx过大,通常要对∇xL(x,y;θ)做些标准化,比较常见的方式是