目录
1.激活函数换用Relu、LeakyRelu、Elu等激活函数
深度神经网络中的梯度不均衡问题
深度神经网络在训练过程中,梯度下降反向求梯度过程中,越靠前边的隐藏层的梯度越小,甚至最后就没有梯度了,这就是梯度消失;反过来说后边的梯度都很大就是梯度爆炸。 这种情况随深度增加会更加严重,导致网络后边几层的贡献远大于前边几层的贡献。
梯度消失很大程度上和激活函数有关,比如sigmoid激活函数:
的图像如下:
sigmoid 的导数:
sigmoid 导数
的图像如下:
从它的导数图来看的值在[-5,5]之间,0附近梯度是有值的,而且梯度
范围在[0,0.25]之间。
假设隐层的所有层都使用sigmoid,除了第一层的输入,最后一层的输出,其他层的输入输出都是0到1,那么反向更新的过程中梯度变化如下:
在[0,1]之间,
梯度值范围均在[0.2,0.25]之间,因为反向传播是链式求导,求解越靠近输入层的导数,需要连乘靠近输出层的各节点导数,对于深层网络来说越靠近输入层导数越小,也就是梯度越小,直至消失。
上图中 x y z为节点的输出值 ,都可看作 ,f 为激活函数。
梯度消失的一些解决方法
1.激活函数换用Relu、LeakyRelu、Elu等激活函数
结构详解详见:深度学习激活函数中的线性整流函数ReLU及其变种_RayChiu757374816的博客-CSDN博客
2.Normalization标准化
如果不换激活函数,依然用类似sigmoid 这样容易梯度消失的激活函数我们如何优化,达到尽可能的避免梯度消失呢,我们由上边sigmoid的图可知,z的值在0附近,绝对值比较小的时候梯度值较大,因此可以控制z的大小来放缓消失的速度(最终还是会消失),而z=xw ,从数据x的角度来说,我们可以采用BN这样的数据归一化来实现效果。
标准化:详细讲解深层神经网络DNN_RayChiu757374816的博客-CSDN博客
3.权重初始化
正如上一条所说,控制z还可以通过初始化w参数来实现。
4.ResNet残差网络:
层间残差跳连,引入前方信息,减少梯度消失,使神经网络层数变深成为可能。
5.LSTM结构:
LSTM 是为了解决 RNN 的 Gradient Vanish 的问题所提出的,不会梯度消失的主要原因在于LSTM内部复杂的“门(gates)设计。
6.预训练加微调:
此方法来自Hinton在06年发表的论文上,其基本思想是每次训练一层隐藏层节点,将上一层隐藏层的输出作为输入,而本层的输出作为下一层的输入,这就是逐层预训练。
训练完成后,再对整个网络进行“微调(fine-tunning)”。
此方法相当于是找全局最优,然后整合起来寻找全局最优,但是现在基本都是直接拿imagenet的预训练模型直接进行finetunning。
7.梯度剪切、正则
梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设值一个剪切阈值,如果更新梯度时,梯度超过了这个阈值,那么就将其强制限制在这个范围之内。这样可以防止梯度爆炸。
另一种防止梯度爆炸的手段是采用权重正则化,正则化主要是通过对网络权重做正则来限制过拟合,但是根据正则项在损失函数中的形式可以知道,如果发生梯度爆炸,那么权值的范数就会变的非常大,反过来,通过限制正则化项的大小,也可以在一定程度上限制梯度爆炸的发生。