CNN文本分类任务指南

最近因为比赛的缘故对文本分类有一定的了解。其中使用CNN方法做情感分析任务存在着许多优势。虽然模型简单,但如何设置超参有时候对结果有很大的影响。本文记录了关于CNN文本分类的一些学习历程和指南,基本参考了论文。

做法

基本上目前较为浅层的CNN文本分类的做法都是如下图:

将词向量堆积成为二维的矩阵,通过CNN的卷积单元对矩阵进行卷积处理,同时使用pooling(通常是1max-pooling)操作,将不等长的卷积结果变为等长,对不同的卷积单元的结果进行拼接后生成单个向量,最后再通过线性层转化成类别概率分布。

另一张图也说明了该流程。

建议与指导

超参及其对结果的影响

接下来的内容参考了论文A Sensitivity Analysis of (and Practitioners’ Guide to) Convolutional
Neural Networks for Sentence Classification

CNN文本分类的超参:

  • 输入向量
  • 卷积大小
  • 输出通道(feature maps)
  • 激活函数
  • 池化策略
  • 正则化

输入向量的影响

实验表明,使用word2vec和GloVe不分伯仲,但将word2vec和GloVe简单拼接在一起并不能带来提升。

unfortunately, simply concatenating these representations does necessarily seem helpful

当句子长度很长(document classification)时,使用one-hot可能会有效果,但在句子长度不是很长时,效果不好。

建议

对于新任务,可以word2vec或GloVe或者其他词向量都试一下,如果句子长,可以试着使用one-hot。

卷积大小

由于卷积的长度是固定的,也就是词向量的长度,因此只需讨论宽度。
实验表明,不同的数据集会有不同的最佳大小,但似乎对于长度越长的句子,最佳大小有越大的趋势。

However, for datasets comprising longer sentences, such as CR (maximum sentence length is 105, whereas it ranges from 36-56 on the other sentiment datasets used here), the optimal region size may be larger.

同时,当增加不同卷积大小作为组合时,如果组合的卷积核大小接近于最佳大小(optimal region size),有助于结果的提升;相反,如果卷积核大小离最佳大小很远时,反而会产生负面影响。

建议

首先试着找到最优的卷积核大小,然后在这个基础上添加和该卷积核大小类似的卷积核。

feature maps

也就是输出通道(out channel),表明该卷积核大小的卷积核有多少个。

实验表明,最佳的feature maps和数据集相关,但一般不超过600。

it would seem that increasing the number of maps beyond 600 yields at best very marginal returns, and often hurts performance.

建议

在600内搜索最优,如果在600的边缘还没有明显的效果下降,那么可以尝试大于600的feature maps。

激活函数

实验结果:

结果表明,tanh、ReLU和不使用激活函数效果较好。tanh的优点是以0为中心,ReLU能够加速拟合,至于为什么不使用的效果会好,可能是因为模型较为简单:

This indicates that on some datasets, a linear transformation is enough to capture the
correlation between the word embedding and the output label.

建议

使用tanh、ReLU或者干脆不使用。但如果模型更为复杂,有多层的结构,还是需要使用激活函数的。

pooling策略

所有的实验都表明了,1-max pooling的效果比其他好,如k-max pooling。在pooling这一步可以直接选择1-max pooling。

This may be because the location of predictive contexts does not matter, and certain n-grams in the sentence can be more predictive on their own than the entire sentence considered jointly.

正则化

主要是dropout和l2 norm constraint。
dropout就是随机将一些神经元置为0,l2 norm constraint是对参数矩阵W进行整体缩放,使其不超过一定阈值。(与通常的l2 regularization不同,最早可追溯到Hinton的Improving neural networks by preventing
co-adaptation of feature detectors

the l2 norm of a weight vector is linearly scaled to a constraint c when it exceeds this threshold, so a smaller c implies stronger regularization

实验表明,dropout起的作用很小,l2 norm没有提升甚至还会导致下降。可能是因为模型参数不多,因此过拟合的可能性较低。

建议

设置较小的dropout和较大的l2 norm,当feature maps增大时,可以试着调节较大的dropout以避免过拟合。

建议及结论

  • 刚开始的使用使用word2vec或者GloVe,如果数据量够大,可以尝试one-hot
  • 线性搜索最佳的卷积核大小,如果句子够长,那么可以扩大搜索范围。一旦确定了最佳卷积核大小,尝试在该卷积核大小的附近进行组合,如最佳卷积核宽度是5,那么尝试[3,4,5]或者[2,3,4,5]等
  • 使用较小的dropout和较大的max norm constraint,然后在[100,600]范围内搜索feature maps,如果最佳的feature maps在600附近,可以试着选择比600更大的范围
  • 尝试不同的激活函数,通常tanh和ReLU是较好的,但也可以尝试什么都不加。
  • 使用1-max pooling。
  • 如果模型复杂,比如feature maps很大,那么可以尝试更为严格的正则化,如更大的dropout rate和较小的max norm constraint。

Reference

Convolutional Neural Networks for Sentence Classification

A Sensitivity Analysis of (and Practitioners’ Guide to) Convolutional
Neural Networks for Sentence Classification