放牧代码和思想
专注自然语言处理、机器学习算法
    时间有限,只有GitHub上的issue能及时处理,大约每周末一次。另外,不要叫我楼主,谢谢。

CS224n笔记13 卷积神经网络

目录

hankcs.com 2017-07-04 上午10.11.32.png

补充了NLP中相对冷门的CNN,谈了谈调参与发论文的潜规则。

从RNN到CNN

  • RNN无法利用未来的特征预测当前单词,就算是bi-RNN,也不过是双向重蹈覆辙而已。

  • 经常把过多注意力放到最后一个单词上。

    hankcs.com 2017-07-03 下午5.11.18.png

比如,如果只想得到my birth的向量,RNN就无能为力了,因为它捕捉的是从左到右的“上文”。

  • 与此对应,softmax也是加在最后一个单词上的

CNN的解决思路说来也很简单粗暴,那就计算相邻的ngram,不管它到底是不是真正的短语,眉毛胡子一把抓地为它们计算向量。

什么是卷积

定义在两个矩阵上的函数,生成另一个矩阵(也许称作tensor会更好)。对一维矩阵(向量来讲),可以形式化地描述如下

$$(f*g)[n] = \sum\limits_{m=-M}^Mf[n-m]g[m]$$

这里$2M$是过滤器的大小。

在计算机视觉中,卷积可以提取诸如物体边缘之类的特征。一个很棒的可视化:

Convolution_schematic.gif

更多入门知识参考《理解深度学习中的卷积》

单层CNN

假设词向量$x_i\in R^k$,那么$n$个单词的句子可视作词向量(列向量)的按行拼接$x_{1:n}=x_1\oplus x_2...\oplus x_n$。

对于$h$个单词上的卷积过滤器 $w\in R^{hk}$ ,比如$k=2$, $n=5$, $h=3$,下图演示了NLP中的单层CNN工作过程:

single-conv.png

也就是说,每相邻3个词语的组合对应卷积结果中的一个标量。卷积过滤器的权值$w$也是一个向量,最终得到每个卷积结果 $c_i=f(w^Tx_{i:i|h-1}+b)$ ,组合得到向量$\textbf{c}=[c_1,c_2... c_{n-h+1}]\in R^{n-h+1}$。

对最后两个词语,由于不够长($h=3$),常见的技巧是补零:

single-conv-complete.png

(这样得到的就不再是$R^{n-h+1}$的向量了

一个过滤器就是一个向量,卷积运算的子运算实际上就是与某个ngram的内积,内积代表相似性。于是卷积核实际上在挑选与自己相似的那种pattern,比如正面情感的ngram。

池化

卷积不是最终目的,最终目的是将卷积结果输入到其他网络中去。在不补零的情况下,卷积结果$\textbf{c}$中有$n-h+1$个数,与$n$有关;而我们想要一个定长的输入。一个解决办法是max-pooling,输入是CNN结果$\textbf{c}\in \mathbb{R}^{n-h-1}$,输出是一个标量$\hat{c}=max\{\textbf{c}\}$,其中$\hat{c}\in \mathbb{R}$。

当然也可以用min,不过ReLU时经常结果是0,所以没什么意义。max的意义是,这个过滤器就是要过滤出最强烈的那个ngram,作为整段话的中心意思。

为了得到多个卷积特征,简单地使用多个卷积核(不需要大小一致),然后把池化结果拼接起来。

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

分类

最终$m$个卷积核输出的特征向量是$\boldsymbol{z}=[\hat{c_1}, \cdots,\hat{c_m}]$

喂给最终的softmax层:$y=softmax(W^{(S)}z+b)$

图示

一个漂亮的图示:

hankcs.com 2017-07-04 上午10.11.32.png

双通道词向量=>多个卷积核得到的feature map(红色是bigram,橙色是trigram)=>池化得到最终特征=>softmax分类输出。

dropout

老生常谈了:$y=softmax(W^{(S)}(r \circ z)+b)$

$r$中的元素满足参数$p$的伯努利分布,最终特征向量相当于被缩放了:

$$\hat{W}^{(S)}=pW^{(S)}$$

也相当于在数据上采样子集训练模型,然后平均起来(ensemble),通常可以带来2-4%的效果提升。

直观的解释是,在情感分析任务中,并不一定要两个表示正面的ngram同时出现才能下结论,有时候只出现一个也可能足以说明问题。

这些训练trick都相当于给GD引入噪声,让其不再肯定地瞄准一个局部最优,而是尽可能地探索尽可能多的landscape。以前挺有希望的高斯过程调参也不流行了,人们觉得随机采样超参数空间就已经惊人地好用了。

一般模型里面的超参数非常多,就算给定一组超参数,多数情况下也无法复现结果。往好的方向解释是作者试验了很多次,终于碰巧撞上了更好的局部最优点,而我们都没撞上去。

试验结果

hankcs.com 2017-07-04 下午1.57.27.png

双通道不显著地带来了一点提升。这张对比表也暴露了深度学习学术界公开的“黑幕”,没有人把每个训练trick单独拎出来报告提升比;2014年之前几乎没人用Dropout,可最新发表的论文就是要跟它们比Dropout,却不愿把它们加入Dropout重新实现一遍(可能费时费力还不讨好吧,万一被baseline反杀不就完蛋啦)。事实上,这个结果只能说明Dropout比不Dropout有2-4%的提升,不能说明CNN多有效。

CNN花样

可以变换很多花样,比如每个feature map是变大了还是变小了,池化技巧等等。

hankcs.com 2017-07-04 下午2.09.13.png

CNN应用:机器翻译

第一个神经网络机器翻译模型吧,用CNN做encoder,RNN做decoder:

hankcs.com 2017-07-04 下午2.10.23.png

到这里就快下课了,Richard草草讲了几句。

模型比较

Bag of Vectors:对分类问题来讲非常棒的基线模型,接几层ReLU甚至可能打败CNN。

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

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

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

Quasi-RNN

CNN和RNN的混血儿,在时序数据上做卷积:

hankcs.com 2017-07-04 下午2.17.04.png

比LSTM速度要快,效果要好:

hankcs.com 2017-07-04 下午2.18.46.png

知识共享许可协议 知识共享署名-非商业性使用-相同方式共享码农场 » CS224n笔记13 卷积神经网络

分享到:更多 ()

评论 9

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #2

    啊~可能刚才的追问有点冒犯了,不好意思。我可能被你误会是在找不切实际的“捷径”。其实不是这样的,我看了你列举的书单还有稍微预览一下你这个博客的内容,都没有说要追最新论文的意思。但是拉钩那边给出的用人条件要求在各种知名期刊发布论文,以及知乎其他dalao都有些涉及论文的意思。不太清楚这个领域到底是学术为本 还是说搞学术的一波人 应用最新技术又是另一波人……至于说全民调参数嘛~嘛那的确没意思~但是这并不不是我追求的……

    shimotsuki4个月前 (07-06)回复
    • 那只是因为我按部就班,循序渐进,还没把知识更新完毕。事实上CS224n中的一些研究热点已经是截止2017年的最新论文了,其中一些特别冷门的就是写论文的好课题。在此之后,应该会水点论文吧。
      从目前的了解来看,这个领域是学术界和巨头企业研究院引领的(但他们其实是同一批人,Richard自己就有个startup,刚卖掉走上人生巅峰;Navdeep在英伟达)。不在论文堆里面摸爬滚打几年,就把握不了问题的本质,自然也预测不到未来走势,只能做别人的跟屁虫。大点的公司都不会满足仅仅做某个开源框架的用户,大老板希望能申请专利,CTO可能本身就是名校硕博出身,招人自然人以类聚。预计未来大量劳动力涌入这个行业,顶会论文会成为区分度更高的硬通货。虽然如同本文所述,学术界的确有些不合理的做法、过于关注零点几的分数提升而不关注工程成本,但总体而言是科学务实的。像Facebook、Google这些企业研究院,拥有能跟名校强组叫板的研究能力,他们依然是同一波人(至少曾经是)。我猜国内也是一样,大企业研究院里都是曾经的博士们,一边应用新技术一边发明新技术,只不过以前发顶会论文,现在申请商业专利而已。

      hankcs4个月前 (07-06)回复
  2. #1

    博主你好,你这个博客我留意了很久,(用chrome浏览器的自动打开网页插件每周过来看看有没更新啥的)开始对机器学习领域有投入的冲动了!见您做了很多学习笔记和实践,所以想向您这位大前辈问几个问题。
    首先是要以机器学习算法应用到实践项目的工程师为目标的话,是不是都得不能忽视学术界最新的研究成果?是不是都得与论文打交道?因为我本身只是工科背景,还是建筑类的。既跨专业原本也不怎么接触论文方面的。所以有点方
    其次,机器学习 人工智能等领域学习周期感觉比较长,需要有高数基础和懂最新算法以及应用,恰好我英文也不多好。得学习一段时间。所以有没有什么工作可以在懂一点python 有点ui 交互设计理论知识的情况下可以胜任的工作作为第一步维持生计可以推荐的?

    shimotsuki4个月前 (07-05)回复
    • 感谢关注,我也只是入门级别。硬要说的话,不建议轻易转行。可当作兴趣,白天工作,晚上学习。做学术需要扎实的数学基础、算法原理、优化理论、英文文献阅读能力;做项目还需要卓越的工程能力。

      hankcs4个月前 (07-06)回复
      • 在你看来 这个领域做项目需要是基于学术能力之上的么?

        shimotsuki4个月前 (07-06)回复
        • 完全没法绕过学术直接应用现有方法框架工具什么的?

          shimotsuki4个月前 (07-06)回复
          • 那你就问错人了,得去问什么“培训班”。以后估计就是“代调神经网络,5元一层”的全民“智能”时代了。

            hankcs4个月前 (07-06)
      • 为博主点赞

        Hsing4个月前 (07-06)回复

我的开源项目

HanLP自然语言处理包基于DoubleArrayTrie的Aho Corasick自动机