课程主页:https://web.stanford.edu/class/archive/cs/cs224n/cs224n.1194/

视频地址:https://www.bilibili.com/video/av46216519?from=search&seid=13229282510647565239

这里回顾CS224N Lecture 11的课程内容,这一讲主要介绍了CNN在NLP中的应用。

备注:图片均来自课程课件。

From RNNs to Convolutional Neural Nets

RNN很难捕捉词组信息,但是CNN可以捕捉词组信息,这便是在NLP中使用CNN的原始思想。

卷积定义

1维离散卷积
2维卷积

A 1D convolution for text

将句子中每个单词的词向量拼接起来组成矩阵(可以填充0),然后对其使用卷积,一个例子如下:

可以增加滤波器,得到如下结果:

对卷积的结果使用池化操作可以起到降采样的作用:

还可以将CNN中的stride设置为非$1$值:

以及局部池化层:

还可以使用k-max池化操作:

最后介绍跳跃卷积,即对不是相邻的部分进行卷积操作,例如:

Single Layer CNN for Sentence Classification

  • 使用一个卷积层和池化层

  • 词向量:$\mathbf{x}_{i} \in \mathbb{R}^{k}$

  • 句子:$\mathbf{x}_{1: n}=\mathbf{x}_{1} \oplus x_{2} \oplus \cdots \oplus \mathbf{x}_{n}$(拼接)

  • 一定范围内的单词拼接结果:$\mathbf{x}_{i: i+j}$

  • 卷积层$\mathbf{w} \in \mathbb{R}^{h k}$

  • 计算特征

    其中能够计算的部分为

  • 最终的结果如下

  • 可以利用池化操作计算出一个结果

  • 使用不同的卷积可以得到不同的结果,将这些结果拼接即可的输入特征

来看一个具体例子,注意实际中需要填充0:

为了让词向量适应特定问题,可能要对词向量进行训练,于是产生如下方法:

Multi-channel input idea
  • 使用预训练的单词向量(word2vec或Glove)进行初始化
  • 从两份开始
  • 对其中一份进行反向传播,保持另一份“静态”
  • 在最大池化之前将两个结果都添加进$c$

最终利用之前介绍的方法生成特征

最后使用softmax函数产生分类结果

Regularization

神经网络中为了解决过拟合,要使用正则化方法,一种是dropout,还有一种是$l_2$正则化。

Model comparison: Our growing toolkit

  • Bag of Vectors:简单分类问题的baseline。效果不错,特别是使用一些ReLU层! (请参阅论文:深度平均网络)
  • Window Model:适用于不需要广泛上下文的问题的单个单词分类。 例如POS,NER。
  • CNN:适用于分类,对于很短的短语需要零填充,难以解释,易于在GPU上并行化。 高效通用。
  • Recurrent Neural Networks:认知上合理(从左到右读取),不是最适合分类(如果仅使用最后一个状态),比CNN慢得多,对序列标记和分类有好处,对语言模型很有用,在注意力机制上会很惊人。

一些其他的内容

课程中还简单提到一些其他的内容,例如残差块,残差块是为了解决梯度消失的问题;还有BatchNorm,可以让网络对参数的初始值依赖减少;最后是1 x 1 Convolutions,1维卷积可以减少通道数量。

课件中介绍了一些网络结构,这里回顾深层网络的模型

Very Deep Convolutional Networks for Text Classification

卷积块如下:

Quasi-Recurrent Neural Network

QRNN是为了结合CNN和RNN的优点,其网络架构如下:

计算公式由

变成:

利用池化层计算隐藏状态

QRNN在效果上不一定比RNN好,但是计算速度很快。