本帖最后由 丁柳 于 2019-4-18 10:26 编辑
什么是梯度消失?
神经元的权重w和偏置b是和激活函数的梯度成正比的,激活函数导数越大,则w,b调整越快,如果激活函数梯度很小,在反向传播时,多个小于0的导数相乘,随着神经网络层数的加深,梯度方向传播到浅层网络时,基本无法引起全职的波动,也就是没有将loss的信息传递到浅层网络,这样网络就无法训练学习了。这就是所谓的梯度消失。
以sigmoid激活函数为例:
sigmoid(x)=1/1+e^−x
该函数可以将实数压缩到开区间(0,1),其导数为:
σ′(x)=e^−x/(1+e^−x)^2=σ(x)/(1−σ(x))
函数图像如下:
数两侧十分平滑,两端无限接近0和1,只有中间一段导数较大。当x=0时,其导数取最大值0.25。选择sigmoid函数作为激活函数的优势:1)可以引入非线性;2)容易求导;3)可以将实数压缩至(0,1)
神经网络主要的训练方法是BP算法,BP算法的基础是导数的链式法则,也就是多个导数的乘积。而sigmoid的导数最大为0.25,且大部分数值都被推向两侧饱和区域,这就导致大部分数值经过sigmoid激活函数之后,其导数都非常小,多个小于等于0.25的数值相乘,其运算结果很小。
梯度消失的解决方式主要有: 1)其它激活函数激活函数对神经网络有显著的影响,现行常见的激活函数有ReLU、Leaky ReLU。 ReLU
f(x)=max(0,x)f(x)=max(
负数一侧永远为0,正数一侧导数永远为1。ReLU的优势在于:1)不饱和;2)计算效率高;3)收敛速度快。 Leaky ReLU Leaky ReLU与ReLU十分类似,只不过在负数一侧并不完全抑制,而是给予一个小的导数。
2)层归一化也即batch normalization。主要希望解决的所谓”内部协变量漂移“(internal covariate shift)问题。对于实例集合, Batch normalization的基本思想:深层神经网络在做非线性变换前的输入值在训练过程中,其分布逐渐发生偏移,之所以训练收敛慢,一般是整体分布逐渐往非线性激活函数的两端靠近,这导致了反向传播时浅层神经网络的梯度消失。而batch normalization就是通过一定的规范化手段,将每个隐层输入的分布强行拉回到均值为0方差为1的标准正态分布上去,这使得输入值落回到非线性激活函数”敏感“区域。这使得梯度变大,学习速度加快,大大提高收敛速度。 以sigmoid激活函数为例,说明batch normalization的作用。下图为均值为0,方差为1的标准正态分布: 这意味着,在1个标准差范围内,x有64%的概率落在[−1,1]范围内,x有95%的概率落在[−2,2]的范围内。 上图为sigmoid函数的导数,在[−2,2]的范围内,sigmoid函数的导数很大,而在两端饱和区,导数接近0。这也就意味着,经过batch normalization规范化后,输入值x有较大概率获得大的导数值,远离导数饱和区,从而使得梯度变大,学习速度加快,避免了梯度消失。 batch normalization的优势在于:1)大大提高训练速度,加快收敛过程;2)batch normalization是类似于dropout的正则化方法。
3)调整初始权重或者调整网络结构
|