深度学习(二)——神经元激活函数, Dropout
source link: http://antkillerfarm.github.io/dl/2017/05/17/Deep_Learning_2.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
深度学习(二)——神经元激活函数, Dropout
2017-05-17
链式法则(续)
值得注意的是残差梯度实际上包括两部分:Δx和Δw。如下图所示:
其中,Δx和Δw分别是Δ在x和w的偏导数方向上的分量。Δx用于向上层传递梯度,而Δw用于更新权值w。
通常来说,我们只需要更新权值w,但少数情况下,w和x可能都需要更新,这时只要分别计算w和x的偏导,并更新即可。
上图是多层MLP的正反向运算关系图。z表示每层的feature map,w表示weight,g表示gradients。上图上半部分展示了正向运算,而下半部分,左侧展示了gradients的更新,右侧展示了weight的更新。
除了基于梯度下降的BP算法之外,还有基于GA(genetic algorithm)的BP算法,但基本只有学术界还在尝试。
https://mp.weixin.qq.com/s/A_Sekyi1kxT1zYcQFBOkDA
Quickprop介绍:一个加速梯度下降的学习方法(由于80/90年代的BP算法收敛缓慢,Scott Fahlman发明了一种名为Quickprop的学习算法。)
https://zhuanlan.zhihu.com/p/25202034
道理我都懂,但是神经网络反向传播时的梯度到底怎么求?
https://mp.weixin.qq.com/s/Ub3CMQszkx7pGKoPcB0bYA
BP反向传播矩阵推导图示详解
https://tech.zealscott.com/deeplearning/11-785/lecture12/
Back propagation through a CNN
https://mp.weixin.qq.com/s/XzyudySeceDueTDM36Q2Wg
https://mp.weixin.qq.com/s/MX8sFKJQZMDMHwkBJ8mCtQ
5种神经网络常见的求导
随机初始化
神经网络的参数的随机初始化的目的是使对称失效。否则的话,所有对称结点的权重都一致,也就无法区分并学习了。
随机初始化的方法有如下几种:
1.Gaussian。用给定均值和方差的Gaussian分布设定随机值。这也是最常用的方法。
2.Xavier。该方法基于Gaussian分布或均匀分布产生随机数。其中分布W的均值为零,方差公式如下:
(1)Var(W)=1nin
其中,nin表示需要输入层的神经元的个数。也有如下变种:
(2)Var(W)=2nin+nout
其中,nout表示需要输出层的神经元的个数。
公式1也被称作LeCun initializer,公式2也被称作Glorot initializer。
3.MSRA。该方法基于零均值的Gaussian分布产生随机数。Gaussian分布的标准差为:
2nl
其中,nl=kl2dl−1,kl表示l层的filter的大小,dl−1表示l-1层的filter的数量。
这种方法也被称作He initializer,是何恺明发明的。
何恺明,清华本科+香港中文大学博士(2011)。先后在MS和Facebook担任研究员。
个人主页:http://kaiminghe.com/
何恺明在训练ResNet的时候发现Xavier方法对于ReLU激活不是太有效,故而提出了新方法。
除了随机初始化之外,还有预训练初始化。比较早期的方法是使用greedy layerwise auto-encoder做无监督学习的预训练,经典代表为Deep Belief Network;而现在更为常见的是有监督的预训练+模型微调。
https://pouannes.github.io/blog/initialization/
How to initialize deep neural networks? Xavier and Kaiming initialization
https://mp.weixin.qq.com/s/_wt-zTpbd25OL3os0X6cJg
神经网络中的权重初始化一览:从基础到Kaiming
https://mp.weixin.qq.com/s/Nmi4u8LKrsjYKH3_3vmaVQ
神经网络初始化trick:大神何凯明教你如何训练网络!
https://mp.weixin.qq.com/s/DCYusE1lwvm14qpsnPYMpw
初始化:你真的了解我吗?
https://zhuanlan.zhihu.com/p/305055975
kaiming初始化的推导
BP算法的缺点
虽然传统的BP算法,理论上可以支持任意深度的神经网络。然而实际使用中,却很少能支持3层以上的神经网络。
如上图所示,sigmoid函数不是线性的,一个小的输出值的改变,对应了比较大的输入值改变。换句话说,就是输出值的梯度较大,而输入值的梯度较小。而梯度在基于梯度下降的优化问题中,是至关重要的。
随着层数的增多,反向传递的残差梯度会越来越小,这样的现象,被称作梯度消失(Vanishing Gradient)。它导致的结果是,虽然靠近输出端的神经网络已经训练好了,但输入端的神经网络仍处于随机状态。也就是说,靠近输入端的神经网络,有和没有都是一样的效果,完全体现不了深度神经网络的优越性。
和梯度消失相反的概念是梯度爆炸(Vanishing Explode),也就是神经网络无法收敛。
https://mp.weixin.qq.com/s/w7EbDI9MQBZF67XM-cV1eQ
一文了解神经网络中的梯度爆炸
http://blog.csdn.net/xizero00/article/details/51013088
Different Methods for Weight Initialization in Deep Learning
https://mp.weixin.qq.com/s/xqWli1xnsGkqYDUjgvOnkQ
反向传播神经网络极简入门
https://mp.weixin.qq.com/s/PhxkfWH5bEbykMKGEtDScA
为什么神经网络参数不能够全部初始化为全0?
https://mp.weixin.qq.com/s/s-v7T0k2gy7ZRnrFCUpTYg
通过方差分析详解最流行的Xavier权重初始化方法
https://mp.weixin.qq.com/s/r1OJoLa_t8QwNcL4kfx5uQ
神经网络参数随机初始化已经过时了
https://mp.weixin.qq.com/s/mFA2PeO70o3HR6AQ74Lp3g
深度学习最佳实践之权重初始化
https://mp.weixin.qq.com/s/M1TswiDh-LkH9G7jCQ_UqA
神经网络编程-前向传播和后向传播
https://mp.weixin.qq.com/s/Dygdn0Xzpx40-zUQadiiHg
通过梯度检验帮助实现反向传播
https://mp.weixin.qq.com/s/auNRIPYEwRlROFXug41Ang
简单初始化,训练10000层CNN
https://mp.weixin.qq.com/s/iSJyOe81dnEuaKzOih6WNg
什么是深度学习成功的开始?参数初始化
https://mp.weixin.qq.com/s/s4ew7LYgnC9Z3kVFsjcaXg
不用批归一化也能训练万层ResNet,新型初始化方法Fixup了解一下
https://mp.weixin.qq.com/s/zTB59Fg_JFg9ZZPRlq9txA
不使用残差连接,ICML新研究靠初始化训练上万层标准CNN
https://mp.weixin.qq.com/s/_WCVvM6sPpsWD8NS8etEKA
京东AI研究院提出ScratchDet:随机初始化训练SSD目标检测器
神经元激活函数
tanh函数
除了阶跃函数和Sigmoid函数之外,常用的神经元激活函数,还有双曲正切函数(tanh函数):
f(z)=tanh(x)=sinh(x)cosh(x)=ex−e−xex+e−x
其导数为:
f′(z)=1−(f(z))2
上图是sigmoid函数(蓝)和tanh函数(绿)的曲线图。
上图是sigmoid函数(蓝)和tanh函数(绿)的梯度曲线图。从中可以看出tanh函数的梯度比sigmoid函数大,因此有利于残差梯度的反向传递,这是tanh函数优于sigmoid函数的地方。但是总的来说,由于两者曲线类似,因此tanh函数仍被归类于sigmoid函数族中。
下图是一些sigmoid函数族的曲线图:
有关sigmoid函数和tanh函数的权威论述,参见Yann LeCun的论文:
http://yann.lecun.com/exdb/publis/pdf/lecun-98b.pdf
从数学上来看,非线性的Sigmoid函数对中央区的信号增益较大,对两侧区的信号增益小,在信号的特征空间映射上,有很好的效果。
从神经科学上来看,中央区酷似神经元的兴奋态,两侧区酷似神经元的抑制态,因而在神经网络学习方面,可以将重点特征推向中央区,将非重点特征推向两侧区。
无论是哪种解释,看起来都比早期的线性激活函数y=x,阶跃激活函数高明了不少。
2001年,Attwell等人基于大脑能量消耗的观察学习上,推测神经元编码工作方式具有稀疏性和分布性。
2003年,Lennie等人估测大脑同时被激活的神经元只有1~4%,进一步表明神经元工作的稀疏性。
从信号方面来看,即神经元同时只对输入信号的少部分选择性响应,大量信号被刻意的屏蔽了,这样可以提高学习的精度,更好更快地提取稀疏特征。
从这个角度来看,在经验规则的初始化W之后,传统的Sigmoid系函数同时近乎有一半的神经元被激活,这不符合神经科学的研究,而且会给深度网络训练带来巨大问题。
http://www.cnblogs.com/neopenx/p/4453161.html
ReLu(Rectified Linear Units)激活函数
https://en.wikipedia.org/wiki/Activation_function
ReLU(Rectified Linear Units)激活函数的定义如下:
f(x)=max(0,x)
其函数曲线如下图中的蓝线所示:
从上图可以看出,ReLU相对于Sigmoid,在解决了梯度消失问题的同时,也增加了神经网络的稀疏性,因此ReLU的收敛速度远高于Sigmod,并成为目前最常用的激活函数。
由于ReLU的曲线不是连续可导的,因此有的时候,会用SoftPlus函数(上图中的绿线)替代。其定义为:
f(x)=ln(1+ex)
除此之外,ReLU函数族还包括Leaky ReLU、PReLU、RReLU、ELU等。
Dropout
Dropout训练阶段
Dropout是神经网络中解决过拟合问题的一种常见方法。
它的具体做法是:
1.每次训练时,随机隐藏部分隐层神经元。
2.根据样本值,修改未隐藏的神经元的参数。隐藏的神经元的参数保持不变。
3.下次训练时,重新随机选择需要隐藏的神经元。
由于神经网络的非线性,Dropout的理论证明尚属空白,这里只有一些直观解释。
1.dropout掉不同的隐藏神经元就类似在训练不同的网络,整个dropout过程就相当于对很多个不同的神经网络取平均。而不同的网络产生不同的过拟合,一些互为“反向”的拟合相互抵消就可以达到整体上减少过拟合。这实际上就是bagging的思想。
2.因为dropout程序导致两个神经元不一定每次都在一个dropout网络中出现。这会迫使网络去学习更加鲁棒的特征。换句话说,假如我们的神经网络是在做出某种预测,它不应该对一些特定的线索片段太过敏感,即使丢失特定的线索,它也应该可以从众多其它线索中学习一些共同的模式(鲁棒性)。
Dropout还有若干变种,如Annealed dropout(Dropout rate decreases by epochs)、Standout(Each neural has different dropout rate)。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK