训练技巧 | 功守道:NLP中的对抗训练 + PyTorch实现

640

本文分享一个“万物皆可盘”的 NLP 对抗训练实现,只需要四行代码即可调用。盘他。

作者丨Nicolas

单位丨追一科技AI Lab研究员

研究方向丨信息抽取、机器阅读理解

最近,微软的 FreeLB-Roberta [1] 靠着 对抗训练(Adversarial Training)在 GLUE 榜上超越了 Facebook 原生的 Roberta,追一科技也用到了这个方法仅凭单模型 [2] 就在 CoQA 榜单中超过了人类,似乎“对抗训练”一下子变成了 NLP 任务的一把利器。刚好笔者最近也在看这方面的内容,所以开一篇文章,讲一下。

640?wx_fmt=png

▲ GLUE Leaderboard

640?wx_fmt=png

▲ CoQA Leaderboard

提到“对抗”,相信大多数人的第一反应都是 CV 中的对抗生成网络(GAN),殊不知,其实对抗也可以作为一种 防御机制,并且经过简单的修改,便能用在 NLP 任务上,提高模型的泛化能力。关键是,对抗训练可以写成一个插件的形式,用几行代码就可以在训练中自由地调用, 简单有效,使用成本低。不过网上的大多数博客对于 NLP 中的对抗训练都介绍得比较零散且无代码实现,笔者在这篇文章中,对 NLP 任务中的对抗训练做了一个简单的综述,并提供了插件形式的 PyTorch 实现。 

本文专注于 NLP 对抗训练的介绍,对对抗攻击基础感兴趣的读者,可以看这几篇博客及论文 [3] [4] [5],这里就不赘述了。不想要理解理论细节的读者也可以直接看最后的代码实现。

对抗样本

我们常常会听到“对抗样本”、“对抗攻击”、“对抗训练”等等这些令人头秃的概念,为了让大家对“对抗”有个更清晰的认识,我们先把这些概念捋捋清楚。

640?wx_fmt=png

▲ Taxonomy

Szegedy 在 14 年的 ICLR 中 [6] 提出了对抗样本这个概念。如上图,对抗样本可以用来攻击和防御,而对抗训练其实是“对抗”家族中 防御的一种方式,其基本的原理呢,就是通过添加 扰动构造一些对抗样本,放给模型去训练, 以攻为守,提高模型在遇到对抗样本时的鲁棒性,同时一定程度也能提高模型的表现和泛化能力。 

那么,什么样的样本才是好的对抗样本呢?对抗样本一般需要具有两个特点:

1. 相对于原始输入,所添加的扰动是微小的;
2. 能使模型犯错。

下面是一个对抗样本的例子,决定就是你啦,胖达:

640?wx_fmt=png

▲ 一只胖达加了点扰动就被识别成了长臂猿

对抗训练的基本概念


GAN 之父 Ian Goodfellow 在 15 年的 ICLR 中 [7] 第一次提出了对抗训练这个概念,简而言之,就是在原始输入样本 x 上加一个扰动 640?wx_fmt=png,得到对抗样本后,用其进行训练。也就是说,问题可以被抽象成这么一个模型:
  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值