armitage攻击没有attack_自然语言处理中的对抗攻击

4754af11d8090d84c9d98fa10246b517.png

本期导读:对抗攻击起源于CV领域,但近年来针对NLP任务的对抗攻击(Adversarial Attack)越来越多,本文将选取其中比较有代表性的一些工作进行简要的介绍,重点阐述不同方法的区别与动机。

•••

简介

首先介绍一下何为对抗攻击。通俗地来说,对抗攻击的目的就是让模型犯错(fail):对模型的输入进行一些改动,使模型输出错误的结果,从而使模型的效果下降。举个例子 [1] ,在下图中,将原句中的’runner’ 一词改成同义词’racer’后,模型就做出了相反的判断,尽管这句话本身的语义(semantic meaning)并没有变。这里我们需要引入对抗攻击的两个关键点: 改多少和怎么改a93439d89e6275dde3f928602bc59be8.png

首先,改多少: 在本文中,我们只讨论不改变原来文本的语义的改动(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 在这个阅读理解的题目上,原文章后面加上了一句和原文并不冲突的话(蓝色字),这并不改变原来的正确答案,然而原本做对的模型却现在做错了。下面我们来结合下图看看加在文章结尾的这句话具体是怎么构造的: 1) 首先将原问题中的名词和形容词改成WordNet中的反义词,将问题中的命名实体(named entity)和数字改成GloVe向量最近的且句子成分相同的词(Part-of-speech)。2) 生成一个和原答案类型相同的假答案。这里作者的做法是对每一个NER/POS tag都预先设定一个假答案,比如如果原答案是’prague’,那么对应的假答案就是’chicago(同类型)。3) 将改写过的问题和假答案合并(concatenate)并且转写成一个陈述句,这里的转写采用的是作者根据不同句子结构写的规则。4) 转写过的句子可能会存在错误,所以作者又采用人工检查去把可能存在的问题改正。 a52713a45a33d3f273b2cc1e307454b7.png 我们可以发现整个过程并没有用到模型内部参数,因此它是black-box。同时AddSent没有指定model要犯的错误,因此属于non-targeted。下图展示了在不同模型上的攻击效果(F1): 6f84533b573f9ba0883db4b206b28244.png

我们发现在所有模型上这种攻击都有明显效果。为什么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一行的结果),但是却缺少了可解释性,很难理解为什么一段没有含义的乱序文字会使模型效果大幅下降。

e232087da24b110fa9d8d85d476c3d75.png

eb08848075167af461d0315e80451617.png

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

图中标红的就是所谓的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

如上图,我们首先初始化一个序列如’the the the’. 然后对每一个词,我们进行替换去最小化整个batch上的损失函数(label是我们设定的target prediction)。注意,在AddAny中,作者对每次替换后的序列都加进文章喂给模型然后找到让模型正确概率最低的词,然而这个方法在可替换的词典很大时将会非常慢, 因为它涉及到很多次模型的前向传播。为了避免这个问题,作者不每次把替换后的序列喂进模型算概率,而是采用一阶泰勒展开式直接对loss进行估算,然后找到词典里embedding使整个loss最小的那个词(这个只要直接把词向量代入公式做点乘取argmin就行了)。参考下图公式,e_i’是词典中每个词的向量,e_adv_i是trigger当前位置替换前的词向量,式子第二项是模型在整个batch上损失函数的平均导数(pytorch backward pass时会自动算出来)。这样的替换会重复多次直到trigger收敛(即trigger中的词不再变化)。

2e62b13354cc982d4a95485ac2db64ab.png

我们可以发现这个过程用到了损失函数的导数,因此可以认为是white-box。整个过程在思想上和AddAny有相似之处,都是在不停地替换词以找到一个效果最好的序列,只不过AddAny的目标是最小化模型在正确答案上的概率,而Universal Trigger是最大化模型在target prediction上的概率(即最小化其损失函数)。这也是targeted和non-targeted的主要不同之处。

TextFooler

之前介绍的方法都是concatenation-based,也就是用不同方法构造一个序列加入到原文中去作为攻击。接下来介绍一个基于替换的词级别的(word-level)攻击方法: TextFooler [4] . 首先还是直观地看几个例子: e6f16ef9856c5f49c9f443c4ce4f07b7.png 观察一下图中斜体加粗的部分,我们发现这些同义词转换就可以使模型犯错。这里有两个重点: 替换哪些词和怎么找同义词。这里介绍一下TextFooler的做法:1) 对文本中的词按重要性进行排序。这里作者采用的方法是每次去掉文本中的一个词,然后做forward pass算出前后预测概率的变化,以此作为去掉该词的重要程度。当然,个人觉得这个方法有个弊端就是非常慢,尤其是文本很长的时候,需要做很多次forward pass,这里如果允许white-box的话可以像之前universal trigger一样直接用gradient去估计每个词的重要程度。2) 对于重要性比较高的词选同/近义词进行替换: 计算word embedding的cosine similarity,在cos similarity最高的词中再做筛选: 替换词应该和原词有相同的POS, 替换后的句子和原句的语义相似度应该超过一个阈值。下图给出来这样替换后的攻击效果: 919d90423fae0a359c1fcd14a49f0dec.png

可以看到这个方法在包括BERT在内的多个模型上都有显著的效果。

Char-Attack

以上介绍的attack都是句子级别或者词级别的,下面介绍一篇char-level attack的经典工作 [5] . 首先我们来看一个颇为有趣的例子: 211512d14f11a4f71b3fe444967ef2f7.png 这句话看似正常,仔细看你会发现里面的词有很多拼写错误,具体来说是单词内字母的顺序乱了。然而我们发现这种错误往往对人的阅读没有很大的影响。因此,作者就提出了这样一种字符级别的攻击方法: 对长度4个字符及以上的单词,将其中任意两个相邻字母的顺序调换,注意我们不换首字母和尾字母。作者在机器翻译任务进行了测试,结果如下图:

51ac6fe6a7bd8ed1e6afebea122024d6.png

9b12e201bae8ba563577824f41ef4e65.png

我们可以看出这样简单的攻击方法对于多个语言多个模型都有明显的效果。当然,词级别的模型会挂掉是意料之中的,因为改变拼写之后很多词就变成了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

007fa15e979f619816db8c599c406f78.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值