最近看了一些字符级别的文本攻击方法,目前字符级别的攻击主要就是两步:找到要攻击的地方(被攻击单词)和如何攻击,针对于这两个不同角度也有一些不一样的文章。
如何找到攻击位置
白盒攻击中可以根据损失函数或者是前向导数等内部参数,反向寻找到输入中对输出影响最大的部分,黑盒攻击中一般都会构造一个打分函数,对文本中的每一个位置进行一个打分,分数越高则说明该部分在当前句子下最重要。
DeepWordBug:Black-box Generation of Adversarial Text Sequences to Evade Deep Learning Classifiers
这是一篇黑盒攻击的文章,着眼于利用打分函数如何寻找到一条文本中最重要的部分,在构造打分函数时充分考虑一个单词对句子前后的影响。
还有一种常用的打分函数,是直接将单词xi变为等长度的空格,分别通过分类器,以此判别单词xi的重要程度。
FastWordBug:A Fast Method To Generate Adversarial Text Against NLP Applications
这篇文章是基于DeepWordBug改进的文章,亮点在于速度快,并且从另外一个视角,将pos技术结合起来,快速构造对抗样本。
第一步:对一段文本中的句子进行重要性排序(猜测使用一个句子级别的分类器,然后同时使用打分函数即可);
第二步:将打分函数和pos词性进行关联,这一步是加快的关键点,这个关联的实际意义就是不需要对句子中的单词进行无目标的更换,而是优先对经常出错的单词进行一个更改,相当于对不同词性的单词给予一个权重,根据权重大小按照优先度对单词进行更改;
第三步:按照一些通用的方法进行更改即可。
最后实验数据也表明,确实攻击速率下降了一半,但是对于准确率下降幅度这么大,还是心存疑惑。
以后介绍的都是如何找到文本中最重要的单词,然后更改这个单词,思考角度都是寻找的方法,以后可能也会有更多的方法去更有效的寻找。但是使用的攻击就是很简单的替换,排序或者删除,还有一些文章是从如何攻击的角度来看待文本对抗。
如何攻击
Text Processing Like Humans Do: Visually Attacking and Shielding NLP Systems
这篇文章的角度不是着眼于我怎么找到最关键的地方修改,而是从修改方法下手,利用视觉的一些信息寻找修改的方法,具体指的是在字符嵌入空间寻找临近域。
ICES:基于图像信息的字符嵌入空间,将字符图像进行训练得到一个嵌入空间;
DCES:基于描述的字符嵌入空间,将字符-描述进行训练得到一个嵌入空间;
ECES:选择一个对应的变音符(在字符上添加上下角标)
既然这是通过视觉的信息寻找临近域,所以作者专门用一个部分去讨论修改方法对人类的影响。个人感觉单纯提出一张修改方法并不足以支撑起一篇文章,所以之后作者还加入了防御方法:对抗训练,字符嵌入,规则检查等等。并且在最后也验证了确实在hotword上做修改更加有效。
结合寻找位置和攻击
TEXTBUGGER: Generating Adversarial Text Against Real-world Applications
使用白盒攻击(雅阁比矩阵)和黑盒攻击(打分函数)来寻找最需要更改的位置,之后提出五种修改手段(插入,删除,替换,替代,同义词),并且攻击的不再是自己训练的模型,而是一些可用的API接口,这大大增加的文章的实际用途。
并且通过大量实验,验证TEXTBUGGER的攻击成功率,讨论了文本长度对于攻击的影响,对抗样本的不可察觉性,对抗样本的迁移性,不同修改方法的影响程度等等,最后还添加的拼写检查和对抗训练提升模型的鲁棒性。
该文章通过对寻找重要单词的位置,之后再对单词进行字符级别(同义词)修改,可能之后会使用一些其他方法,比如使用句法分析,pos标注等加快攻击的效率,并且通过beam search扩展到单词级别甚至是短语级别的攻击上。