天天看点

cs224n 笔记13 卷积神经网络

前言

cs224n 第十三讲,讲了一些CNN的知识,比较常见,内容也没有很多。

文章目录

    • 前言
    • 从RNNs到CNNs
    • 什么是卷积
    • 单层CNN
    • 池化层
    • 分类
    • dropout
    • 模型比较

从RNNs到CNNs

RNN的问题:

  • 不能捕捉到不包含上下文信息的某个单词,如下图所示,如果我只想获得 my birth 这个词组的信息,RNN是不容易做到的,因为RNN只能从左到右进行,包含了整句话的信息
    cs224n 笔记13 卷积神经网络
  • RNN过于关注最后一个单词
  • softmax也只加在最后一个单词上

    CNN解决这个问题的方法很简单,就是只计算相邻的ngram。后面会介绍CNN究竟是怎么计算的。

什么是卷积

谈卷积神经网络之前需要了解的一个概念是,这里的卷积到底是个啥?

课程中给出了一个公式,我不打算在这里写出来,因为真的不如直接看动图,清晰明了,直接上图。

cs224n 笔记13 卷积神经网络

图示的过程就是卷积,有几个需要注意的点:

1.动图中的黄色部分是一个3*3的滤波器,它的值是

[[1,0,1],

[0,1,0],

[1,0,1]]

当然,这个具体的值在真正的代码中是需要初始化并且不断更新的。

2.所谓的卷积就是滤波器和image中对应的值进行相乘,然后求和,构成feature map中一个一个的值。

3.滤波器每次移动的步长是训练时设置的参数,这里步长为1。

这里推荐一个讲解CNN的博客,对CNN进行了十分细致的讲解,而且博客中的动图也十分全面,对动图也进行了一步步的分解解释》》》》》传送门。

单层CNN

这里讲一下在NLP中的单层CNN的操作。假设单词的词向量是 x i ∈ R k x_i\in R^k xi​∈Rk,也就是单词词向量的维度是k,我们可以将n个词向量进行简单的拼接来表示这n个单词,然后利用滤波器 w ∈ R h k w \in R^{hk} w∈Rhk完成卷积操作。举个栗子:

当n=5,k=2,h=3时,也就是滤波器每次和三个单词长度的词向量进行内积,依次得到一个值,如下图所示

cs224n 笔记13 卷积神经网络

值得注意的是,这里的滤波器 w w w是一个标量。

然后依次进行卷积操作,最终得到一个用于表示该句子的向量。当最后两个单词长度不足时(h=3),常见的方法是进行补0。

cs224n 笔记13 卷积神经网络

池化层

可以想到的是,当两个句子长度不一时,那么卷积之后得到的两个向量长度也会不一致,这显然不是我们希望的。所以,池化层很好的解决了这个问题,比如最大池化操作,即从向量中选择最大的一个值最为该句子的表示。当然,在这里的例子中,最大值就仅仅是一个数值,比如3.5 。

所谓最大池化还有这样一层意义,在进行卷积时,优化后的滤波器是倾向于选择更重要的信息的,在数学层面上就是让更重要的信息表示的向量和滤波器本身表示的向量更加一致,也就是说这样相似的向量进行内积后得到的值会更大,所以进行最大池化相当于将该句子中最重要的信息筛选出来。

我们往往是希望有更多的特征信息,所以可以选用不同大小的卷积核(滤波器),经过池化操作后得到不同的特征值,然后将这些特征值进行拼接。

另外,有一个关于词向量的技巧。如果任由梯度流入词向量,则词向量会根据分类任务目标而移动,丢失语义上泛化的相似性。解决办法是用两份相同的词向量,称作两个通道(channel)。一个通道可变,一个通道固定。将两个通道的卷积结果输入到max-pool中。

分类

举了一个简单的分类模型的例子。假设利用m个卷积核,经过最大池化后得到m个值 c ^ i \hat{c}_i c^i​,将m个值拼接得到特征向量 z = [ c ^ 1 , c ^ 2 , c ^ 3 . . . c ^ m ] z=[\hat{c}_1,\hat{c}_2,\hat{c}_3...\hat{c}_m] z=[c^1​,c^2​,c^3​...c^m​],然后进行简单分类 y = s o f t m a x ( W ( S ) z + b ) y=softmax(W^{(S)}z+b) y=softmax(W(S)z+b),如图所示

cs224n 笔记13 卷积神经网络

这里是两个通道,第一个通道有三个卷积核(包括两个2gram和一个3gram),第二个通道有1个卷积核,共生成4个feature map,然后分别做最大池化操作,得到4个最大值,进行拼接,最后进行softmax分类。

dropout

基本思想:随机的掩盖或丢弃一些特征信息

做法如下:

y = s o f t m a x ( W ( S ) ( r ∘ z ) + b ) y=softmax(W^{(S)}(r\circ z)+b) y=softmax(W(S)(r∘z)+b)

其中,r是一个掩码向量,服从参数为p的伯努利分布。

一般用dropout会提升2~4%的准确率。

接下来讲了一些超参设置的知识,还有一些“黑暗技巧”,这些东西就不一一记录啦~最后就再记录一下提到的模型比较的内容

模型比较

Bag of Vectors:词袋向量,对于分类问题是很好的baseline,接几层ReLU甚至可能打败CNN。

Window Model:对单个单词的分类来讲挺好,但不适用于需要更多上下文的任务。

CNN:适合分类,不清楚如何做短语级别的标注,对短文本需要padding,难以用NLP的视角解释,容易GPU并行化

RNNs:从左读到右,最符合认知。不是分类任务的最佳选择,比CNN慢,但可以做序列标注。

继续阅读