神经网络梯度消失原因
(PS:因时间关系,本文是口水话,很少公式。需要一定神经网络知识的小伙伴才看的懂哦。如有不对,请批评指正)
好啦,戏太多,下面进入正题------------------------------>
1. 众所周知,神经网络中的**函数,很多都是用的S型函数。(sigmiod函数)
2. 当神经网络层次够深的时候,更新权重,也许会出现梯度消失!!!
原因如下:
1 神经网络用的是梯度下降法,来进行每次更新网络的权重w,假如loss函数为: (简写的哈)
Loss = (y - y')^2, 其中y = f(wx + b)
那么,每次更新w用求导法则 w = w + w', w' = (Loss对w的求导),也就是每次的梯度,对吗? ok...继续......
但是:我们知道复合函数求导:是一层一层又一层,多层函数求导相乘,对吧......
所以最后w' 应该是:(Loss对y求导)*(y对f函数求导)*(f函数对w求导)
2. 注意上述中间项:(y对f型函数求导), 因为f是**函数,即sigmiod函数。
所以其实这一中间项:就是sigmiod函数求导,我们经过推算,sigmiod函数求导,他的导数值永远遵循如下:
什么意思? 就是S型函数的求导值:永远是小于0.25的!!!
这又是什么意思?,也就是说,假如 哪怕我取s函数求导最大为0.25好吧 ------>
那么:假如你的深度网络有100层,方向传播求w的时候,根据函数求导要一层又一层的原因----------->
那么: w', 也就是梯度,对100层网络来说,其反向传播走到接近输入层的时候,最终会拖着很长很长的计算公式:
(LOSS求导)*(S型函数求导)*(S型函数求导)*(S型函数求导)... * ... *(S型函数求导) * (最后函数对W求导)... 等等...
这不就是一个值*0.25*0.25*0.25*0.25*...*0.25 *其他等等吗?
那么: 若干个0.25相乘,快趋近于0了好吧,所以梯度消失了.................
如何防止梯度消失:
网络层中适当的用Relu**函数就可以。为什么? 因为Relu函数长这样:
1. x>0 的时候,relu是y=x, 求导就是1,套到前面的论述的话:100个1 相乘还是为1, 大不了不变呗,但不会梯度消失
2 x<0 的时候,relu=0,常数求导为0,这个意思就是:大不小那个神经元不更新,起到网络稀疏的效果...