比赛分析篇(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生成(完形填空)