Review - Dropout with Its Application on Recurrent Neural Networks

OK,毕业典礼的原因又鸽了五六天。这次决定搞一篇大的,也是作为我实习后半部分的一个开始。

这次的Review如题目所说是对于神经网络里目前非常流行的防止小样本情况下过拟合的方法Dropout的介绍以及其在递归神经网络(Recurrent Neural Networks, RNN)里面的应用。整个介绍分为两部分,对应两篇论文:
1) Srivastava和Hinton双大神的 Dropout: A Simple Way to Prevent Neural Networks from Overfitting
2) OpenAI创始人Wojciech Zaremba纽大博士期间的一篇作品 Recurrent Neural Network Regularization 其实这篇文章对于我本人的重要性要高一些,因为目前我主用RNN解决问题,而上一篇论文并没有涉及到RNN。

Motivation from Practical Staff

Dropout在RNN的应用是我希望能够搞清楚的RNN问题之一。因为如上两篇posts所说,在医学离散信号数据(尤其是呼吸类研究方面)中,信号的长相关性和不确定性是几乎无法避免的。所以对于这种时序性信号RNN,尤其是LSTM是不错的选择。但是Dropout作为一种已经得到广泛使用的方法在RNN上的整体效果不佳。第二篇文章提供了一种Dropout在RNN上调参的方法,也是目前被一些技术性博文认为是参考价值较强的方法之一(Google引用率130+相对于其它方法已经不错,我会说其他的好多都是个位数或压根没有?),很多深度学习框架据说也主要参考这种方法将Dropout部署在框架里。

Motivation of Dropout – Hinton’s

Dropout一开始的灵感来源于生物繁殖:在常规的繁殖过程中,后代的基因来源是一半父亲一半母亲,外加一点极小的变异因子。物种的性别来源于基因,而基因的选择是随机的,却同时被自然选择有机的控制着。自然选择通过这个过程控制性别的平衡,以保证物种的生存繁衍——的确是很有创意的想法,科学来源于生活啊……

而Dropout所要面对的问题在当时也很头疼:一般情况下,研究者们面对大量的数据都会采用组合不同已有模型的办法建模,在神经网络这边也是这个套路。但多个模型的组合会使超参数(hyper-parameter)的调节变得极为困难。而且很多时候我们其实得不到想要的那么多数据和对应的标记,即使有,训练的效率大部分时候也是达不到要求的。Dropout其实是在这个背景下对于NN的一种“瘦身”,不仅可以防止过拟合,同时也提高了NN的训练效率。

Dropout from Srivastava & Hinton

Dropout,正如Hinton的题目所说,其实在算法概念上非常的简单,就是在每一个训练的epoch中,对于隐含层使用概率赋值的方式随机“弃掉”一部分元素,算法如下:

没错,非常简单———就是往每一层的输出上加了个伯努利(Bernoulli)概率变量(有谁尝试过别的概率分布吗?)。因此算法部分本身反而没什么好说的。

要提到的是对于含有Dropout神经网络的训练。这一部分Srivastava和Hinton引用了一种正则化方法———最大范数正则(Max-norm Regularization)。这里他们是用类似于投影的办法,将大于某个常数c的权重值投影到一个半径为c的球面上。没有大于c的值则保留。这样一来,唯一需要调节的超参数就是c。调节的方法见2005年Srebro等人的工作(我才不会说因为数学大复杂我搞了半天都没搞懂捏╭(╯^╰)╮)。

值得注意的是,Dropout在每一个epoch中“弃掉”的元素并不是没用了,相反,在下一个epoch的时候它们会被重置并重新使用Dropout进行选择
。其实这倒是和Boosting稍微有点像了…算是一个叠加版本的Boosting或者Bagging吧。

Dropout根据原文所说,主要应用于对于整个网络的调参工作上。在Learning Rate较小的情况下,Dropout可以对整个网络的Generalization Error实现不错的提升效果。

Hinton等人实验使用了当今几个较为流行的数据集如MNIST,TIMIT,CIFAR等等,Dropout相对于传统的网络在Generalization Error上都取得更好的效果。(细节:貌似ReLU相对于常规的Logistic作为激活函数对于FFN效果更好)

第一篇论文的其他关于预训练,噪声调节(Dropout本身相当于给神经网络带来noise)和隐含函数的部分由于暂时没考虑到,目前我没有再细读但#不一定#会再更新。

附录里面提供了几点训练Dropout神经网络的建议:
1) 一个神经网络隐含层最多含有n个元素,初设Dropout的概率是p,那么对于当前网络最优的元素个数应设为n/p。原文作者认为这至少适用于CNN和一般的FFN;
2) Learning Rate尽量设得高一点,文中建议相对于一般的网络,带有Dropout的网络的Learning Rate应设为10到100倍大,Momentum则建议是0.95~0.99;
3) 超参数c的值一般为3~4;
4) 概率值p不要设得太高,0.8左右对于一般的图像或声音数据集较为适宜。

值得注意的是,由于论文并没有使用过RNN做检测,以上建议也就仅局限于其它网络如ConvNet,Feed-Forward,DBM等。

Motivation of Zaremba et al

而在之前工作基础之上,Zaremba等人通过literature review,发现了Dropout在RNN上表现不佳的问题,而这也导致了RNN的网络规模一直无法进一步像CNN/MLP一样扩大。他们希望解决这个问题。

Dropout in RNN from Zaremba

基本的RNN结构和LSTM想必已经不再需要多说,之前两篇博文已经介绍过了。这里为了保证Notation的一致性贴上LSTM的图例:

以及RNN的结构图。之前也提到过,RNN之所以能够不错地处理时序数据,就是因为它本身可以时序展开。这里算是做出了一个比较形象的解释。

从上图可以看出来RNN的数据传递分为两个部分:横向的是时序部分,时间t是自变量;纵向的是非时序部分,自变量可以认为是input和LSTM的权重(其实大部分时候它们是常数)。这里Zaremba提出了不同于以往Dropout应用的观点(也谈不上以往…就隔了一年):将Dropout仅使用在纵向(上图虚线部分)更新而横向传播保持不变。而如果RNN的更新元素是LSTM的话,它的更新公式就变成了这样:

Dropout在这里面起到了一个很重要的作用:它会在纵向传播中将出现次数较少的信息“消除”掉(文中使用的词是‘corrupt’)而不干扰出现频率较高的信息。这些信息在横向传播中会通过LSTM的特性保留下来。Zaremba认为这对于RNN来说是很不错的一个提升想法,因为之前Dropout在横纵向都被使用的时候,一些出现频率较高的欣喜在横向传播时也会被‘Dropout’掉。

实验方面他们采用了三个时序数据集和一个图像数据集进行检测,都是RNN研究中使用较频繁的数据集。但我很奇怪为什么没有TIMIT,是因为Hinton祖师爷当年用DNN跑得挺好自己怕玩脱搞不过么…回头试一试。

提升方面,其实整体上Dropout对于RNN效果的提升可以认为“并不是特别明显”,至少相对于第一篇论文里DNN和ConvNet加上Dropout后大杀四方的表现,RNN的提升确实说服力不是很足。不过很多深度学习框架依然采用了这种办法对RNN使用Dropout进行调节以达到网络兼容的效果,无奈之举~

笔者使用Keras库的Recurrent Layer的示例代码做了一点微小的工作~基本上来说,和笔者的推测出入不大———没有Dropout的情况下,系统对于IMDB时序数据集的Test Score最低但效率最高,耗时最少;双向Dropout和纵向Dropout相比不仅loss较高而且耗时较长。

Conclusion

综上所述,Dropout,这种对于绝大多数前向传播为主的神经网络效果和效率提升都极为明显的防止过拟合的手段,在RNN上目前并没有太好的表现。主要原因应该在于Dropout的使用对于数据本身的破坏在RNN上体现的较为明显。ConvNet和MLP之所以没有出现这个问题,一个是因为它们不是循环处理同一批数据,也没有所谓的“记忆”之说,另一个原因就是目前行业上愿意将大量的数据投入到这类网络的研究中,减弱了Dropout的影响。而RNN本身作为处理时序数据为主的网络,没有(一般也不需要)大量的数据和并行服务器。想让RNN在时序数据处理上得到进一步的提升,我个人认为或许还是需要SSL相关理论的介入。不过这阵子一直没有时间好好研习,MIT那本书下载下来之后就没动过~忙过这阵子看看情况吧。

嗯,研习中~大家各自努力~接下来会开新领域的坑,讲真暑假之后我可能就不再搞这方面了~

另:目前博客只支持Facebook评论功能。