通过关键词采集文章采集api(主办方线上模型和评测使用的1000条样本不公开(组图))
优采云 发布时间: 2022-02-10 06:18通过关键词采集文章采集api(主办方线上模型和评测使用的1000条样本不公开(组图))
文章文比较长,先列提纲,方便读者直奔重点。
“文本分类对抗攻击”是清华大学与阿里安全于2020年2月举办的AI竞赛,从排名开始到比赛结束,耗时约20天。内容是主办方在网上提供了1000个滥用样本,参赛者利用算法一一扰乱。, 使得在线模型将其判断为非滥用样本,在保留滥用性质的同时尽量保持干扰尽可能小(滥用性质由模型早期确定,最终由人确定) .
比赛规则
在线模型和评估中使用的 1,000 个样本未披露。参赛选手根据赛队指定的接口实现算法,并以docker方式提交在线评测。每天最多可进行15次评估,单次运行时间必须控制在30分钟以内。.
(第一知识点:熟悉Docker,简单环境调试)
其评价公式如下:
共1000个评价样本(samples=1000且均为辱骂文本),vi为最终人工评价结果,1为辱骂,0为非辱骂(仅人工评价最终入围数据,考虑早投vi=1);ci为分类结果,由多个在线模型判断并取平均值,攻击成功为1,攻击失败为0;pi为原创文本与被干扰文本的差值,考虑到字符和语义的区别,Sfinal的最终结果是1000分,详情请看比赛题的介绍:仔细看可以发现最重要的值是ci。如果攻击不成功,样本的ci得分为0,修改后的pi相对ci比较低。如此重要,仅作为辅助手来判断句子意思的变化(否则整个句子替换会得到高分)。
比赛提供了一个离线评价模型,可能是多个在线模型中的一个,明显弱于在线模型,也就是说能攻击离线模型的算法不一定能攻击在线模型;对抗也可能导致离线模型过拟合,影响算法的在线效果。但是对于玩家来说,线下模型是一个重要的参考,可以用来做基础评测。本次比赛不提供训练数据,所以自己采集数据后,可以用离线模型判断虐待性质。
问题可以分为两部分:定位哪些词决定是否滥用关键词,以及如何替换它们。一开始,作者的工作主要集中在前者。我以为只要定位够准确,就有足够多的词可以定位。,可以随意替换为特殊字符;后来发现,替换特殊字符可能会改变其滥用性质,而用特殊字符替换和用单词替换就行了。因此,本地化和生成都很重要。
数据采集
比赛不提供任何滥用数据。采集由玩家自己决定,赛队会给一个辱骂文本生成网站:一本诅咒书,可以用来生成一些辱骂数据(骂够狠),试试出来了,使用爬虫只能抓到1500左右,去重后也只有400多,这点很明显,但是不够训练。
(第二个知识点:爬虫和找虐场景,简单的数据工程)
笔者绞尽脑汁寻找网络辱骂的密集区域,典型的场景,但总是失败。最后我定位到豆瓣评分低的影评,发现一星和两星辱骂影评的比例在10-20%左右。我觉得很奇怪,我不喜欢买票看,看完还被骂。你怎么认为?看完评分最低的10部电影,真的不是没听过的电影或演员。还有王晶、郭德纲、周润发等明星,造成大家负面情绪的可能不是实际的好坏,而是实际和预期的差值(difference):评价=实际-预期。
最后觉得下载太麻烦,于是在CSDN上下载了影评库,花了一些C币来节省时间。过滤掉20000+个滥用数据,这个数据量也可以用来做简单的训练。
此外,还下载了“Internet Sensitive Words”用于关键字识别。起初,作者认为只有那些脏话才被称为侮辱。毕竟这在网上作为评价标准已经用了很长时间了。后来发现,如果只屏蔽脏话,分数会在100以内(大约10%)。目前的模型可以通过词与词之间的交互来识别大部分无脏词的攻击性语言,但需要一定的时间和计算能力。
算法尝试
在本次比赛中,作者尝试了很多算法。最终的模型虽然用的不多,但也是对自然语言对抗的一些学习和尝试。我会在这里分享。
对抗模型 GAN
目前常用的对抗模型来自2014年的论文《Generative Adversarial Nets》,它同时训练两个深度学习网络,生成模型G(进攻)和判别模型D(防御),比如使用对抗模型生成卡通头像,模型 G 用于生成头像,模型 D 用于判断图像是模型 G 生成的还是实际头像。这两个模型交替训练和迭代改进。具体方法是通过梯度来调整网络参数。由于图片是连续数据,因此可以通过增量微调来改进模型。
对抗网络经常使用 SeqGAN 方法来生成序列数据,该方法来源于 2016 年的论文《SeqGAN: Sequence Generative Adversarial Nets with Policy Gradient》。与简单的对抗不同,在单次生成过程中,模型使用了生成模型 G 和判别模型 D。以生成的文本为例,每生成一个新词,就调用生成模型 G,根据当前生成的单词,并使用判别模型对其进行评分(奖励),根据评分选择最佳策略Policy,并调整Policy Gradient。这里涉及到许多强化学习的概念。
这个问题只需要替换句子中的几个词,较少涉及GAN生成连续数据时遇到的问题。生成模型可以使用语言模型(如BERT),判别模型可以使用离线模型,生成句子的分数变化可以使用。调整生成模型,使其生成不易察觉的辱骂文本,但不能保证保留辱骂性质。
(第二个知识点:对抗网络)
强化学习模型
强化模型中最重要的概念是状态S,行为A,奖励R,根据当前状态,选择行为A,得到奖励R,然后逐步调整模型参数,这样当再次遇到状态S时,更好的选择行为以获得更大的奖励。
近年来强化模型中最流行的算法是蒙特卡洛梯度策略,这也是 SeqGAN 中使用的强化学习算法。蒙特卡洛树搜索常用于有很多情况无法一一列举的场景,比如:当前比赛中的一句话“ABCDEFGHIJKLMNOPQRSTUVWXYZ”,一共26个词,如果删除三个词(超过大多数情况下三个)可以达到最好的效果,有2600种可能性,如果你把每一种可能性都找出来,并且每次生成这几个单词的替换方案会很耗时。
最简单的方法是随机抽取,但是随机抽取的效果不好。蒙特卡洛树搜索方法更复杂。简单来说就是在开始的时候随机选择一些组合,打分,记录下来。分数越高,分数越高。该组合给出了更高的下次被选中的概率,并且经过多次迭代后,随机选择会偏向得分较高的策略。梯度策略一般采用深度学习网络和蒙特卡洛树搜索相结合的方式,使用两个模型分别调整策略和状态值,使模型收敛更快。
(第四个知识点:强化学习模型)
作者借鉴了蒙特卡洛梯度策略中强化高分项的随机抽取方法作为定位滥用关键词的算法。
注意力模型
Attention 模型在最近几年已经超越 Text-CNN,RNN 成为最流行的自然语言处理算法,其中 GPT 和 BERT 最为流行。GPT 常用于生成 文章,而 BERT 更灵活。由于它可以前后两个方向引用上下文,在完形填空类的应用中具有明显的优势。
本次大赛定位辱骂位置后,需要将辱骂词替换为其他词,类似于完形填空,非常适合使用BERT模型,BERT模型源码提供了完形填空函数的API(我用变压器库 Pytorch 版本的 BertForMaskedLM)。由于 BERT 可以下载中文预训练模型,因此无需训练即可生成更流畅的句子。
(第五个知识点:自然语言处理模型)
使用模型也存在一些问题:
作者还做了一些其他的尝试,比如训练 GPT,使用 BERT 训练一个滥用判别模型,将数据分成 8:2 进行训练和验证。测试集的成功率为97-98%。从Embedding层和隐藏层提取数据,希望能定位到一些滥用的关键词,但是因为数据分得太细,最后没有实现(没想到用gensim找同义词基于Embedding,并用加减法来做。组合减去滥用的方法,后来发现值得尝试)。
作者在提交给本次比赛的最终版本中只使用了基本的 BERT 模型。每次选择概率最高的topN词作为备选词,选择辱骂分数最低的词,并限制调用次数。同时,尝试了批量预测。为了省时间。但调用次数太少,上线并没有达到预期的效果。感觉最好的方法可能是结合评估工具使用BERT模型,先用辱骂数据微调辱骂模型,然后在生成词的过程中使用评价工具的得分作为评价,这样模型是朝着生成non-abusive的方向发展的,听上去很矛盾,一直没来得及尝试。
其他算法
除了以上典型的解决方案,作者还尝试了一些其他的方法,下面列出了比较有效的方法。
可以看出,出现频率最高的词是“你”。当时作者觉得这个词太普通了,没有处理(这里铺垫),改了一些其他比较明显的辱骂词。
学习别人的算法
终于,在比赛结束前的最后一个小时,我冲到了排行榜的第一页(Top20),感觉像是在长跑比赛中筋疲力尽,被抛在了后面)被我前面的同学绕了好几圈,终于跑到了终点线,突然放松了。
弱点攻击
英雄的算法是将例子中的“you”全部替换为相似的同音字,并在单词后面加一个阿拉伯数字,只用一行代码就可以得到600多分,赢了所有人。相信很多同学也观察到了“你”这个词在谩骂中的特殊性,但是“你”显然不是人类认知中的谩骂词。后来,比赛还在聊天中表示,一些明显的辱骂性词语被保护了,但“你”这个词没有被特殊处理,形成了一个漏洞,最终被打破。只有替换“你”的分数是有限的。更有意思的是,他还在“你”后面加了一个数字。作者认为这种方法可以用来攻击词组合的特殊含义,尤其是在打破 CNN 和 RNN 模型之前和之后。依赖,想想就觉得不可思议。(第六个知识点:模型原理) 加法还是“数”。其实在比赛提供的demo中可以看到,如果把“dead”换成4,就可以骗过模型,而且这个数字也可以算是漏洞,或者说是一扇暗门。而第一英雄有效地结合了以上三点。
在文本中添加或减去内容
每个人还尝试在文本中添加符号、空格和单词,以减少其滥用性质,特别是对于短文本。试想如果句子中只有两个词,全部替换,相似度得分为0,只替换其中一个。它也可能被认为是滥用,添加内容也是一个好主意。但不知为何,作者试了之后没有给分。删除内容也是一种方法,特别是因为长文本会导致大量计算,适当的剪枝也是一个好主意。
查找词向量的同义词
定位滥用的关键词并将其替换为同义词也是常用的方法。有人使用腾讯词向量,提供超过800万个中文词条。与传统的同义词或词表相比,它可以说是非常高科技的,但它提供了通常意义上的词义,自然语言任务可以使用它从文本中提取特征向量化(用于机器学习算法),以下是官方示例。
除了同义词,Gensim还提供了加减法功能,比如“king”-“man”+“woman”≈“queen”,也是不错的创意。腾讯的词向量虽然内容丰富,但速度也很慢。使用比赛提供的词向量可能会更好。此外,还可以使用滥用语料库来训练模型,从中提取词向量,并使用上面提到的减法功能。具体的使用文档已经贴在博客上。
(第七个知识点:知识)
梯度攻击
比赛推荐的方法是梯度攻击。原理是调整输入,使损失函数变大。具体方法是从输入中推导出损失函数,然后根据导数的方向调整输入数据,调整Embedding层数据,然后使用词向量工具进行逆向。推送特定文本。很巧妙的方法,不看论文很难自己想出来。
快速文本模型
比赛给出的离线评价是Fasttext模型,快速有效。赛后看了fasttext的相关论文,发现好像可以用简单模型和深度学习模型的区别来找漏洞。例如,n-gram一般涉及的相关词很少,所以通过增加词间距,可能会造成干扰。也可以从中提取词向量特征,词袋模型不支持词序等。
总结
攻击游戏需要研究对手的算法原理和弱点。这一次,我没有深入挖掘比赛提供的信息。本来是半黑盒子,这让我把它理解为全黑盒子。没看好题,然后越走越远,探索太多,探索太少,需要在以后的比赛中认真对待。
比赛和真实场景有很大的不同。比赛可以通过测试排名和拟合评价函数来获得高分。在实际场景中,更多关注的是问题本身,比如如何更好地识别滥用,更好地保留句子的含义和滥用的性质。同时愚弄模型,如何利用新技术,泛化现有算法,而不是仅仅捕捉模型的漏洞。
这一次,虽然成绩并不好,但也收获颇丰:有的领域从未知到已知,有的从模糊到理解,有的从已知到使用。非常感谢大赛提供的平台和活跃在讨论区的朋友们。
比赛结束一周后,我回顾了与比赛相关的技术,并写了一些文件:
生成对抗网络 GAN
序列对抗网络 SeqGAN
自然语言处理——使用词向量(腾讯词向量)
梯度攻击
轻量级 BERT 模型 ALBERT
强化学习(一)基本概念和工具
Fasttext 快速文本分类
最近,我打算改变与自然语言处理(或深度学习)相关的算法工作。最好的工作地点在北京海淀附近。如果你能给我一个机会,请联系我。:P 邮箱,微信 66768512。