当前位置:   article > 正文

文本分类模型_几个可作为Baseline的文本分类模型

文本分类大模型

ed77a25091d7868042aa651aff825556.png

前言

最近,从TensorFlow 迁移至 Pytorch, 所以诞生了这个仓库:NLP-Pytorch, 里面实现了一些文本分类的模型与阅读理解的模型。

我认为文本分类任务对初学者是最友好的,且企业中大多数都是都需要文本分类, 很多情况下你去了公司实习,做文本分类的可能性极大。本文对几个经典的文本分类模型进行总结,具体的实现可参见仓库, 考虑到 Bert 的诞生, 词向量可能会退出舞台,因此,只实现了这几大基本模型,后续的可能要在 Bert 上做文章了。

TextCNN[1]

4fccaecc3d70dd80497564ed7dd9a909.png

表示一个第
个词其
维的词向量表示, 对于一个长度为
的句子,有:
, 我们通过对向量矩阵
进行卷积操作来提取特征, 其中,
表示第
个词到第
个词,共
个词。

对于一个窗口大小为

的卷积核, 其 shape 为
, 其提取特征的过程为:

1个卷积核对

一次卷积的过程需要对
分别进行卷积操作, 我们得到最终的特征表示:

然后,文章对特征向量

采用最大池化操作来提取最重要特征:

上述的过程描述的是一个卷积核对

提取特征的过程,而实际中,我们往往要采用多种窗口大小的卷积核,且每种窗口的卷积核有很多个,这里假设卷积核的窗口大小为 3, 4, 5, 卷积核的shape分别为
, 其对应的卷积核数量为

对于窗口大小为 3 的卷积核, 我们在一次卷积过后获得一个

的矩阵, 然后对该矩阵进行最大池化得到一个
的向量, 该向量就是窗口为3 的卷积核所提取的全部特征。

同样的道理,窗口为 4 的卷积核所提取的特征为一个

的向量, 窗口为 5 的卷积核所提取的特征为一个
的向量。

最后我们将这三个向量拼接起来形成一个

的向量, 然后将该向量送入输出层:

原论文在输出层添加了 Dropout 与 L2 正则化操作,不同数据集具体的情况还需要具体分析。

  1. Relu , fileter sizes = [345], filter nums = 100, dropout = 0.5, L2 <= 3, batch size = 50
  2. embeddding = word2vec

论文中比较了四种 Embedding 方式:

  • CNN-rand: 随机初始化,且参与训练
  • CNN-static: 采用word2vec词向量,且这些词向量不参与训练。
  • CNN-non-static:采用word2vec词向量,这些词向量参与训练, 推荐。
  • CNN-multichannel: 采用两套词向量构造出的句子矩阵作为两个通道,在误差反向传播时,只更新一组词向量,保持另外一组不变。 文章中两套词向量都采用 word2vec。

对TextCNN 的分析 [3]

文章 [3] 对CNN 用于文本分类时的超参进行分析,这些超参包括: 词向量的选择,Filter 的大小, 卷积核的数量, 激活函数的选择, Pooling 策略, 正则化方法。

Word Embedding

文章比较了三种情况: Word2vec, Glove, Word2vec + Glove, 而实际上,三者的性能相差无几, 具体的依旧要看任务数据集,并没有定论,因此在实际的开发中,分别采用不同的预训练词向量来帮助我们更好的选择。

Filter Size

不同的数据集有其适合的 Filter Size, 文章建议区域大小为 1-10 内进行线性搜索, 但如果数据集中的句子长度较大(100+), 那么可以考虑设置较大的 Filter Size。

不同size的 Filter 进行结合会对结果产生影响,当把与最优 Filter size 相近的Filter 结合时会提升效果,但如果与较远的Filter 结合会损害性能。因此,文章建议最初采用一个 Filter , 调节 size 来找到最优的 Filter size, 然后探索最优Filter size的周围的各种 size 的组合。

卷积核数量

对于不同的数据集而言,卷积核的设置也有所不同,最好不要超过600,超过600可能会导致过拟合, 推荐范围为100-600。同时,卷积核数量增多,训练时间会变长,因此需要对训练效率做一个权衡。

激活函数

尽量多尝试激活函数, 实验表明,Relu, tanh 表现较佳。

Pooling 策略

实验分析得出, 1-max pooling 始终优于其他池化策略,这可能是因为在分类任务中,上下文的位置并不重要,且句子中的 n-granms 信息可能要比整个句子更具预测性。

正则化方法

实验表明,在输出层加上L2正则化并没有改善性能,dropout是有用的,虽然作用不明显,这可能是因为参数量很少,难以过拟合的原因所致。文章建议不要轻易的去掉正则化项,可以将 dropout 设置为一个较小值 (0-0.5),推荐0.5 , 对于L2, 使用一个相对较大的约束。 当我们增加卷积核数量时,可能会导致过拟合,此时就要考虑添加适当的正则项了。

交叉验证

为了检验模型的性能水平,多次反复的交叉验证是有必要的,这可以确保模型的高性能并不是偶然。

TextRNN

774803eddb42331ad65e4f9aee3b0945.png

以双向LSTM 或GRU来获取句子的信息表征, 以最后一时刻的 h 作为句子特征输入到 softmax 中进行预测, 很简单的模型,就不详细介绍了。

TextRCNN [4]

说实话,这篇论文写的真乱,一个很简单的思想,看起来比 Transformer 还复杂,真的是有点醉, 不推荐看原论文,写的真的很冗余。

文章的思想很简单:

  • 首先,对于单词
    , 获得其词向量表示
  • 然后, 采用双向 GRU 来获取每个词的上下文向量表示
  • 为了更好的表示词的信息,文章将原始词向量
    , 上下文表示
    结合起来,形成词的新的向量表示,这里作者采用一个全连接网络来聚合这些信息:

  • 采用最大池化来获取句子的最终表示:

  • 最后,采用一个softmax 来做分类:

HAN [5]

71da5dfd671786cbecf7978669f7b486.png

问题定义

HAN 主要针对 document-level 的分类, 假定document 中有L个句子:

, 对于句子
, 其包含有
个单词:

Word Encoder

对于一个句子

,文章采用词向量矩阵将其做 Embedding, 然后采用双向 GRU 来获得该句子的上下文表示, 以第
个句子中的第
个单词为例:

Word Attention

考虑到在每个句子中,各个词对句子信息的贡献不同,因此此处引入一个注意力机制来提取语义信息,更好的获得句子的表示。

Sentence Encoder

一个 document 中有L个句子,我们需要对这L个句子的信息进行整合,但很明显,句子之间的信息是由关联的,因此文章采用双向GRU对句子信息进行综合来获得每个句子新的表示:

Sentence Attention

考虑到在一个document中,各个句子的重要程度并不同,因此采用一个Attention 来对句子信息进行整合最终形成 document 的最终信息:

Document Classification

Model 配置

  1. Word2vec, word embedding dimension=50, 单向GRU dimension=50,
  2. batch size = 64, 句子个数相近的放到一个batch可加速训练, GGD + momentum=0.9

最后

虽然文本分类是最简单的任务,但其在企业中应用最为广泛,十分适合初学者入门学习。

Reference

[1] TextCNN: Convolutional Neural Networks for Sentence Classification

[3] A Sensitivity Analysis of (and Practitioners' Guide to) Convolutional Neural Networks for Sentence Classification

[4] Recurrent Convolutional Neural Network for Text Classification

[5] Hierarchical Attention Networks for Document Classification

[n] Large Scale Multi-label Text Classification With Deep Learning

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/677837
推荐阅读
相关标签
  

闽ICP备14008679号