Abstract
作者在句子级的分类任务上做了一系列基于预训练词向量的CNN实验。
实验结果说明了:
- 一个简单的(单层神经网络)、有一点超参数的调节(Filter的个数)和static word vector的CNN模型在多个benchmarks上效果都很好。
- 通过微调学习特定任务的向量(task-specific
vectors)可提升性能。
作者还提出了一个架构上的简单修改来允许task-specific vector和static vector。
non-static就是词向量随着模型训练变化,这样的好处是词向量可以根据数据集做适当调整。
static就是直接使用word2vec训练好的词向量即可。
1 Instruction
深度学习在机器视觉和语音识别上有很多成果。在NLP领域,深度学习会涉及到用神经网络来学习词向量。
词向量本质上是对词语的语义特征进行维度编码的特征编码器。
这部分就讲了讲词向量、CNN在NLP中的应用,本文的模型,都是概述。
2 Model
一个句子是由多个词拼接而成的,如果一个句子有 n n 个词,且第i个词表示为xi x i ,词 xi x i 通过embedding后表示为k维的向量,即 xi∈Rk x i ∈ ℜ k ,则一个句子 x1:n x 1 : n 为 n∗k n ∗ k 的矩阵,可以形式化如下:
X1:n=x1⊕x2⊕⋯⊕xn X 1 : n = x 1 ⊕ x 2 ⊕ ⋯ ⊕ x n
一个包含
h h 个的词的词窗口表示为:
Xi:i+h−1∈Rhk X i : i + h − 1 ∈ ℜ h k
一个filter是大小为
h∗k h ∗ k 的矩阵,表示为:
W∈Rhk W ∈ ℜ h k
通过一个filter作用一个词窗口提取可以提取一个特征
ci c i ,如下:
ci=f(W⋅Xi:i+h−1+b) c i = f ( W ⋅ X i : i + h − 1 + b )
其中,
b∈R b ∈ ℜ 是bias值,
f f 为激活函数如Relu等。
卷积操作:通过一个filter在整个句子上从句首到句尾扫描一遍,提取每个词窗口的特征,可以得到一个特征图(feature map)
c∈Rn−h+1 c ∈ ℜ n − h + 1 ,表示如下(这里默认不对句子进行padding):
c=[c1,c2,…,cn−h+1] c = [ c 1 , c 2 , … , c n − h + 1 ]
池化操作:对一个filter提取到的feature map进行max pooling,得到
c^∈R c ^ ∈ ℜ 即:
c^=max(c) c ^ = m a x ( c )
若有
m m 个filter,则通过一层卷积、一层池化后可以得到一个长度为
m m 的向量
z∈Rm z ∈ ℜ m :
z=[c^1,c^2,…,c^m] z = [ c ^ 1 , c ^ 2 , … , c ^ m ]
最后,将向量
z z 输入到全连接层,得到最终的特征提取向量
y y (这里的
W W 为全连接层的权重,注意与filter进行区分):
y=W⋅z+b y = W ⋅ z + b
在一个模型变种中,作者进行了两个“通道”词向量的实验,一个在训练中保持静止,一个通过BP微调。
在多通道的结构中,每一个filter都应用在两个通道上并且结果相加来计算 ci c i 。
2.1 Regularization
3 Datasets and Experimental Setup
- MR:电影评论,正负面评价
- SST-1:更细颗粒标签的MR
- SST-2:无中立评价、binary labels的SST-1
- Subj:把句子分为主观和客观
- TREC:与人、位置、数字信息相关的6分类问题
- CR:对商品的正负面评价
- MPQA:Opinion polarity detection subtask
of the MPQA dataset
3.1 Hyperparameters and Training
超参数通过在SST-2上的网格搜索设置
- Activation function(f f ): rectified linear units (ReLu)
- Filter windows( h h ): 3,4,5 with 100 feature maps each
- Dropout rate(p p ): 0.5
- L2 constraint( s s ): 3
- Mini-batch size: 50
- Dev set: randomly select 10% of the train data (for datasets without a standard dev set)
- Optimizer: stochastic gradient descent(SGD) over shuffled mini-batches with the Adadelta update rule
3.2 Pre-trained Word Vectors
- Pre-trained words : word2vec vectors from Google News
3.3 Model Variations
- CNN-rand:words随机初始化
- CNN-static:预训练词向量(word2vec)进行初始化,在训练过程中固定
- CNN-non-static:预训练词向量进行初始化,在训练过程中进行微调
- CNN-multichannel(多通道):将固定的预训练词向量和微调的词向量分别当作一个通道(channel),卷积操作同时在这两个通道上进行,可以类比于图像RGB三通道。
4 Results and Discussion
- MR:CNN-non-static 81.5
- SST-1: Paragraph-Vec (Le and Mikolov, 2014), 48.7
- SST-2:CNN-multichannel 88.1
- Subj : MNB (Wang and Manning, 2012) F-Dropout (Wang and Manning, 2013), 93.6
- TREC: SVMS (Silva et al., 2011) 95.6
- CR:CNN-multichannel 85.0
- MPQA:CNN-static 89.6
4.1 Multichannel vs. Single Channel Models
虽然作者一开始认为多通道可以预防过拟合,从而应该表现更高,尤其是在小规模数据集上。但事实是,单通道在一些语料上比多通道更好;
4.2 Static vs. Non-static Representations
在大部分的语料上,CNN-non-static都优于CNN-static,一个解释:预训练词向量可能认为‘good’和‘bad’类似(可能它们有许多类似的上下文),但是对于情感分析任务,good和bad应该要有明显的区分,如果使用CNN-static就无法做调整了.
4.3 Further Observations
- 其他相似结构的CNN没有本文中的模型表现好;
- Dropout可以提高2%–4%性能(performance);
- 对于不在预训练的word2vec中的词,使用均匀分布U[−a,a] U [ − a , a ] 随机初始化,并且调整 a a 使得随机初始化的词向量和预训练的词向量保持相近的方差,可以有微弱提升;
- 可以尝试其他的词向量预训练语料,如Wikipedia[Collobert et al. (2011)]
- Adadelta(Zeiler, 2012)和Adagrad(Duchi et al., 2011)可以得到相近的结果,但是所需epoch更少。
5 Conclusion
略。
作者本人的实现代码(基于Theano):https://github.com/yoonkim/CNN_sentence
Denny Britz的基于TensorFlow的实现代码:https://github.com/dennybritz/cnn-text-classification-tf
Denny本人的代码讲解:http://www.wildml.com/2015/12/implementing-a-cnn-for-text-classification-in-tensorflow/
其他人的基于TensorFlow的实现代码的讲解:论文Convolutional Naural Networks for Sentence Classification–TensorFlow实现篇