0


第三期安全AI挑战者计划-文本分类对抗攻击 第三名“我永远喜欢星野源”技术总结

关联比赛: 【长期赛】安全AI挑战者计划第三期 - 文本分类对抗攻击

1. 赛前准备

本次比赛与其它一些比赛一个比较大的不同点是本次比赛需要使用Docker提交打包好的镜像,因此需要对Docker的常见操作有基本的了解。除了天池官方提供的Docker练习场外,这里推荐B站我邮学长主讲的Docker教程。相信看完这个教程对Docker的构建和提交方式就能够有一个比较不错的了解了。

2. 语料收集与处理

本次比赛的场景聚焦于“辱骂”,因此一开始我们队伍一个最朴素的思路就是找到样本中有辱骂含义的词并进行替换。因此,我们通过百度文库、nmsl网站以及其它互联网文本中收集了一批语料,使用这些语料提取辱骂关键词(jieba.analyse.extract_tags,jieba.analyse.textrank),通过删除样本中含有的辱骂关键词,我们能得到约180分左右的成绩。通过检查提取到的关键词表我们发现,尽管词表中的确含有较多辱骂句子中的常用词,但是由于互联网语料质量参差不齐,且为了提交命中率我们将jieba抽取出的所有词都保留了下来,因此造成了语料中很多没有辱骂性质的词也被保留了下来。因此,我们考虑对语料进行筛选和过滤。我们最后使用了三级词表策略:(1)将所有语料送入百度的内容审核平台,该平台对每一条语料识别其是否为辱骂,如果为辱骂还会返回命中的关键词。我们将该平台返回的所有辱骂关键词及这些关键词分词后的词组成的词表称为一级词表,一级词表中词汇个数最少,但是词汇的辱骂程度最高;(2)接下来,我们将第一步中被识别为辱骂的句子通过jieba的关键词抽取算法组成二级词表,同时在二级词表中我们还利用参考模型对评分embedding中的所有词进行判断,分类为“辱骂”的也加入二级词表中。我们认为二级词表中词汇的辱骂程度为中等,比一级词表要低;(3)最后,我们将整个语料库进行关键词抽取,组成三级词表。三级词表中的词汇数目最多,但辱骂性质最差。在最后的方案中我们对三级词表进行分级匹配,详见第三节。

3. 整体替换策略

3.1 下划线分隔

本次比赛的评分标准由扰动大小和模型识别结果组成,另外还要保证替换后的可读性。考虑到目前许多NLP模型中往往将一句话拆分成词或字的序列,然后将序列输入到模型中来得出结果,我们猜想也许破坏这个序列,也即破坏句子中的每个词或字的上下文关系对增加模型理解的难度是有意义的,因此我们考虑在句子中增加分隔符来攻击模型。但是,增加分隔符会使得扰动变大、可读性变差,因此要考虑选取适当的分隔符。我们在官方给出的doc2vec向量计算函数

def doc2vec(tokenized):
    tokens = tokenized.split(' ')
    vec = np.full(EMBEDDING_DIM, 1e-10)
    weight = 1e-8
    for _token in tokens:
        try:
            vec += DEFAULT_KEYVEC.get_vector(_token)
            weight += 1.0
        except:
            pass
    return vec / weight

中发现,该函数首先会去找embedding中某个字符的embedding,如果该字符不在embedding中,则该字符的embedding就不会被计入doc2vec向量的计算中。基于此,我们发现下划线'_'不在官方给出的embedding中,且在句子中添加下划线来对每个字进行分隔对可读性的影响比较小。在权衡对扰动大小、可读性及分类结果的影响后,通过单纯对句子中的每个字之间添加两个下划线,我们能够拿到约360分。

3.2 关键词替换策略

除了使用下划线对文本进行分隔外,我们采用了关键词替换策略对文本进行攻击。在比赛一开始时,我们尝试了使用拼音、简繁转换等方式来替换样本中的关键词,但是效果均不是很好,说明主办方对这两种策略采用了对应的方法进行防御,因而我们最后决定使用同音字与形近字替换。对于一条样本,我们首先使用第2节中提到的第一级词库进行关键词匹配,如果匹配到了关键词,考虑到对可读性的影响,对关键词中的每一个字分别进行同音字替换,然后将替换后的文本送入参考模型进行判断,选择令参考模型的判断改变最大的字对样本进行替换。为了权衡分类结果和可读性,我们将每一次替换后的文本都使用参考模型进行分类,如果分类结果为“正常”且置信度大于我们设定的阈值,我们就直接将该文本返回而不进行之后的替换,该阈值我们依据经验最终设定了0.7;如果没有匹配到第一级词表中的关键词,则再进行第二级词表的匹配,以此类推。

3.3 整体替换流程

(1)将样本以两个下划线逐字分隔,并使用参考模型分类,弱分类结果为“正常”且置信度大于0.7,直接返回
(2)将辱骂词表设置为第二节中的第一级词表
(3)对样本匹配辱骂词表,如果匹配到关键词转到(4),否则:如果当前词表为第一级词表,转到(5);如果为第二级词表转到(6)
(4)对于每一个匹配到的关键词,将其中的某一个字随机替换为同音的其它字,替换后执行下划线分隔策略得到替换文本,将替换文本使用参考模型进行判断,得到置信度(如分类结果为“辱骂”则将对应置信度取反)。将参考模型对关键词每一个字替换后得到的替换文本的置信度进行排序,选择置信度最高的字进行实际替换。如果该字对应的置信度高于0.7,直接返回该文本;否则继续处理下一个关键词。处理完所有关键词之后转到(7)
(5)将辱骂词表设置为第二级词表
(6)将辱骂词表设置为第三级词表
(7)对替换后的文本的每个字之间使用两个下划线分隔,然后返回该文本

3.4 一些细节

(1)考虑到辱骂词表中的词均为简体,为了提高命中率,我们使用Opencc对样本进行简繁转换后再匹配关键词,但是为了减小距离我们对样本中关键词以外的部分保留了其原始的文本。
(2)为了提高可读性,我们对原始的拼音转汉字的字典进行了部分筛选,保留了每个音中形近且常用的字。
(3)为了减小扰动程度,我们使用停用词表过滤了辱骂词表中的单字,因为我们认为停用词表中的单字通常没有辱骂的含义。

3.5 其它尝试

除了以上提到的策略之外,我们在比赛过程中还采用了一些没有体现在最终方案之中的策略。例如,我们实现了TextBugger算法[1]来对没有匹配到三级词表中任何关键词的样本进行处理。但是最后也许是我们的语料已经比较完善,对于每一个样本均能匹配到关键词,该算法对得分没有任何提升,本着奥卡姆剃刀原则,我们最后去掉了该策略。

4. 比赛总结与心得

通过本次比赛,认识了各个学校的大佬,他们的方法也让我们队有一种“恍然大悟”的感觉。例如我们在比赛中虽然想到了通过添加分隔符的方式来攻击模型,但是在文本的每个字符之间添加分隔符会显著增加词汇层面的杰卡德距离,而如果在样本末尾添加扰动字符就不会出现这些问题。再如,很多组的同学都提到替换“你”这个字对模型影响特别大(我们直接把这个字用停用词表过滤掉了),以及对新词替换次数的阈值应当有限制等问题,这些问题我们在比赛过程中没有发现。总的来说,这是一次非常有意义、对我们帮助很大的比赛。

5. 参考文献

[1] Li J, Ji S, Du T, et al. Textbugger: Generating adversarial text against real-world applications[J]. arXiv preprint arXiv:1812.05271, 2018.

6. 相关资源

我们的方案中用到了一部分开源代码,现列举如下:
jieba 用于中文分词
gensim用于计算相似度和获取词的embedding
pypinyin用于汉字转拼音
opencc-python用于简繁转换
Pinyin2Hanzi用于拼音转汉字
selenium用于爬取互联网语料

查看更多内容,欢迎访问天池技术圈官方地址:第三期安全AI挑战者计划-文本分类对抗攻击 第三名“我永远喜欢星野源”技术总结_天池技术圈-阿里云天池


本文转载自: https://blog.csdn.net/gangyikeji/article/details/142526011
版权归原作者 阿里云天池 所有, 如有侵权,请联系我们删除。

“第三期安全AI挑战者计划-文本分类对抗攻击 第三名“我永远喜欢星野源”技术总结”的评论:

还没有评论