V1版主要是判断某条评论是否为辱骂评论,模型结构仍旧基于BERT。
在数据构建方面,我们采取了伪标签加对抗样本增强的方式。什么是对抗样本?假设有一个正例数据,我们给它一个轻微的扰动,模型会把它判成负例,并且这个扰动不足以改变句子的原始语义,这样就是一条有效的对抗样本。训练中加入对抗样本,可以极大地提升模型的鲁棒性。
在构建对抗样本时,我们使用了一种基于梯度的白盒攻击方法,且具有一定的可解释性,它可以告诉我们哪些字词是模型中比较重要的特征,我们还可以通过构建显著图,来了解模型是不是真学到了有用的特征。相比于图像对抗领域,文本对抗更难,是因为文本的特征是离散的,度量比较困难,稍微改动一两个字,文本的语意可能就会发生巨大的改变。比如“这首歌曲真好听呀! ”,我们把“真”改成“不”,它的情感极性就从正向变成负向,但是它们的Jaccard相似度却依旧很高。
这里使用了Hot Flip方法,图中展开式的L代表损失函数,Δ x是轻微扰动。意味着我们需要沿着梯度上升的方向去找一个Δ x,这个Δ x能够使得损失函数快速增大。此外,因为文本序列的特征是离散的,我们还需要对Δ x进行离散化处理,模型最终给出了一些有效和无效的对抗样本实例。
除此之外,我们对预训练任务做了一定的修改,融合了目前非常火热的Prompt方法。
一般来说,首先利用大规模的中文语料得到预训练模型,然后利用目标领域的无标签数据再次预训练。这里我们将Prompt运用在Post Train阶段,希望能得到一个更适配于下游任务的预训练模型。Prompt被证明在few shot场景下有不错的效果,其核心思想是将下游任务转换成一个语言模型或者完形填空的任务。在上图例子中,我们在句子前添加Prefix(Prompt Token),句子其他部分采用传统的MLM采样方式,然后对MSK Token进行预测。此外,不同Prompt模板产生的训练效果差异较大,我们希望通过模型自动找到最合适的Prompt Pattern。
这里借鉴了Auto Prompt的思想,把之前确定性的Prompt全部替换成Mask Token,然后让模型自己去决定Mask Token是什么。我们的目标是要找到一个最好的Prompt,使得LABEL部分的预测损失变小。因此需要沿着梯度负方向去寻找这样的Prompt。此外,我们还加入了语言模型,使得生成的Prompt能够更加流畅。
3. 辱骂模型-V2
第一版模型没有考虑用户的关系链和评论的辱骂等级,比如好友评价“唱的不是很好听,需要继续努力。”,这是比较客观的负面评价,如果把这样的评论也沉底或隐藏了,整个K歌只有单一的正向夸赞的评论,这不是我们所期望的。这里需要将辱骂等级重新切分为非负面、客观负面、轻度辱骂和重度辱骂四个等级,负面程度依次递增,然后根据不同的用户关系进行不同程度的隐藏或沉底。此外,我们希望模型的误伤判错能够控制在相邻等级之间,这样业务损失会比较小。
为了解决这个问题,我们把四分类模型变成了多个二分类模型。例如,对于一条重度辱骂评论,我们会先去判断它是非负面还是其他三类等级,如果是其他三类,我们才会接着进行后面的判断。此外,在模型层面我们加入了分类链去强化标签之间的相关性。其中,GRU每个时刻生成一个0/1标签,最终得到了一个标签序列,去对应一个具体的辱骂等级。比如一条轻度辱骂评论,它对应的分类序列就是110,重度辱骂对应的序列是1110。此外,我们加入了一个V矩阵来加强不同任务的感知。此外,我们还复用了之前的Prompt MLM预训练模型,有不错的提升。