本文来自:易盾实验室
在深度学习技术兴起之前相当长的一段时间内,基于机器学习技术的文本分类方法占据着文本分类领域的统治地位。
如下图所示,特征工程 + 机器学习分类器一直是解决文本分类问题的标准范式。针对不同的业务场景,算法工程师需要精心设计相应的特征工程,以取得最佳的分类效果。
][2]
到 2010 年,深度学习技术逐渐兴起,文本分类领域的技术格局也相应的发生了变化。基于深度学习的文本分类方法打破了上述技术范式,对文本进行简单预处理后,直接喂给深度学习模型,进行端到端的训练和推断。一般性的,用于文本分类的深度学习模型最后一层为 softmax 层(多标签问题则为 sigmoid),这相当于机器学习分类器中的 LR 模型。由此可见,模型的其余部分本质上就是在自动学习文本的特征表示,因此算法工程师再也不用操心特征工程的事情了。不过先别高兴得太早,文本特征学得好不好,取决于具体的深度学习模型结构设计和超参数设置,工程师们还是得把省下来的时间花在模型结构和超参数的调整上面。
本文根据易盾文本算法团队在内容安全领域的实践经验,介绍在项目中用过的一些深度学习模型以及对部分技术细节进行讨论。深度学习是近几年来的热门方向,学术界和工业界的研究人员提出了很多有价值的方法,本文所分享的方法只是其中少数代表性的工作,仅供读者参考。
CNN
使用 CNN 来做文本分类最早见于 2014 年 Convolutional Neural Networks for Sentence Classification”这篇文章当中。CNN 模型现在已经是做文本分类的经典模型,综合考虑模型效果、计算开销、计算并行化等因素,CNN 模型往往具备不错的竞争力。有学者表示,CNN 模型之所以能够获得较好的分类效果,与卷积核的使用有关。不同 size 的卷积核,对文本在不同位置进行卷积计算,相当于提取不同的 n -gram 特征,这有助于模型的最终分类。
上图是一个典型的单层 CNN 模型结构。首先将文本转化成词向量矩阵,然后分别使用不同 size 的的卷积核对矩阵进行卷积,每组卷积输出多个 feature map,然后进行 max pooling 后,把所有 feature map 拼接在一起,形成单个向量表示,最后加上一层全连接和 softmax 操作,输出分类分数。
图中只是一个示例,各类超参数都比较小,在实际使用过程中,词向量大小 50 以上,卷积核的 size 一般取 2~7,每个卷积的 feature map 数量在几十到几百。另外 max pooling 也可以换成其它的 pooling 方法,比如 average pooling,不过总体来说还是 max pooling 比较适合分类场景。正常情况下,通过超参数的调优,单层 CNN 模型已经能够适用大多数文本分类场景。但也有人使用多层 CNN 模型的,我们的经验是参数数量差不多的前提下,多层 CNN 未发现有明显的效果提升。
RNN
RNN 模型主要用于处理序列数据,而文本天然的就是表示成若干词的序列,因此使用 RNN 模型来对文本进行建模是十分自然的事情。与全连接或卷积网络不同,RNN 内部不同词对应的隐藏层相互之间是有联系的:当前词的隐藏层的输入除了输入层的输出,还包括前一个词的隐藏层的输出。
当序列长度较长时,基础的 RNN 模型存在梯度爆炸和梯度消失问题。LSTM 和 GRU 是 RNN 的两种改良版本,它们通过门的机制对 RNN 中信息的传播进行控制,缓解了 RNN 的梯度消失问题(RNN 梯度爆炸问题可以通过 gradient clipping 技术进行解决)。从图中可以看出,GRU 与 LSTM 结构比较相似,主要不同之处在于 GRU 使用更新门来对 LSTM 的输入门和遗忘门进行简化。
由于 RNN 最后一个词的输出已经融合了前面词的信息,RNN 用于文本分类时一般取最后一个词的输出作为整个文本的特征表示,即用最后的输出加上全连接和 softmax 计算分类分数。当然,一般我们会使用多层 RNN 的结构,用最后一个词的末层 RNN 的输出计算分类分数。
RNN 的数据流动是单向的,只能从前往后或从后往前。Bi-RNN 对此进行了改进,具体做法是使用前向 RNN 和后向 RNN,把文本中最后一个词的前向 RNN 输出和第一个词的后向 RNN 输出拼接在一起,作为文本的特征表示。从我们的实践经验上看,Bi-RNN 的这种改进效果提升很明显,我们知道 attention 对模型有较大的提升作用,但在某些业务场景里面 attention 对 Bi-LSTM 的提升比较有限,这说明 Bi-LSTM 自身的效果已经比较接近问题本身的理论上限。
RCNN
RCNN 也是早期深度学习技术应用于文本分类上面经常用到的模型之一。RCNN 为每个词定义了 left context 和 right context 两个变量,具体计算方式如下:
最终每个词由自身的词向量和两个 context 拼接共同表示,然后先接一层全连接层,再作 max pooling 形成单个的向量。这个模型为什么叫 RCNN(Recurrent Convolutional Neural Networks)呢?首先,从 left context 和 right context 的定义可以看出这部分其实就是一个双向的 RNN,只不过最后还拼接上原始的词向量。另外,这里并没有只取最后一个词的输出计算分类分数,而是对每个词的输出进行全连接再作 max pooling。其实,这里的全连接等价于进行 size 为 [1,emb_size] 和 strip 为 1 的二维卷积操作,后面再跟着 max pooling,这就是典型的 CNN 结构。
Attention
Attention 机制被广泛使用在自然语言处理、图像识别及语音识别等各种不同类型的深度学习任务中,是深度学习技术中最值得关注与深入了解的核心技术之一。Attention 机制可以理解成给定 Q,从一系列 K - V 键值对中计算出各个 V 的权重,然后再对 V 进行加权平均。具体公式如下:
其中 f 函数对 Q 和 K 进行打分,可以有不同的实现方式,常见的有点积、缩放点积、加性、双线性等方法,我们也可以自己实现其它的计算方法。
我们注意到上述 attention 的计算涉及到 Q、K、V 三个输入,当 Q = K 时,这样的 attention 技术被称为 self-attention。实际上,self-attention 是目前用得最多的 attention 技术,它不需要额外的数据,只根据文本自身的上下文,就能计算文本中各个词的重要性。可以看出,attention 本质上就是算各个词的权重,然后进行加权平均。而我们知道在 word2vec 问世以后,在怎么把多个词的词向量变成单个向量来表示句子的问题上,有一种做法就是加权平均,比如根据 tf-idf 加权平均。那么 attention 和这种加权平均的区别是什么?最本质的不同就是同一个词,普通的加权平均方法权重是固定不变的(最多乘以词频系数),attention 方法的权重是根据上下文动态计算的,在不同的文本和不同的位置,它的权重都是不一样的。这就像人类的视觉注意力,看到不同的图像时重点关注的区域不一样,所以我们把这个技术叫做 attention。同一个词在不同的上下文中得到不同的输出,这种特性使得 attention 方法天然的般配 NLP 中的一词多义问题。
具体到文本分类模型,attention 的使用比较灵活,既可以单独使用 attention 进行分类,也可以和 CNN、RNN 等模型结合。目前常见的模型有 transformer、HAN、RNN+attention、CNN+attention、Bi-RNN+attention 等等,这里不再展开赘述。
FastText
FastText 是 Facebook 在 2016 年开源的一个轻量级文本表示和文本分类工具。它的特点是在具有媲美当时复杂深度神经网络模型文本分类准确率的同时,训练和预测非常高效,CNN 训练 1 天的数据,FastText 只要几秒即可。
FastText 之所以这么高效,主要有三个原因。第一,模型结构特别简单,对文本所有单词的 embedding 求平均然后加上 softmax 分类器。第二,这个 softmax 分类器是一个层次 softmax 分类器,这个在分类类别很多的时候比较有用。第三,FastText 使用 C ++ 实现的,并且作者代码能力也非常强,因此虽然有很多复现版本,但都没有原版高效。
尽管模型结构简单,FastText 使用了 n -gram 和 subword 两种技术,帮助提升了文本分类效果。n-gram 有助于模型捕捉文本局部的单词顺序,而大部分文本分类任务并不需要太长的依赖关系。subword 也叫 char n-gram,就是把单词分解更小的子串片段,这能更好的对未登录词和稀有词进行建模,同时学习到相同词缀单词语义关系。
总的来说,FastText 适用于对精确度要求不高同时需要较高实时性的文本分类场景,也可以作为新算法的一个 baseline。
Bert
BERT 是谷歌在 2018 年发布的一个预训练语言模型,它刷新了 11 个 NLP 任务的记录。BERT 的发布使得 NLP 领域真正进入到了基于通用预训练模型进行下游任务的时代,同时也进入了大力出奇迹的时代——通过更多的数据、更大的模型获得更高的准确率,从此以后各家科技巨头推出的模型越来越大,训练用的数据也越来越多,简直就是在炫富。其实在 BERT 之前也有很多预训练语言模型的研究,像 ELMo、GPT 都是当时比较突出的成果,它们的很多思路和方法都被 BERT 借鉴了。
相比前辈们,BERT 之所以引起这么大的关注,主要在于它的效果确实很惊艳,同时在多个 NLP 任务上面刷新记录,并且提升幅度都还挺大的。更重要的是,BERT 用在这些任务上面并不需要精心设计下游网络,基本上都是接一个简单的预测结构,然后简单地 fine-tuning 一下就 OK 了。
BERT 模型结构本身并不复杂,主要分为 3 个部分:最底层是 embedding 组件,包括词、位置和 token types 三种 embedding 的组合;中间层是由多个 Transformer encoder 组成的深度网络(base 版本是 12 层,large 版本是 24 层);上层是与训练任务相关的组件,主要就是 softmax 网络。BERT 模型比较重要的创新有两方面,分别是 Masked LM 和 Next Sentence Prediction(NSP)。Masked LM 用 [MASK] 替换句子中的部分单词,模型的目标是预测 [MASK] 位置上的真实单词。
Masked LM 技术的引入让 BERT 模型变成了自编码语言模型,它的优化目标不是最大化句子的似然函数,而是最大化 mask 部分的联合条件概率,因此 BERT 模型可以使用双向 Transformer,使用前后上下文信息对当前词进行预测。
在 BERT 之前的语言模型都是没法做到真正双向的,这算是一个比较大的改进。NSP 任务的引入让 BERT 模型能够更好的学习到句子层面上的整体语义。在 NSP 任务中,模型的输入是一个句子对(确切地讲是片段对,每个片段可能包含一个以上的句子),目标是预测输入的句子对是否是原文中连续的两个句子。训练数据 50% 来自语料中抽取的真实连续句子对,另外 50% 就是从语料中随机组合的。训练的时候模型的优化目标是最小化 Masked LM 和 NSP 的组合损失函数。
BERT 模型用在文本分类过程也比较简单,模型输入就是单个文本,这里不需要对单词进行 mask,也不用组成句子对,输出使用第一个词的输出作为文本的向量表示,然后接 softmax 网络。我们的实验结果表明 BERT 模型是本文介绍的所有方法中表现最好的,目前已经应用在线上部分复杂的业务场景中。
总结
本文只是介绍了易盾文本内容安全业务中用到的几种深度学习方法,实际上,网易易盾的内容安全服务包括文本检测、图片检测、视频检测、音频检测、人工审核和智能审核系统等产品,以及广告合规、网站内容检测、文档内容检测、历史数据清洗、音视频、社交娱乐、政企、媒体等解决方案。目前对外提供的内容安全服务已经升级为第三代人工智能技术,提供涉黄、涉政、暴恐、广告等十几大类上千小类的有害内容智能识别过滤服务,识别精准率超过 99.8%。
上述所总结的,是目前业界解决文本分类问题的主流方法。如果使用固定的 benchmark 语料集进行评测,这些模型在准确率指标上面确实表现出一定的差异和优劣。但具体到文本内容安全的业务场景,我们很难得出哪个模型表现最好这样的结论。
在实际使用中,需要根据不同场景的文本特点,同时考虑样本规模、词汇量大小、处理时间、模型参数规模等各种因素,选择适当的模型。实际上,模型的作用是次要的,决定最终效果的关键因素是语料库的构建,有了规模足够大的高质量语料库,哪怕模型简陋一点,效果也是要好于复杂模型的。而语料库的构建是一项长期的工作,需要明确各种违规类别的标准并进行细分,清晰具体的标准是标注高质量语料库的前提。同时还要不断投入人力,收集和标注样本,让语料库的样本尽量覆盖到不同类型的数据。
此外,真实的文本内容安全系统也不是几个模型就能搞定的,它是一套成熟的解决方案,使用丰富的检测手段分别覆盖不同的场景,保证较高的检测率。
参考文献
https://www.aclweb.org/anthology/D14-1181
http://www.wildml.com/2015/11/understanding-convolutional-neural-networks-for-nlp/
https://medium.com/@saurabh.rathor092/simple-rnn-vs-gru-vs-lstm-difference-lies-in-more-flexible-control-5f33e07b1e57
https://www.aaai.org/ocs/index.php/AAAI/AAAI15/paper/download/9745/9552
https://arxiv.org/pdf/1706.03762.pdf
https://arxiv.org/pdf/1810.04805.pdf