多层感知机解决了之前无法模拟异或逻辑的缺陷,同时更多的层数也让网络更能够刻画现实世界中的复杂情形。理论上而言,参数越多的模型复杂度越高,“容量”也就越大,也就意味着它能完成更复杂的学习任务。多层感知机给我们带来的启示是,神经网络的层数直接决定了它对现实的刻画能力——利用每层更少的神经元拟合更加复杂的函数。但是随着神经网络层数的加深,优化函数越来越容易陷入局部最优解(即过拟合,在训练样本上有很好的拟合效果,但是在测试集上效果很差),并且这个“陷阱”越来越偏离真正的全局最优。利用有限数据训练的深层网络,性能还不如较浅层网络。同时,另一个不可忽略的问题是随着网络层数增加,“梯度消失”(或者说是梯度发散diverge)现象更加严重。具体来说,我们常常使用sigmoid作为神经元的输入输出函数。对于幅度为1的信号,在BP反向传播梯度时,每传递一层,梯度衰减为原来的0.25。层数一多,梯度指数衰减后低层基本上接受不到有效的训练信号。那么深度学习中是如何解决局部极值及梯度消失问题的呢?
根据我个人的理解,第一个阶段就是2006年Hinton提出的逐层预训练方法,为了解决深层神经网络的训练问题,一种有效的手段是采取无监督逐层训练(unsupervised layer-wise training),其基本思想是每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,这被称之为“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)训练。比如Hinton在深度信念网络(Deep Belief Networks,简称DBN)中,每层都是一个RBM,即整个网络可以被视为是若干个RBM堆叠而成。在使用无监督训练时,首先训练第一层,这是关于训练样本的RBM模型,可按标准的RBM进行训练;然后,将第一层预训练号的隐节点视为第二层的输入节点,对第二层进行预训练;... 各层预训练完成后,再利用BP算法对整个网络进行训练。虽然也解决了一些问题,但并没有特别火。
事实上,“预训练+微调”的训练方式可被视为是将大量参数分组,对每组先找到局部看起来较好的设置,然后再基于这些局部较优的结果联合起来进行全局寻优。这样就在利用了模型大量参数所提供的自由度的同时,有效地节省了训练开销。
第二个阶段开始的标志就是2012年IMAGENET比赛中,CNN以压倒性优势取得胜利,自此开始深度学习才真正引人关注起来。虽然都叫深度学习,但其侧重点完全不同,通过一些手段,比如relu, dropout等小技巧,第二波深度学习算法已经基本抛弃了预训练的做法。caffe也是第二波深度学习的产物,所以里面除了自编码网络基本没有逐层预训练这种东西。
引入RELU代替sigmoid激活函数。为什么引入Relu呢? 第一,采用sigmoid等函数,算激活函数时(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多。第二,对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成信息丢失),从而无法完成深层网络的训练。第三,Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。
当然现在也有一些对relu的改进,比如prelu,random relu等,在不同的数据集上会有一些训练速度上或者准确率上的改进,具体的大家可以找相关的paper看。多加一句,现在主流的做法,会在做完relu之后,加一步batch normalization,尽可能保证每一层网络的输入具有相同的分布。
传统Sigmoid系激活函数
![深度学习解决局部极值和梯度消失问题方法简析 深度学习解决局部极值和梯度消失问题方法简析](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
稀疏性激活函数ReLU
![深度学习解决局部极值和梯度消失问题方法简析 深度学习解决局部极值和梯度消失问题方法简析](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
Dropout
训练神经网络模型时,如果训练样本较少,为了防止模型过拟合,Dropout可以作为一种trikc供选择。Dropout是hintion最近2年提出的,源于其文章Improving neural networks by preventing co-adaptation of feature detectors.中文大意为:通过阻止特征检测器的共同作用来提高神经网络的性能。
Dropout是指在模型训练时随机让网络某些隐含层节点的权重不工作,不工作的那些节点可以暂时认为不是网络结构的一部分,但是它的权重得保留下来(只是暂时不更新而已),因为下次样本输入时它可能又得工作了。
按照hinton的文章,他使用Dropout时训练阶段和测试阶段做了如下操作:
在样本的训练阶段,在没有采用pre-training的网络时(Dropout当然可以结合pre-training一起使用),hintion并不是像通常那样对权值采用L2范数惩罚,而是对每个隐含节点的权值L2范数设置一个上限bound,当训练过程中如果该节点不满足bound约束,则用该bound值对权值进行一个规范化操作(即同时除以该L2范数值),说是这样可以让权值更新初始的时候有个大的学习率供衰减,并且可以搜索更多的权值空间。
在模型的测试阶段,使用”mean network(均值网络)”来得到隐含层的输出,其实就是在网络前向传播到输出层前时隐含层节点的输出值都要减半(如果dropout的比例为50%),其理由文章说了一些,可以去查看。
关于Dropout,文章中没有给出任何数学解释,Hintion的直观解释和理由如下:
1. 由于每次用输入网络的样本进行权值更新时,隐含节点都是以一定概率随机出现,因此不能保证每2个隐含节点每次都同时出现,这样权值的更新不再依赖于有固定关系隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况。
2. 可以将dropout看作是模型平均的一种。对于每次输入到网络中的样本(可能是一个样本,也可能是一个batch的样本),其对应的网络结构都是不同的,但所有的这些不同的网络结构又同时share隐含节点的权值。这样不同的样本就对应不同的模型,是bagging的一种极端情况。个人感觉这个解释稍微靠谱些,和bagging,boosting理论有点像,但又不完全相同。
3. native bayes是dropout的一个特例。Native bayes有个错误的前提,即假设各个特征之间相互独立,这样在训练样本比较少的情况下,单独对每个特征进行学习,测试时将所有的特征都相乘,且在实际应用时效果还不错。而Droput每次不是训练一个特征,而是一部分隐含层特征。
4. 还有一个比较有意思的解释是,Dropout类似于性别在生物进化中的角色,物种为了使适应不断变化的环境,性别的出现有效的阻止了过拟合,即避免环境改变时物种可能面临的灭亡。
文章最后当然是show了一大把的实验来说明dropout可以阻止过拟合。这些实验都是些常见的benchmark,比如Mnist, Timit, Reuters, CIFAR-10, ImageNet.
后来又衍生出Droput的改进版maxout和DropConnect。
第三个阶段可能就算是最近的高速公路网络(highway network)和深度残差学习(deep residual learning)进一步避免了梯度消失,网络层数达到了前所未有的一百多层(深度残差学习:152层)!
对于deep learning越深越难训的问题,微软残差学习这个工作的直观想法应该就是说既然太深了难训,那我就把前面的层,夸几层直接接到后面去(短接),会不会既保证了深度,又让前面的好训一些呢?其实这个并不是特别新的想法,这个训得这么好,应该也是经过了很辛苦和仔细的调参、初始化等工作。换一个角度看,这也是一种把高阶特征和低阶特征再做融合,从而得到更好的效果的思路。其实细看会发现,它是highway networks的一个特例。 最主要的贡献,应该是把这种很深的highway networks在主流的benchmark上做了一遍,并且实践证明:1.这么深的网络效果比浅的好多了;2 highway networks能够在很深的网络训练中还能保持梯度稳定,不易消失或爆炸。相信不久后会有一堆工作出现类似的网络结构。residual block 其实就是 transform function T 为两个卷积和一个relu, transform gate是一个data independent 值为0.5 的一个 highway layer。...残差只是 kaiming 的换了种说法的马甲..
下面是复制的highway network和deep residual learning论文解析,由于本人是初学者,很多地方还不是很理解,anyway,先mark一下吧,方便今后研读吧。。。
Deep Residual Learning for Image Recognition
首先第一篇肯定要谈,开创了152层 deep network,成功摘取 ILSVRC2015 全(主要)类别第一名 的工作,来自 MSRA 的 Deep Residual Network 。虽然 residual network 的名字很新,但其实可以把它看成是Highway Networks 的特例 (Highway Networks 的介绍见下)。尽管如此,作者在解释 residual 的 motivation 时还是非常充分合理,让人不得不佩服其在背后自己的思考。
![深度学习解决局部极值和梯度消失问题方法简析 深度学习解决局部极值和梯度消失问题方法简析](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
作者提出 residual network 的 motivation 其实依然是 information flow 在 deep network 中受阻。大家都可以想象到这个问题。但是这篇工作中,作者是如何“验证”这个问题的呢?他们用了两种“角度”,第一种是在 Introduction 里就提到的:当他们用 deep network 和可类比的 shallower network 横向对比(如上图),发现 deep network 的 training error 总是比 shallower network 要高。可是这在理论上是不对的。因为如果一个 shallow network 可以被训练优化求解到某一个很好的解(subspace of that of deep network),那么它对应的 deep 版本的 network 至少也可以,而不是更差。但事实并不是如此。这种 deep network 反而优化变差的事情,被作者称为 “degration problem”。第二种 角度是在实验部分提到的,从理论角度分析这种 degration 不应该是 gradient vanishing 那种问题,而是一种真正的优化困难。于是,为了解决这个 degration problem,作者提出了 residual network,意思是说,如果我们直接去逼近一个 desired underlying mapping (function) 不好逼近(优化困难,information flow 搞不定),我们去让一个 x 和 mapping 之间的residual 逼近 0 应该相对容易。这就是作者给 highway networks 找的 residual 的解释。
![深度学习解决局部极值和梯度消失问题方法简析 深度学习解决局部极值和梯度消失问题方法简析](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
那么,在实际上,residual network block(上图)就相当于是 Highway network block 中 transform gate 和 transform function 被特例后的结果——因为是特例了,也自然 reduce 了 parameter,也算是这篇工作中作者一个卖点。现在,问题就是,它为啥是 Highway Networks 的特例呢?介绍完Highway Networks 就明白了。
Training Very Deep Networks
好了,现在让我们来再介绍一遍 Highway Networks 这个工作。这篇论文前身是《Highway Networks》,发表于 ICML workshop 上。最初放在arXiv 上,现在已经被 NIPS'15 接收。这个工作纯被 LSTM 的 gate 启发,既然 gate 也是为了解决 Information flow,有没有其他方式去解决?更直观一点的,不通过 gradient 的?既然 information 像被阻隔了一样,我们就“暴力”让它通过一下,给它们来个特权——在某些 gate 上,你就不用接受“审查”(transform)了,直接通过吧。这像高速公路一样——于是就有了这个名字,Highway Networks(HW-Nets)。
To overcome this, we take inspiration from Long Short Term Memory (LSTM) recurrent networks. We propose to modify the architecture of very deep feedforward networks such that information flow across layers becomes much easier. This is accomplished through an LSTM-inspired adaptive gating mechanism that allows for paths along which information can flow across many layers without attenuation. We call such paths information highways. They yield highway networks, as opposed to traditional ‘plain’ networks.
加粗了 adaptive,这就是这个 mechanism 的重点 , 也是之所以说 Deep Residual Network 是它的一个特例的原因所在 。 在文章中,公式(2-3)就是他们的机制。
公式(3)是公式(2)变形。 核心是 transform function H 和 transform gate T 。这样,对于当前的这个 input,在这个 layer 里,公式(3)决定多大程度是让它去进行 nonlinear transform(隐层),还是多大程度上让它保留原貌 直接传递给下一层,直通无阻。
![深度学习解决局部极值和梯度消失问题方法简析 深度学习解决局部极值和梯度消失问题方法简析](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
那么,在这里,其实我们也可以把这个公式(3)像 residual block 一样,拆成两个 component,一个是 H,一个是 x。如果是 x,就变成了 residual block 中 identity mapping 的 skip connection。这是一个 intuition 的解释。那么再具体等价一下,Deep Residual Network 那篇工作,讲到,自己比Highway Networks 的一个优势是,parameter 少,并且自己的“gate”永远不 close。这两个优势,既都对,也都不对。 关于第一点 ,这是事实,而这恰恰是把 Highway Networks 的一个优势给抹掉了。在 Highway Networks 文章的 4.1 部分,有讨论自己这种 adaptive mechansim for information flow learning 的优点。也就是说,如果说 Highway Networks 是 data-independent 的,那么 Deep Residual Network 就是 data-dependent 的,不 flexible,更可能不“最优”(Deep Residual Network 就是 Highway Networks 中提到的 hard-wired shortcut connections), 它只是一种 p=0.5 的二项分布的期望(np) 。 关于第二点 ,就不一定是事实了。因为实际上,虽然公式(3)看起来,transform gate 有可能完全 close,然而 transform function 却永远不可能为 0 或者 1,它的取值范围只是 (0,1) 开区间,所以在这点上它和 Deep Residual Network 是一样的。
对比说完,继续介绍 Highway Networks。Highway Networks 更巧妙的是,它在公式(3)这种 layerwise 的基础上,进一步拆分, 把每一个 layer 的处理从 layerwise 变成了 blockwise ,也就是我们可以对于 input 中的某一部分(某些维度)选择是 transform 还是 carry。这个 blockwise 的实现也在实验中被验证特别有用,大家可以去看下,我就不重复粘贴了。
最后说一点关于CNN和RNN的个人感觉吧, CNN卷积神经网络是一种特殊的深层的神经网络模型,它的特殊性体现在两个方面,一方面它的神经元间的连接是非全连接的,另一方面同一层中某些神经元之间的连接的权重是共享的(即相同的)。它的非全连接和权值共享的网络结构使之更类似于生物神经网络,降低了网络模型的复杂度(对于很难学习的深层结构来说,这是非常重要的),减少了权值的数量。上述就是所谓的局部感受野和权值共享。对卷积和池化操作,感觉可以使CNN具有原生态的稀疏性,具有一定的泛化能力和鲁棒性。RNN可以看成一个在时间上传递的神经网络,它的深度是时间的长度!正如我们上面所说,“梯度消失”现象又要出现了,只不过这次发生在时间轴上。对于t时刻来说,它产生的梯度在时间轴上向历史传播几层之后就消失了,根本就无法影响太遥远的过去。因此,之前说“所有历史”共同作用只是理想的情况,在实际中,这种影响也就只能维持若干个时间戳。为了解决时间上的梯度消失,机器学习领域发展出了长短时记忆单元LSTM,通过门的开关实现时间上记忆功能,并防止梯度消失。
以上是我最近阅读深度学习博客总结的深度学习解决局部极值和梯度消失问题的方法,本人初学者,理解总结的不一定准确,如有错误以后再纠正吧。。。