比赛分析篇(1): 文本分类对抗攻击

知乎上有人提了一个问题,问的是NLP中有类似CV的对抗攻击研究吗(改变一个单词影响一整个句子/段落的意义)?

 

提问者其实问的是CV领域的单像素攻击(One pixel attack),想知道在NLP领域有没有类似的对抗攻击。

 

其实在NLP领域这种细微的修改攻击更常见,大家修复的badcase非常多的都属于这个类型。

 

比如在意图分类场景中,多一个标点,多一个”了”或者“的”,把意图分错的情况时常出现,我们称这种叫模型的泛化能力不够,并不会意识到是攻击或者bug。

 

要修复这种badcase,无非是加入训练集或者一对一修复。要避免非常低级的泛化不够,我们可以对训练数据做数据增强,对用户日志建立聚类挖掘闭环。

今天不讨论无意识的攻击,我们要来谈谈怎么有意的去bypass脏话识别模型。

 

这次是一次比赛的分析,比赛是天池上的文本分类对抗攻击,比赛主页地址在资源列表中。

 

先来看看比赛提供的一些信息。

 

比赛任务

 

基于辱骂文本生成对抗样本,使模型识别错误,同时扰动较小,并且不影响辱骂性质。

 

任务举例

图片

比赛更多的信息,包括数据来源,评测方法等请查阅相关比赛页面。

 

比赛分析

 

我们来看看官方举例的第一个对抗样本,把“妈“替换了拼音“ma”,“死”换成了数字“4”,在我们看来,这是挺正常的替换,读起来也是一句骂人的话,模型预测错误,成功被bypass。

 

想想,我们在遇到敏感字不能发微博,不能在游戏里面骂人的时候,是不是也是这样替换的,其实还有更多的姿势来bypass,你现在还能想到几种么?

 

在这个比赛中,第一是要保持辱骂性质,第二要保证识别错误,第三是扰动较小。因为扰动较小是评分中得高分的重要条件,所以大多数的参赛者都以原句子为准,去替换一些字词来达到目的,而主办方想让大家使用的梯度攻击并没有人使用。

 

这个比赛,让我想起了XSS,变化多端,bypass的姿势更是数不清,补了又补,猥琐流当道。这次的替换方式,其实早就隐藏在平时生活中的许多场景中,要赞许的是人们乐于挑战的智慧和勇气。

 

这次比赛获奖的TOP10战队思路也在比赛论坛中公开了,有兴趣的同学可以去看看,聚合一下绕过思路。

 

我的回答

 

以下是我对文章开头那个知乎问题的回答。

 

有。

假设在是脏话识别场景中,做以下的单字替换,模型的识别结果就非常糟糕。

 

#单字替换

def transform(line):

return line.replace('你',random.choice(["伱","伲","蚭","鈮"])) + '2' * len(line) * 6

为什么会这么糟糕,因为脏话基本上都有你这个字。

 

其实这样的对抗攻击测试,很多就是bypass模型,要做的工作多数属于数据增强。

 

比较有效的方法如:

数据增强

计算句子的相似度

  • 增减句子原有的字符,包括增减,拆分,乱序
  • 增减非原句子字符,包括空格,语气词,助词,标点符号,无意义词等
  • 关键字词替换,包括替换字典词,同音字,拼音,数字,高频词,词向量同义词等

 模型对抗

  • 梯度攻击
  • 模型弱点 比如fasttext可以拉大词距离

可以尝试的方法

  • GAN生成
  • 强化学习
  • BERT/GPT生成(完形填空)

 

资源列表

1. One pixel attack for fooling deep neural networks

     https://arxiv.org/abs/1710.08864

2. 文本分类对抗攻击比赛

     https://tianchi.aliyun.com/competition/entrance/231762/information

3. NLP中有类似CV的对抗攻击研究吗

    https://www.zhihu.com/question/407992050/answer/1350215592