本文转载自公众号:PaperWeekly (paperweekly)
整理编辑 | PaperWeekly
©PaperWeekly 原创 · 作者|苏剑林
单位|追一科技
研究方向|NLP、神经网络
当前,说到深度学习中的对抗,一般会有两个含义:一个是生成对抗网络(Generative Adversarial Networks,GAN),代表着一大类先进的生成模型;另一个则是跟对抗攻击、对抗样本相关的领域,它跟 GAN 相关,但又很不一样,它主要关心的是模型在小扰动下的稳健性。
本人之前所涉及的对抗话题,都是前一种含义,而今天,我们来聊聊后一种含义中的“对抗训练”。
本文包括如下内容:
- 对抗样本、对抗训练等基本概念的介绍;
- 介绍基于快速梯度上升的对抗训练及其在 NLP 中的应用;
- 给出了对抗训练的 Keras 实现(一行代码调用);
- 讨论了对抗训练与梯度惩罚的等价性;
- 基于梯度惩罚,给出了一种对抗训练的直观的几何理解。

方法介绍
近年来,随着深度学习的日益发展和落地,对抗样本也得到了越来越多的关注。
在 CV 领域,我们需要通过对模型的对抗攻击和防御来增强模型的稳健型,比如在自动驾驶系统中,要防止模型因为一些随机噪声就将红灯识别为绿灯。
在 NLP 领域,类似的对抗训练也是存在的,不过 NLP 中的对抗训练更多是作为一种正则化手段来提高模型的泛化能力。
这使得对抗训练成为了 NLP 刷榜的“神器”之一,前有微软通过 RoBERTa+ 对抗训练在 GLUE [1] 上超过了原生 RoBERTa,后有我司的同事通过对抗训练刷新了 CoQA [2] 榜单。这也成功引起了笔者对它的兴趣,遂学习了一番,分享在此。
基本概念
要认识对抗训练,首先要了解“对抗样本”,它首先出现在论文Intriguing properties of neural networks[3]之中。
简单来说,它是指对于人类来说“看起来”几乎一样、但对于模型来说预测结果却完全不一样的样本,比如下面的经典例子:

理解对抗样本之后,也就不难理解各种相关概念了,比如“对抗攻击”,其实就是想办法造出更多的对抗样本,而“对抗防御”,就是想办法让模型能正确识别更多的对抗样本。
所谓对抗训练,则是属于对抗防御的一种,它构造了一些对抗样本加入到原数据集中,希望增强模型对对抗样本的鲁棒性;同时,如本文开篇所提到的,在 NLP 中它通常还能提高模型的表现。
Min-Max
总的来说,对抗训练可以统一写成如下格式:

其中 代表训练集,代表输入,代表标签,是模型参数,是单个样本的 loss,是对抗扰动,是扰动空间。这个统一的格式首先由论文Towards Deep Learning Models Resistant to Adversarial Attacks[4] 提出。这个式子可以分步理解如下:
- 往属于里边注入扰动 ,的目标是让 越大越好,也就是说尽可能让现有模型的预测出错;
- 当然 也不是无约束的,它不能太大,否则达不到“看起来几乎一样”的效果,所以 要满足一定的约束,常规的约束是 ,其中 是一个常数;
- 每个样本都构造出对抗样本之后,用作为数据对去最小化loss来更新参数 (梯度下降);
- 反复交替执行 1、2、3 步。
由此观之,整个优化过程是 和 交替执行,这确实跟 GAN 很相似,不同的是,GAN 所 的自变量也是模型的参数,而这里 的自变量则是输入(的扰动量),也就是说要对每一个输入都定制一步 。
快速梯度
现在的问题是如何计算 ,它的目标是增大 ,而我们知道让 loss 减少的方法是梯度下降,那反过来,让 loss 增大的方法自然就是梯度上升,因此可以简单地取:

当然,为了防止 过大,通常要对 做些标准化,比较常见的方式是: