第三期安全 AI 挑战者计划 - 文本分类对抗攻击 第十名「你钉起来真好听」技术总结
关联比赛: 【长期赛】安全AI挑战者计划第三期 - 文本分类对抗攻击
赛题分析
本次赛题基于辱骂文本生成对抗样本,要求使模型识别错误,同时扰动较小,并且不影响辱骂性质难点在于无训练集,测试集不可见,模型不公开(只提供了一个“简易”模型)
四个评估扰动的指标为 编辑相似度,词粒度 Jaccard 相似度,字符粒度 Jaccard 相似度,embedding cosine 相似度。其中,Jaccard 相似度定义为 A 与 B 交集的大小与 A 与 B 并集的大小的比值,这个指标对于一个粒度的增删改的敏感度有着明显不同,换>删>增。如果添加同一个字符两次以上,Jaccard 相似度将不再变化,embedding 相似度变化较小,增词的优势则更大
思路分析
最基本的思路是从官方提供的简易模型入手,计算出句子中每个词的重要性,在根据重要性排名借助简易模型的评分启发式地替换同义词(同义词从 embedding 相似的词中寻找)。但这个思路存在一些问题:
首先是主办方提供的简易模型加载官方的 fasttext 模型,读取其中的 words,发现只有 1000 个左右的词(包括符号)较少,这可能使我们无法区分一个词对模型的影响是 OOV 的问题还是其他问题。再用这个模型去测试 1000 条测试集中的准确率(测试集全为辱骂样本,准确率=模型测出的辱骂样本/1000),当然由于测试集不可见,只能用 if else 判断一下区间,最后测得准确率为 65%~70%之间,对于分类问题,这算是一个比较差的模型了,所以简易模型一定程度上无法代表测试模型
其次,替换词会比较繁琐从 embedding 相似的词中去找同义词会很繁琐,加上新词挖掘机制,替换的新词有出现频率限制,也无法统一换成拼音
所以,换词的思路可谓是困难重重。而删词呢,一方面会影响可读性,一方面什么词会被删掉不可控,删除辱骂词可能会影响辱骂性质。
那么现在只剩增词一条路了,有没有这样一种可能性?就是增加的是一些毫无意义的词或字符(无意义的词或字符不会影响可读性和辱骂性),又能改变模型的预测呢?
最终方案
是有的
可以看到官方的代码如下:
这样的一份样例代码有 30-32 分左右,如果把末尾加的随机数字去掉,则只有 27 分。可以看出,即使是末尾加一个随机数字这样很弱的扰动,仍然有可能影响模型判断!
那我们把扰动变得更强一点呢?比如:
有 50-60 多分,但是比预想的会低很多,毕竟在本地的 fasttext 模型上测得这样一个扰动会给模型预测很大的改变。那为什么线上的模型不行?原因在于正常的分词模型,会把一连串的数字如 '666' 分为一个词,而我们需要的是 3 个 6 而不是一个 '666'为了使分词模型正常识别我们这里是 n 个 6,代码改动如下:
这样就有 160 分了所以最终方案就是就是把上述代码的中重复的次数改到 20,就有 250+的分数了
这样的改动,按理说原句完全保留,人工审核应该能拿满分的样子。稍微再在原句上做些改动,分数应该还能往上冲。
(至于我为什么没有再往上冲,这个原因很复杂,我说不清楚 #手动滑稽)
最后,感谢主办方提供的这次比赛的机会。
查看更多内容,欢迎访问天池技术圈官方地址:第三期安全AI挑战者计划-文本分类对抗攻击 第十名「你钉起来真好听」技术总结_天池技术圈-阿里云天池
评论