Convolutional Neural Networks for NLP Classification

今天的论文来自于较老的几篇论文,使用 CNN 进行文本分类。

CNN 最早被成功运用在图像处理中,因为图像的位置不变性、大小不变性使得 CNN 处理图像再适合不过。而将 CNN 运用于文本分类流行于 2014-2015 年左右,大概处于在 NLP 被 RNN 统治的前几年,因此虽然这些论文年代已经相对比较久远,但仍然值得一读,因为通过对这些论文的阅读,还能大致了解为什么 CNN 在 NLP 领域也能取得成功,CNN 在 NLP 领域存在什么问题,以及在 NLP 领域 CNN 的使用是如何慢慢过渡到 RNN 的使用的。

Convolutional Neural Networks for Sentence Classification

这是发表在 EMNLP 2014 上的一篇 short paper,这篇文章使用多个 filter 组成的 CNN 构建了一个分类模型。

模型结构

模型的结构直接用论文中的一张图就可以比较清楚的说明。
Convolutional Neural Networks for Sentence Classification

输入的文本经过 word2vec 的 embedding 生成长度为 $k$ 的向量后,成为一个 $l \times k$ 的矩阵 $\mathbf {x}_{1;n}=\mathbf {x}_1 \oplus \mathbf {x}_2 \oplus … \oplus \mathbf {x}_l$。然后使用宽度为 $k$,长度为 $3,4,5$ 的卷积核 (filter) 对这个矩阵进行扫描。

因为卷积核的宽度和 embedding 的维度相同,因此相当于卷积核在单词的方向上滑动 (sliding window)。对于每个单独的卷积核 $h \times k$,将生成对应 $l-h+1$ 个 feature。

然后做一个 max pooling

这个 $\hat c$ 就是当前这个卷积核的特征了。这样做的一个好处是,可以使用不同长度的卷积核,因为每个卷积核最后都会生成一个 $1 \times 1$ 的特征,因此可以把这些特征拼起来,再接一个 softmax 就可以用做分类了。

实验

作者在实际训练的时候使用在全连接层使用了 dropout,另外还加了 l2 正则。实际训练的时候使用长度分别为 3, 4, 5 的卷积核,每个长度 100 个。使用的数据集基本上都是情感分类相关的,有:MR (影评,2 分类)、SST-1 (情感,5 分类)、SST-2 (情感,2 分类)、Subj (主观性,2 分类)、TREC (问题分类,6 分类)、CR (商品评价,2 分类)、MPQA (观点评价,2 分类)。

此外,作者尝试使用了不同的预训练模型组合,包括:不使用预训练模型,随机初始化 embedding、使用静态的预训练模型、训练时微调的预训练模型、以及同时结合静态和微调的预训练模型 (使用两个通道,一个通道静态,一个通道微调,卷积的时候直接相加)。最终的结论是,微调的比不微调的要好一点,但是两者结合的和微调的差不多。

总结

我认为这篇文章最有价值的贡献就在于如何把 CNN 运用到 NLP 中,作者使用了 sliding window 的方法,保持宽度不变的同时使用了不同长度的卷积核,通过一个 max pooling 可以把这些卷积核的特征拼在一起,十分巧妙。max pooling 看起来是最常用的压缩特征的方法,也有人用 average pooling 的,但是看起来还是 max pooling 效果最好?我一个不太理解的地方在于,为啥 max pooling 是最有效的呢,如果正数和负数是对称的,那我如果我用 min pooling,每次取最小的那个有没有效果呢?

Character-level convolutional networks for text classification

这篇文章发表在 NIPS 2015 上。这篇文章和上面 Kim 这篇非常类似,最大的区别在于 Kim 使用了 word2vec 作为预训练模型,而这篇直接使用 one-hot 把文本作为字符编码,直接将字符编码的矩阵作为输入,不使用任何预训练模型。另外一点不同的是,这篇文章使用了多层的卷积层,而 Kim 这篇是单层的。

模型结构

模型结构非常类似。作者使用维度为 70 的 one-hot 向量编码句子中的每一个字符,然后把它们全部拼起来。作者选取前 1014 个字符,截断多余的。拼成一个 $1014 \times 70$ 的矩阵。接下来对这个矩阵进行卷积操作,方法应该也是类似的,卷积核在矩阵上进行一维方向上的滑动。在前 2 层,使用高度为 7 的卷积核,每个卷积层后面接一个高度为 3 的 max-pooling。后面 4 层分别使用高度为 3 的卷积核,并且最后一层再接一个 max-pooling。因此对于输入长度为 1014,前 6 层后的长度变为 $(((1014-7+1)/3-7+1)/3-2-2-2-2)/3=34$,矩阵大小变为 $34 \times 70$,然后拍平成一维的向量,就可以接后面的全连接层了。

实验结果

作者对训练数据做了增强,具体就是使用一些同义词替换原来的句子,丰富训练数据。训练数据也使用了大规模的文本语料,包括 AG 新闻分类、雅虎新闻分类等等。最后实验发现,在数据规模没那么大的时候 (~50 万),n-gram+TFIDF 的表现还是最后,但在数据规模更大的情况下 (~100 万 - 300 万),作者提出的模型效果更好。

总结

这篇文章不借助任何先验知识 (预训练模型),但能比使用 word2vec 的 CNN 模型表现更好 (相差不大),一方面是由于这篇文章的使用多层的 CNN 结构,学习特征的能力更强。另一方面,使用字符级别的特征可以不去在意文本本身的语义信息,从而更好地处理通用的文本序列,甚至可以是用户自己定义的某种语言,相比借助预训练模型的网络具有更好地泛化能力。

Recurrent convolutional neural networks for text classification

这篇文章来自于 AAAI 2015。作者认为,现有的 CNN 模型受限于固定长度的窗口大小,无法很好的学习上下文,这会导致诸如一词多义,长依赖语义等问题没有办法被现有的模型学习到,为了解决这个问题,作者自己提出来了一种称之为 RCNN 的结构,虽然这篇也含有 CNN,但实际上并非广义上的 CNN,而是作者自己提出来的一种模型结构。

模型结构

本文的模型结构如下图所示。
Recurrent convolutional neural networks for text classification

作者使用 $\mathbf {c}_l (w_i)$ 和 $\mathbf {c}_r (w_i)$ 来分别表示当前单词的上文和下文,$\mathbf {e}(w_i)$ 则表示单词本身的 embedding。这样 $\mathbf {c}_l (w_i)$ 和 $\mathbf {c}_r (w_i)$ 的就可以用如下公式计算。

这样 $\mathbf {c}_l (w_i)$ 就包含了所有 $w_i$ 左边 (上文) 单词的语义信息,$\mathbf {c}_r (w_i)$ 就包含了所有 $w_i$ 右边 (下文) 单词的语义信息,这三个向量每个向量的维度都是 50,接下来只要把 $\mathbf {c}_l (w_i)$, $\mathbf {e}(w_i)$, $\mathbf {c}_r (w_i)$ 三个向量拼起来,就可以作为每个单词的语义表示了。

后面的套路就和大部分文章差不多了,每个 $\mathbf {x}_i$ 先接一个线性层,然后把 $\mathbf {x}_i$ 拼起来后用一次 max-pooling,最后再接一层全连接 + softmax 就结束了。

论文的其他部分没什么特别的创新之处,在此就不赘述了。

总结

这篇文章提出了一种新颖的 RCNN 结构,相比 CNN,RCNN 可以捕获更多的上下文语义。而相比 RecursiveNN,它可以通过 max-pooling 筛选更有价值的信息,并且构造模型的复杂度更低。这篇文章算是同时结合了 RNN 和 CNN 的优点,但我认为主要还是依靠 RNN。这篇文章也算是比较早的使用 RNN 进行文本分类的论文之一了,之后几年就开始有大量的运用 RNN/LSTM 到 NLP 的论文涌现。

最后总结

总的来说,CNN 在 NLP 领域确实取得了一定程度的成功,这一方面归功于深度学习中强大的计算学习能力,另一方面归功于 CNN 本身,将图像处理中正方形的卷积核稍作改动,使用滑动窗口的方法将卷积核沿着句子中的单词方向上滑动,这一做法本身非常符合直觉,因此确实取得了一定的效果。然而,我们也能看到 CNN 在 NLP 领域中存在的问题,比如正是由于滑动窗口的方法固定了窗口大小,使得模型效果很容易受到其影响,另外这一方法使得模型无法很好地学习单词上下文的信息,这些问题反过来也限制了模型的性能。

参考文献

  1. Kim, Y. (2014). Convolutional neural networks for sentence classification. EMNLP 2014 - 2014 Conference on Empirical Methods in Natural Language Processing, Proceedings of the Conference, 1746–1751. https://doi.org/10.3115/v1/d14-1181
  2. Zhang, X., Zhao, J., & Lecun, Y. (2015). Character-level convolutional networks for text classification. Advances in Neural Information Processing Systems, 2015-Janua, 649–657. Neural information processing systems foundation.
  3. Lai, S., Xu, L., Liu, K., & Zhao, J. (2015). Recurrent convolutional neural networks for text classification. Proceedings of the Twenty-Ninth AAAI Conference on Artificial Intelligence.

推荐阅读

  1. Understanding Convolutional Neural Networks for NLP
  2. CS224d Lecture 13: Convolutional Neural Networks (for NLP)

评论