文本预训练模型在信息安全场景的探索和实践

导读

本文介绍文本预训练模型在信息安全场景的一些探索和实践,主要聚焦于对话文本分类。信息安全场景种类繁多,其中一项具体业务是对用户提交的举报内容进行审核,判断被举报对象是否有违规问题。用户提交的举报材料有多种形式,而双方沟通的文字对话记录是一项关键证据。少量的对话文本可以通过人工的方式进行审核,而更大量、更快速的识别还需要借助算法。

背景

NLP 角度看,识别上述虚假问题属于文本分类任务,输入双方对话文本,对定义的虚假问题做出识别和判定。依据不同的需求,任务可分为“多类别分类”和“多标签分类”两种,如图1所示。以下以租房场景“识别双方身份”任务为例介绍算法探索实践,该任务需要基于对话文本,同时识别双方(发帖方 / 浏览方)的身份信息(房东 / 中介/未知)。

图1 业务问题与算法问题的转化

当前文本分类比较成熟的算法是以TextCNN、RNN、Transformer为代表的深度学习方法 ,我们首先尝试使用 TextCNN ,这也是许多文本分类任务的 baseline 模型。

TextCNN

TextCNN [1] 模型的特点是网络结构简单,利用多尺寸卷积核提取文本中的关键信息,能够较好地捕捉局部特征。因为是对话分类,和普通的文本分类相比还多包含了角色信息。我们首先尝试在每句对话内容之后都附加一个“role token”,如图2所示,“ [Ra] ”代表浏览方,“[Rb]”代表发帖方,从而将角色信息传递给模型。

图2 模型输入层的角色信息融入

将文本内容按对话顺序依次拼接,经过随机初始化的字向量层映射后作为模型的输入,中间为常规的卷积池化层,最后通过 sigmoid 输出各个标签的概率。训练集规模约20k,测试集规模1k。在测试集上,“发帖方是中介”和“浏览方是中介”两个标签宏平均( Macro-averageF1 值为 87.3

表1 TextCNN模型测试结果

类似的模型结构,根据不同的需求,我们还训练了“房态虚假识别”、“整租合租识别”等多个对话分类模型, F1 值均在 86~90 之间。在 bad case 分析中,我们发现存在一类 hard samples ,关键短语基本相同,只因说话角色不同,导致最终判定也不相同。例如同样是“已经租了”,如果是发帖方说的,那很可能是本套房源已出租他人,可以认定为“房源虚假”;但如果是浏览方说的,则可能是他已在别处完成租房,与本套房源状态无关,应属于“无法判断”。另一种情形是本例中的“识别双方身份”任务,模型学习到了中介的关键特征,却容易在识别角色时出错,导致本该判定“浏览方是中介”,却给出了“发帖方是中介”的错误标签。

图3 TextCNN模型bad case分析

基于上述 case ,我们推测当前模型在进行对话分类任务时,对于角色信息的融入还不够充分。我们将目光投向业界,寻找更好的融合方式。

图4 BERT输入层设计

BERT [2] Google2018 年发布的预训练模型,为 NLP 带来里程碑式的进展。 BERT 模型的输入可以是 文本对 ,为了分隔两段文本,除了在 input 序列中插入 [SEP] ,还另外添加 segment embeddings 层,不同部分的文本叠加不同的 embedding向量 以强化区分。虽然 BERT句子对 只有两部分,与对话文本(可能有多轮)有一定差异,但这种处理的方式可以借鉴。

图5 TextCNN_role模型结构

于是我们尝试改进原始的 TextCNN 模型,如图5所示,在输入层叠加 role embeddings ,不同角色的会话内容叠加不同的 embedding向量 。改进后的模型命名为 TextCNN_role ,我们期望通过这种方式,强化模型对于对话内容所属角色的认知。基于相同训练集和测试集, TextCNN_role 模型测试结果的宏平均 F1 值为 88.4 ,相比原始 TextCNN 提高 1.1 个百分点,如表2所示。

表2 TextCNN_role模型测试结果

改进有一定效果,不过还能进一步提高吗?

RoBERTa

BERT 之后,预训练模型一直是 NLP 的热门研究方向,各种类型的 PTMPre-trained Model )不断刷新着 NLP 竞赛榜单。 PTM 的思想基本可以归纳为两个阶段:预训练阶段,模型在大规模无标注文本中学习通用语言知识;微调阶段,继续学习下游任务,最终得到合适的业务模型,这也是迁移学习的思路。我们之前使用的 TextCNN 模型是“从零开始”,既然可以“站在巨人的肩膀上”,为何不尝试一下呢?

我们选择了 BERT 元老的“继任”—— RoBERTa 模型 [3] RoBERTaBERT 的思路基本一致,主要改动是增加预训练数据、增大预训练步数与 batch size 、引入动态 mask 机制、去除 NSP 任务等。从目前来看, RoBERTa 是一个很强的预训练模型  baseline 。哈工大讯飞联合实验室和国内开发者 brightmart 都开源了RoBERTa 中文版本 [4][5] ,我们选择brightmart在Github发布的12层模型,该模型在预训练阶段使用的语料包含30G原始文本(近3亿句子,100亿中文字),覆盖新闻、社区问答、百科等多个领域。

微调阶段,对话文本在输入模型前需要做一定预处理。为了尽量和预训练保持一致,我们使用“[SEP]”分隔不同角色的对话内容,相同角色连续多次发言做拼接处理。segment embedd ings 的处理方式与之前相同,用不同的 embedding向量 代表不同的对话角色。

图6 对话文本的输入设计

开源代码只包含“多类别”分类,需要做几处改动才能支持“多标签”分类,主要是 model 输出层的 softmax 替换为 sigmoid ,同时将 loss 改为 sigmoid_cross_entropy_with_logits ,另外模型 eval 阶段的指标计算方式也要做相应更改。

表3 RoBERTa模型测试结果

基于相同的数据,模型测试结果的宏平均 F1 值为 89.3 ,相比“改进版” TextCNN 模型提高 0.9 个百分点。有一定的提升,但没有预想中的明显,原因在哪里?

RoBERTa-58Dialog

前面说到预训练分两个阶段,通常拿到业务数据后,直接在预训练好的模型上做微调即可。不过,这种方式真的是最佳实践么?从目前的研究结果来看并不是,我们可以在目标领域和任务数据上继续预训练,从而获得更优的效果。

开源预训练模型一般是在通用语料集上训练的,如果在下游任务微调之前,能够使用目标领域的数据集进行继续预训练( domain-adaptive pretraining , DAPT ),那么目标领域与原始预训练语料越不相关, DAPT 效果提升越明显。如果继续预训练选择的语料是具体下游任务的数据集( task-adaptive pretraining, TAPT ),也同样能获得效果提升 [6] 。需要说明的是,预训练任务的特点决定了预训练阶段只使用语料的文本内容,并不需要标注信息,如果具体下游任务的数据集是已标注的,只需取其内容,将标注信息丢弃即可。

具体到当前的租房场景“识别双方身份”任务, RoBERTa 模型预训练数据是新闻、社区问答、百科等通用语料,而任务面对的却是租房场景的对话信息。后者有较强的业务属性,更加口语化,与前者差异较大,这也可能是直接进行 微调效果不理想的原因。沿着这个思路,我们在RoBERTa中文模型基础上,尝试融入业务数据进行继续预训练,最终产出了更加适用文本对话的预训练模型RoBERTa_58Dialog。

数据选择上,我们抽取举报审核场景用户提交的全量对话文本,每组对话均有多轮,清洗后作为“目标领域数据集”供 DAPT 使用。另外将 20k “识别双方身份”任务的已标注数据去除标签,作为“下游任务数据集”供 TAPT 使用。从数据量看, DAPT 数据远多于 TAPT ,具有更多的资源优势,而 TAPT 的优势是与下游任务直接相关。在任务顺序上,如果是先TAPT再DAPT,那么TAPT阶段 (数据量少,与任务直接相关)学习到的“知识”,在DAPT时可能又被“遗忘”。因此,为了结合两者的优点,我们采用先DAPT再TAPT的顺序。

参数选择上,原始 RoBERTa 中文版模型预训练学习率为 1e-4 ,在继续预训练阶段我们选择较小的 2e-5 ,避免对之前学习的参数调整过多。其他一些参数配置 如下, max_seq_length=128batch_size=32max_predictions_per_seq=12

最终,根据继续预训练 step 的不同产出两个模型:  15k step 模型和 100k step 模型,预训练 mlm 任务 acc 分别为 0.730.76 。从mlm任务看, 100k step 模型对业务数据的学习更充分些。两个模型分别进行下游任务微调,测试结果如表4所示。

表4 RoBERTa_58Dialog模型测试结果

结果证明, DAPT+TAPT 确实有效。和基于通用语料训练的 RoBERTa 相比,加入目标领域和下游业务数据的 RoBERTa_58Dialog 在“识别双方身份”任务有 4.5-4.7 个百分点提升。我们推测主要原因是原有预训练数据与业务相差较大,加入业务数据继续预训练收益较多。

至此,模型在识别效果上已有明显提升,只是基于 PTM 微调的模型参数量大,推理速度较慢。于是我们思考,有没有办法能够加快推理速度?

58Dialog-mini

预训练模型在许多任务上的表现都优于传统模型,但也有着训练难、参数多、推理慢的缺点,大大限制了模型的线上应用。因此,随着预训练模型的参数规模越来越大,知识蒸馏( Knowledge Distillation )的重要性也在日益凸显。知识蒸馏首先训练参数量大的 teacher 模型,再设计小参数量的 student 网络,通过一系列的蒸馏训练,将 teacher 模型学习的“知识”不断向 student 模型迁移,最终后者的预测精度能够逼近前者,实现“小网络”近似“大网络”的效果 [7]

本任务中,选取继续训练 100k stepRoBERTa_58Dialog 模型作为 teacher 模型。RoBERTa_58Dialog 有 12transformer 结构,为了加快推理速度,我们将 student 模型的transformer 层数设为4,其他结构和参数均保持不变,蒸馏后的模型称为58Dialog_mini。

蒸馏时, teacher 模型和 student 模型轮流训练,使用的数据为之前DAPT的对话文本。每个回合输入相同数据, teacher 模型保持参数不变, student 模型不断拟合 teacher 模型的输出权重,如此循环,直到 student 模型 mlm 任务的 acc 收敛。这里需要说明的是,之所以不使用预训练数据直接训练 student 模型,而是让其拟合 teacher 模型的输出,是因为后者的输出概率分布中包含更多的信息。我们的目标不是拟合训练数据,而是学习更好的泛化能力,在这一点上, teacher 模型更有优势。

在实践中,我们发现层的初始化和映射选择也有一定的技巧。 student 模型的参数可以选择随机初始化,也可以载入 teacher 模型特定层的参数作为初始参数。如果选择后者,还需要考虑载入层的映射关系。通常我们认为 BERT 类的预训练模型,每一层学习到的知识各有侧重点:接近底层,对词法、句法等基础语言学知识更关注;接近输出层,对整体语义或者下游任务更关注。我们蒸馏产出的 58Dialog_mini 模型有 4 层,初始化时分别载入 teacher 模型 [0, 3, 7, 11] 层参数作为初始参数,实践发现这种初始化方式比随机初始化能够更快地收敛。

蒸馏完成后, 58Dialog_mini 模型 mlm 任务 acc0.73 ,比 teacher 模型下降 3 个百分点。经过下游“识别双方身份”任务微调后,识别结果宏平均 F1 值比 teacher 模型低 1.7

表5 58Dialog_mini模型测试结果  

效果的小幅下降能否换来推理速度上的提升?我们将两个模型分别部署至五八人工智能平台WPAI,硬件环境都是NVIDIA TESLA P40 GPU,各自调用1k次取均值。teacher模型平均耗时13.75ms,student模型平均耗时5.92ms,蒸馏后耗时减少57%,速度提升明显。在线上业务中,可以根据实际需求,牺牲一部分识别精度,换取更快的推理速度。    

总结与展望

本文以信息安全场景的“租房-识别双方身份”任务为例,描述了从基础模型到预训练模型的一步步探索和实践过程,核心还是结合业务实际和模型特点进行改造升级,表6是上述所有模型的测试结果汇总。

表6 模型测试结果汇总

未来可以从以下几个方面做进一步探索和实践:

  1. 基础模型层面,尝试ALBERT [8] 、ELECTRA [9] 等更多类型的预训练模型;

  2. DAPT+TAPT阶段,尝试添加更多、更高质量的数据,目前来看这部分潜力还未挖掘完全;

  3. 知识蒸馏阶段,尝试优化训练目标、调整模型结构、选择多种初始化方式等,尽可能保留模型业务精度的同时加快模型推理速度。 

作者简介:

毛丁辉: 58同城- 信息安全部-多媒体算法组,开发工程师

参考文献:

[1]   Kim Y. Convolutional neural networks for sentence classification[J]. arXiv preprint arXiv:1408.5882, 2014.

[2] Devlin J, Chang M W, Lee K, et al. Bert: Pre-training of deep bidirectional transformers for language understanding[J]. arXiv preprint arXiv:1810.04805, 2018.

[3] Liu Y, Ott M, Goyal N, et al. Roberta: A robustly optimized bert pretraining approach[J]. arXiv preprint arXiv:1907.11692, 2019.

[4]   https://github.com/ymcui/Chinese-BERT-wwm

[5]   https://github.com/brightmart/roberta_zh

[6]   Gururangan S, Marasović A, Swayamdipta S, et al. Don\’t Stop Pretraining: Adapt Language Models to Domains and Tasks[J]. arXiv preprint arXiv:2004.10964, 2020.

[7]   Hinton G, Vinyals O, Dean J. Distilling the knowledge in a neural network[J]. arXiv preprint arXiv:1503.02531, 2015.

[8]   Lan Z, Chen M, Goodman S, et al. Albert: A lite bert for self-supervised learning of language representations[J]. arXiv preprint arXiv:1909.11942, 2019.

[9]  Clark K, Luong M T, Le Q V, et al. Electra: Pre-training text encoders as discriminators rather than generators[J]. arXiv preprint arXiv:2003.10555, 2020.