CNN(Convolutional Neural Network)卷积神经网络在图像处理方面应用很多,这一讲来看看CNN在NLP中的应用。
之前的RNN系统中(不利用Attention的情况下),通常我们用最后的hidden vector来表示整个句子的所有信息,这就造成了信息的瓶颈。而CNN处理的思路是对于所有的子短语,都计算一个特征向量,最后再根据具体的任务将它们结合在一起。
那么,什么是卷积操作呢?对于一维向量
对于NLP,可以看做是二维向量的情况。假设我们输入的每个word vector
所选取的卷积核维度为3x4,窗口大小为h=3。
卷积操作的输出为n-h+1=5的向量。
可以看到,输出相较于输入少了h-1的大小,如果想要维持其原大小(这样可以使我们建立更深的神经网络,否则经过若干层CNN后维度就变为1无法继续加深了),我们需要对输入进行padding,即补上h-1个零向量,如下图所示。
经过padding后,输出向量大小仍为7:
当然,我们也可以有多个不同的卷积核,分别代表不同特征的提取,它们的维度也可以不同,分别代表unigram, bigram,trigram, 4-gram等的提取。
CNN中还有常用的操作是pooling,其作用是利用附近元素的统计信息来代替其原有的值,其目的是可以使结果在对于输入的小量改变的干扰下保持稳定,常用的有max pooling(选择最大值), average pooling(平均值),k-max pooling(与max pooling类似,但是选择k个最大的值)等。
另外值得一提的是,对于较深的CNN,通常用Batch Normalization来进行优化,关于Batch Normalization,可参考这篇总结:
川陀学者:Batch Normalization深度学习第八章(二)zhuanlan.zhihu.com当我们用CNN提取出特征向量后,就可以将其输入到其他与任务相对应的函数中,例如对于分类问题,就可以将特征向量到softmax layer 中。
至此,我们可以总结一下之前的各种模型与适用场景:
- Bag of words:对于分类问题可以提供一个很好的基础模型,可以在其后添加若干层deep layer进一步改善效果。
- Window model:对于不需要有很长的上下文的分类问题适用,如POS(Part of speech), NER(Named Entity Recognition)等问题。
- CNN:对于分类问题效果较好,且适合并行计算。
- RNN:由于仅利用最后一个特征向量,对于分类问题不一定效果很好,且无法并行计算。但是对于语言模型更为适用,因为包含更多的顺序信息,而且与Attention机制结合效果会更好。
我们能够将RNN的对上下文信息的利用与CNN的并行计算快速的优点结合起来呢?一个这方面的研究是QRNN(Quasi RNN)。
其基本思路是在RNN中,特征提取用LSTM,t时刻的计算需要依赖于t-1时刻的值所以无法并行计算,在QRNN中,我们将特征提取用convolution操作代替,即candidate vector, forget gate, output gate均用卷积来代替:
为了利用上下文信息,QRNN将CNN中的pooling layer用dynamic average pooling来替换:
这样,大部分的特征提取发生在convolution layer,而顺序计算仅发生在较为简单的pooling layer中,可以极大的提高计算效率,其整体结构可由下图简要表示:
之后的讲座中,我们还会看到仅依赖于Attention机制的Transformer模型,也是希望于解决RNN中的顺序计算瓶颈而采用并行计算的方法。
参考资料
第十一讲讲义http://web.stanford.edu/class/cs224n/slides/cs224n-2019-lecture11-convnets.pdf
补充材料http://web.stanford.edu/class/cs224n/readings/cs224n-2019-notes08-CNN.pdf
第十一讲视频https://youtu.be/EAJoRA0KX7I
QRNN论文 https://arxiv.org/abs/1611.01576