第三期安全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算法来对没有匹配到三级词表中任何关键词的样本进行处理。但是末了大概是我们的语料已经比较美满,对于每一个样本均能匹配到关键词,该算法对得分没有任何提升,本着奥卡姆剃刀原则,我们末了去掉了该战略。
4. 比赛总结与心得
通过本次比赛,认识了各个学校的大佬,他们的方法也让我们队有一种“恍然大悟”的感觉。例如我们在比赛中固然想到了通过添加分隔符的方式来攻击模子,但是在文本的每个字符之间添加分隔符会显著增加词汇层面的杰卡德距离,而假如在样本末端添加扰动字符就不会出现这些问题。再如,许多组的同砚都提到更换“你”这个字对模子影响特别大(我们直接把这个字用停用词表过滤掉了),以及对新词更换次数的阈值应当有限制等问题,这些问题我们在比赛过程中没有发现。总的来说,这是一次非常故意义、对我们帮助很大的比赛。
5. 参考文献
Li J, Ji S, Du T, et al. Textbugger: Generating adversarial text against real-world applications. arXiv preprint arXiv:1812.05271, 2018.
6. 相关资源
我们的方案中用到了一部分开源代码,现列举如下:
jieba 用于中文分词
gensim用于计算相似度和获取词的embedding
pypinyin用于汉字转拼音
opencc-python用于简繁转换
Pinyin2Hanzi用于拼音转汉字
selenium用于爬取互联网语料
查看更多内容,欢迎访问天池技能圈官方地点:第三期安全AI挑战者筹划-文天职类对抗攻击 第三名“我永久喜欢星野源”技能总结_天池技能圈-阿里云天池
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]