本文转自:http://www.hankcs.com/nlp/cs224n-convolutional-neural-networks.html
补充了NLP中相对冷门的CNN,谈了谈调参与发论文的潜规则。
从RNN到CNN
-
RNN无法利用未来的特征预测当前单词,就算是bi-RNN,也不过是双向重蹈覆辙而已。
-
经常把过多注意力放到最后一个单词上。
比如,如果只想得到my birth的向量,RNN就无能为力了,因为它捕捉的是从左到右的“上文”。
-
与此对应,softmax也是加在最后一个单词上的
CNN的解决思路说来也很简单粗暴,那就计算相邻的ngram,不管它到底是不是真正的短语,眉毛胡子一把抓地为它们计算向量。
什么是卷积
定义在两个矩阵上的函数,生成另一个矩阵(也许称作tensor会更好)。对一维矩阵(向量来讲),可以形式化地描述如下
这里2M是过滤器的大小。
在计算机视觉中,卷积可以提取诸如物体边缘之类的特征。一个很棒的可视化:
更多入门知识参考《理解深度学习中的卷积》。
单层CNN
双通道词向量=>多个卷积核得到的feature map(红色是bigram,橙色是trigram)=>池化得到最终特征=>softmax分类输出。
dropout
试验结果
双通道不显著地带来了一点提升。这张对比表也暴露了深度学习学术界公开的“黑幕”,没有人把每个训练trick单独拎出来报告提升比;2014年之前几乎没人用Dropout,可最新发表的论文就是要跟它们比Dropout,却不愿把它们加入Dropout重新实现一遍(可能费时费力还不讨好吧,万一被baseline反杀不就完蛋啦)。事实上,这个结果只能说明Dropout比不Dropout有2-4%的提升,不能说明CNN多有效。
CNN花样
可以变换很多花样,比如每个feature map是变大了还是变小了,池化技巧等等。
CNN应用:机器翻译
第一个神经网络机器翻译模型吧,用CNN做encoder,RNN做decoder:
到这里就快下课了,Richard草草讲了几句。
模型比较
Bag of Vectors:对分类问题来讲非常棒的基线模型,接几层ReLU甚至可能打败CNN。
Window Model:对单个单词的分类来讲挺好,但不适用于需要更多上下文的任务。
CNN:适合分类,不清楚如何做短语级别的标注,对短文本需要padding,难以用NLP的视角解释,容易GPU并行化
RNN:从左读到右,最符合认知。不是分类任务的最佳选择,比CNN慢,但可以做序列标注。
Quasi-RNN
CNN和RNN的混血儿,在时序数据上做卷积:
比LSTM速度要快,效果要好: