本期导读:对抗攻击起源于CV领域,但近年来针对NLP任务的对抗攻击(Adversarial Attack)越来越多,本文将选取其中比较有代表性的一些工作进行简要的介绍,重点阐述不同方法的区别与动机。
•••
简介
首先介绍一下何为对抗攻击。通俗地来说,对抗攻击的目的就是让模型犯错(fail):对模型的输入进行一些改动,使模型输出错误的结果,从而使模型的效果下降。举个例子 [1] ,在下图中,将原句中的’runner’ 一词改成同义词’racer’后,模型就做出了相反的判断,尽管这句话本身的语义(semantic meaning)并没有变。这里我们需要引入对抗攻击的两个关键点: 改多少和怎么改 。![a93439d89e6275dde3f928602bc59be8.png](https://i-blog.csdnimg.cn/blog_migrate/3a8495f682b7b318820c58c87aaec025.jpeg)
首先,改多少: 在本文中,我们只讨论不改变原来文本的语义的改动(semantic-preserving perturbation)。在这种情况下,如果对文本的改动过大,改变了原本的语义,那么数据的正确答案(label)可能也就变了,attack也就没有意义了。换言之,我们想测试模型是否对于微小的改动过分敏感(oversensitivity),或者说缺乏鲁棒性(robustness)。然而,判断文本数据的语义是否变化是一件相对麻烦的事情,因为语言是离散的(discrete),我们很难用距离指标(distance)去量化文本上的变化。因此大多数的工作会采用人工评测的方式,去判断我们所设计的攻击方法是否改变了原本的语义。
其次,怎么改: 近年有很多工作提出了不同的攻击方法,在满足不改变原语义的情况下使模型在改动过的测试集上效果大幅下降。后文我们将分类介绍这些攻击方法。
动机
在介绍具体方法之前, 先谈一下我们为什么要研究对抗攻击。这个问题我曾经和Eric Wallace(PhD at Berkeley)和Sameer Singh(Prof at UCI)聊过,这里转述一下他们的看法。
生成现实世界中可能出现的各种有效的攻击并且思考防御的方法,可以提高模型的安全性。
模型在不同攻击下的效果可以体现出模型的一些特性,因而这也可以作为一种分析的手段。
方法
对抗攻击有很多种不同的分类方式,比如按照是否利用模型参数可以分为黑盒(black-box, no access to model parameters)和白盒(white-box, allow access to model parameters)。按照攻击的目标可以分为有目标(targeted, want the model to predict a specific false class)和无目标(non-targeted, just want the predicted class to be wrong)。按照改动的级别可以分为字符级别(character-level),词级别(word-level),句子级别(sentence-level)。当然也可以按照所针对的NLP任务(e.g. sentence classification)和实现方法去做更细致的划分。下面我们介绍几篇笔者认为比较有趣的工作,它们将涵盖刚才说的各个不同类别。
AddSent
这篇来自Robin和Percy的工作 [2] 私以为是促发了近年NLP对抗攻击热潮的经典工作。他们针对SQuAD(同样是Percy组的大作)数据集设计了几种简单有效的攻击方法。这里重点介绍一下其中的AddSent和AddAny。首先来看一下AddSent的实例:![d03d252bbdac6a5c777341a747ab5cff.png](https://i-blog.csdnimg.cn/blog_migrate/08caf8ecd25a2f14bc701002914bc398.jpeg)
![a52713a45a33d3f273b2cc1e307454b7.png](https://i-blog.csdnimg.cn/blog_migrate/ffc8ef6db61e407e644ec27c2ec20411.jpeg)
![6f84533b573f9ba0883db4b206b28244.png](https://i-blog.csdnimg.cn/blog_migrate/323c5f6c7e915c848fdcd0799cef056b.jpeg)
我们发现在所有模型上这种攻击都有明显效果。为什么AddSent能够如此有效呢?笔者认为很重要的原因在于现在很多模型都依赖于n-gram matching(字词匹配)来进行预测。AddSent加入的句子与原问题有很多共同的字词,因此能有效地吸引模型的注意力(Attention),从而起到误导效果。
作为防御,作者采用了Adversarial Training,即在训练集中加入AddSent改动后的训练集。一般来说这种方法都能在不牺牲原测试集上效果的前提下提升在Adversarial测试集上的效果。在AddSent上,加入AddSent攻击后的训练集一起训练后在AddSent测试集上BiDAF模型F1分数可以从34.8升到70.4。尽管看上去有效,但实际上这种Adversarial Training只是让model学会一些简单的特征,比如忽略掉文章最后一句话以避免被误导。这样做的缺点就是,只要换一种attack方式(比如把干扰句加在文章开头而非结尾), 模型又会挂掉。所以想要真正解决这个问题,简单的adversarial training可能并不是一个具有泛化能力的方法。能够防御住多种不同attack的通用防御方法,笔者认为是一个很有意义(也有挑战性的)研究方向。
AddAny
这个攻击方法与AddSent来自同一篇论文。这两种方法的共同点在于AddAny同样在原文后面加一个distracting sequence。不同点在于二者构造这个distracting sequence的方式。参考下图,对于AddAny,作者随机初始化一个长度固定的序列,对于序列的每一个词,在一个词典中进行搜索,使得加上这个序列后模型的效果最差(F1最低)。可以看到这里采用的是一个贪心的搜索策略,而且需要对模型进行多次测试获得模型的预测概率输出。与AddSent更加不同的是AddAny搜索得出的序列是没有正常语义的,而是段杂乱的文字序列。这样的方法因为进行了搜索所以效果会比AddSent更好(参见下表中AddAny一行的结果),但是却缺少了可解释性,很难理解为什么一段没有含义的乱序文字会使模型效果大幅下降。![eb08848075167af461d0315e80451617.png](https://i-blog.csdnimg.cn/blog_migrate/ac2356bff2917a7827eb1003afae1913.jpeg)
AddSent和AddAny都是直接构造distracting sequence并加在原文后,可以认为是sentence-level的攻击。
Universal Triggers
AddSent和AddAny都是non-targeted attack, 因为它们没有指定要模型输出某个错误预测,接下来介绍一篇targeted attack的工作: Universal Adversarial Triggers [3] . 笔者认为这篇工作的想法很有趣,作者也很会吸引人眼球。首先解释一下什么叫trigger,trigger就是一段文字序列,将它加入原来的文本输入时,能够使得模型输出一个指定的错误结果。这其实和之前AddAny中的distracting sequence差不多,只不过多了一个target。下图给了几个例子:![6d29357037a1adcb4863597fb1bc82f6.png](https://i-blog.csdnimg.cn/blog_migrate/d438f03b2b71e6db950df3516e83fa35.jpeg)
图中标红的就是所谓的trigger。在第一行,只要在原句前加上’zoning tapping flennes’,情感分析模型就是将句子误判成negative(target)。在SQuAD上,在文章结尾加上’why how because’以及一个target sequence ‘to kill american people’,模型就会预测结尾的’to kill american people’(也就是target)。并且这个方法对于测试集中的很多问题都有效。而对于语言生成任务,只要在给语言模型(GPT2)的prompt前加上那段’TH … Blacks’, 语言模型就会生成带有种族歧视的内容(target)。当然,如果以上的例子只是cherry-pick出来的特例,那就没什么意思了,然而有趣的是这些看似无厘头的trigger,能让模型在整个测试集上效果大降(所以称作universal)。在Stanford Sentiment Treebank数据集上, 在测试集所有positive句子开头都加上’zoning tapping flennes’能使模型准确率从86.2降到29.1。对于语言生成,作者人工检测了100条加了trigger后的输出,发现其中98%都有种族歧视内容。注意这些trigger和target都是对应的,加入一个trigger就会使模型输出target, 而target就是作者自己设定的一个错误答案。在本文中作者选用了这些较为吸引人眼球的target output,实际上我们也可以选定其他的target,比如在SQuAD文章结尾加上’HFL is the best’然后去构造对应的trigger使模型被误导成选择’HFL is the best’作为输出预测。
下面我们来介绍一下这些trigger具体是怎么构造的:
![7afe4ea484de8b5310d83b5a7bec40d5.png](https://i-blog.csdnimg.cn/blog_migrate/5a18131cda45134697db3eaa0120dec6.jpeg)
如上图,我们首先初始化一个序列如’the the the’. 然后对每一个词,我们进行替换去最小化整个batch上的损失函数(label是我们设定的target prediction)。注意,在AddAny中,作者对每次替换后的序列都加进文章喂给模型然后找到让模型正确概率最低的词,然而这个方法在可替换的词典很大时将会非常慢, 因为它涉及到很多次模型的前向传播。为了避免这个问题,作者不每次把替换后的序列喂进模型算概率,而是采用一阶泰勒展开式直接对loss进行估算,然后找到词典里embedding使整个loss最小的那个词(这个只要直接把词向量代入公式做点乘取argmin就行了)。参考下图公式,e_i’是词典中每个词的向量,e_adv_i是trigger当前位置替换前的词向量,式子第二项是模型在整个batch上损失函数的平均导数(pytorch backward pass时会自动算出来)。这样的替换会重复多次直到trigger收敛(即trigger中的词不再变化)。
我们可以发现这个过程用到了损失函数的导数,因此可以认为是white-box。整个过程在思想上和AddAny有相似之处,都是在不停地替换词以找到一个效果最好的序列,只不过AddAny的目标是最小化模型在正确答案上的概率,而Universal Trigger是最大化模型在target prediction上的概率(即最小化其损失函数)。这也是targeted和non-targeted的主要不同之处。
TextFooler
之前介绍的方法都是concatenation-based,也就是用不同方法构造一个序列加入到原文中去作为攻击。接下来介绍一个基于替换的词级别的(word-level)攻击方法: TextFooler [4] . 首先还是直观地看几个例子:![e6f16ef9856c5f49c9f443c4ce4f07b7.png](https://i-blog.csdnimg.cn/blog_migrate/7508dd02e38d5b7d0cd502696449e630.jpeg)
![919d90423fae0a359c1fcd14a49f0dec.png](https://i-blog.csdnimg.cn/blog_migrate/b62edf33f03841bee3f5a3217b101c63.jpeg)
可以看到这个方法在包括BERT在内的多个模型上都有显著的效果。
Char-Attack
以上介绍的attack都是句子级别或者词级别的,下面介绍一篇char-level attack的经典工作 [5] . 首先我们来看一个颇为有趣的例子:![211512d14f11a4f71b3fe444967ef2f7.png](https://i-blog.csdnimg.cn/blog_migrate/ffb38c10ca6a690eb221a69bd862d79b.jpeg)
![9b12e201bae8ba563577824f41ef4e65.png](https://i-blog.csdnimg.cn/blog_migrate/921037a4a848a2c3abb9232bf75f3d7d.jpeg)
我们可以看出这样简单的攻击方法对于多个语言多个模型都有明显的效果。当然,词级别的模型会挂掉是意料之中的,因为改变拼写之后很多词就变成了UNK,但是对于char-level的模型,这个攻击同样有效,由此可见这些模型还是不够鲁棒的。另外,作者还画图展示了随着改动的词越多,模型效果也越差。当然,除了swap之外,还有其他char-level的攻击操作,比如增、删、改,不过它们的目的都大同小异,在此就不赘述了。
总结
本文介绍了几篇不同类型的文本对抗攻击的工作,大多数都是比较简单有效的。当然,我们也可以发现当前文本攻击类工作的一些小问题,比如关于改动多少算semantic-preserving,怎么做human evaluation,这些都还没有一个统一的标准,这也让不同方法之间的比较变得很麻烦。比如有的paper认为semantic similarity>0.7就够了,有的工作却坚持要大于0.8,有的认为80%的人能答对就算semantic preserving,有的工作却设置了更高的阈值;显然在更低的阈值下攻击效果可能会更好,但是这往往也意味着有可能改动过的文本的label已经发生了变化。在这样的统一标准被推行之前,大家也需要去更加辩证地看待和比较不同的攻击方法。
参考文献
[1] Alzantot, Moustafa, Yash Sharma, Ahmed Elgohary, Bo-Jhang Ho, Mani B. Srivastava and Kai-Wei Chang. Generating Natural Language Adversarial Examples. EMNLP 2018.[2] Jia, Robin and Percy Liang. Adversarial Examples for Evaluating Reading Comprehension Systems. EMNLP 2017.
[3] Wallace, Eric, Shi Feng, Nikhil Kandpal, Matthew Gardner and Sameer Singh. Universal Adversarial Triggers for Attacking and Analyzing NLP. EMNLP/IJCNLP 2019.
[4] Jin, Di, Zhijing Jin, Joey Tianyi Zhou and Peter Szolovits. “Is BERT Really Robust? A Strong Baseline for Natural Language Attack on Text Classification and Entailment.” AAAI 2020.
[5] Belinkov, Yonatan and Yonatan Bisk. “Synthetic and Natural Noise Both Break Neural Machine Translation.” ICLR 2018.
原文:司程磊
编辑:HFL编辑部
![5abd4308d85c14edc4daa53df1af677e.png](https://i-blog.csdnimg.cn/blog_migrate/864641611a68218030a3bb8e42573766.png)