CS224d lecture 13札记
欢迎转载,转载注明出处:
http://www.cnblogs.com/NeighborhoodGuo/p/4716827.html
不知不觉到了第三部分了,整个课程也快结束了,虽然不是第一次整个推完公开课,但是还是有些兴奋呢!
废话不多说,开始总结啦!
这节课就介绍了一个模型,就是在Computer Vision里十分popular的CNN(Convolutional Neural Networks)。不过这里介绍它在NLP的应用,可见model其实是可以有不同的应用的哦,没准我们的大脑就是这么运转的,哈哈扯远了。
从RNN引入CNN
RNN是先整出来一个parsing tree然后一步一步的向上爬(蜗牛吗?- -),CNN不用整出来一个parsing tree,用论文里的话说就是Induced Feature Graph,可以自己生成拓扑结构。看似挺不错的。RNN是使用过的vector在同一layer里不会再使用第二次,CNN是用过的vector在同一layer里还可以用,从不计较。
CNN很像卷积的,选一个window,然后从左向右的一步一步的移动,然后生成上一层的layer。
第一部分介绍了一个最最简单的CNN,就是一个金字塔的结构:
然后使用和RNN里一样的计算步骤,一步一步的recursive
这种模型简单是简单,但是效果不好
CNN and pooling
于是就想出来一个好办法,第一步和之前的金字塔结构一样,就是生成金字塔的最下面两层:
然后生成了一个c的vector,接下来就pooling的过程,c_hat = max{C}
但是这样提取出来的只有一个啊,怎么办呢?多建几个金字塔不久好了,不对多建几个金字塔的底座,专业点说就是用不同宽度的window提取出feature map,然后再pooling,这样提取出来的features就多了。
tricks
有一个trick据说可以提高精度
在training阶段的最后一步,在z之前element-wise乘一个r,r是Bernoulli random variables。
这样可以有意的提高overfitting的可能性,继而可以训练尽可能多的features
在使用的时候当然不用再乘r了,但是weight会很大,所以:
使其缩小,再计算最后结果
还有一个trick是为了避免overfitting的:
还有一个trick - -
由于我们的模型很复杂,dataset也很大,训练时间很长,但是最终的训练结果可能不是最优的,所以就每隔一段时间,记录下来相应的weight和accuracy,在最后训练完成的时候使用accuracy最高的weight。
Complex pooling schemes
在课程的最后讲了一个最复杂也是最牛掰的CNN,在看完paper之后算是弄明白了
第一层
第一层使用的是Wide Convolution
左边的是narrow右边的是wide
具体要怎么convolution呢?首先选一个m作为weight matrix
然后生成M
最后往上 计算一层:
第二层
这个model里使用的k-max pooling和之前的不一样,这里一次提取出来前k个最大的,不像之前模型只提取出最大的
首先是k的计算方法:
其中L是总层数,l是相应的层,s是句子里的单词数。k_top这个就自己优化了。
计算方法和这个类似,差别就是取出前k个最大的
Folding
这个最简单,就是把每两行相加起来,加之前是d行,加之后是d / 2行
最后一层
得到了想要的features最后就用Fully connected layer做预测了!
CNN application machine translation
先不管用之前讲得哪种CNN生成最顶上的那个feature,然后用RNN生成对应的target language
各种model的优劣
Bag of vectors对于简单的分类问题很好
Window Model对于单词的分类很好,长段的分类不行
CNNs直接被吹得万金油了
Recursive NN语义学上貌似可信,但是得生成一个parsing tree(我怎么感觉这个不靠谱)
Recurrent NN认知学上貌似可信,但是现在性能不是最优的