CS224N Natural Language Processing with Deep Learning Lecture 11
课程主页: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好,但是计算速度很快。