**
网络退化、梯度消失、梯度爆炸
**
网络退化:在增加网络层数的过程中,training accuracy 逐渐趋于饱和,继续增加层数,training accuracy 就会出现下降的现象,而这种下降不是由过拟合造成的。实际上较深模型后面添加的不是恒等映射,而是一些非线性层。因此,退化问题也表明了:通过多个非线性层来近似恒等映射可能是困难的。
恒等映射亦称恒等函数:是一种重要的映射,对任何元素,象与原象相同的映射
解决方案:学习残差。Resnet正是基于此问题提出。
梯度消失/梯度爆炸:二者问题问题都是因为网络太深,网络权值更新不稳定造成的。本质上是因为梯度反向传播中的连乘效应(小于1连续相乘多次)。
反向传播更新参数w的更新过程,对于参数。梯度消失时,越靠近输入层的参数w越是几乎纹丝不动;梯度爆炸时,越是靠近输入层的参数w越是上蹿下跳。稳定和突变都不是我们想要的,我们想要的是参数w朝着误差减小的方向稳步变化。
在反向传播过程中需要对激活函数进行求导,如果导数大于1,那么随着网络层数的增加梯度更新将会朝着指数爆炸的方式增加这就是梯度爆炸。同样如果导数小于1,那么随着网络层数的增加梯度更新信息会朝着指数衰减的方式减少这就是梯度消失。因此,梯度消失、爆炸,其根本原因在于反向传播训练法则,属于先天不足。
如何确定是否出现梯度爆炸?
模型无法从训练数据中获得更新(如低损失)。
模型不稳定,导致更新过程中的损失出现显著变化。
训练过程中,模型损失变成 NaN。
梯度消失/爆炸解决方案:
-
重新设计网络模型
梯度爆炸可以重新设计层数更少的网络来解决,使用更小的批尺寸对网络训练也有好处;也可能是学习率过大导致的问题,减小学习率。 -
使用 ReLU 激活函数
梯度爆炸的发生可能是因为激活函数,如之前很流行的 Sigmoid 和 Tanh 函数。使用 ReLU 激活函数可以减少梯度爆炸。采用 ReLU 激活函数是最适合隐藏层的,是目前使用最多的激活函数。
relu函数的导数在正数部分是恒等于1的,因此在深层网络中使用relu激活函数就不会导致梯度消失和爆炸的问题。
relu的优点在于:
解决了梯度消失、爆炸的问题;计算方便,计算速度快, 加速了网络的训练
缺点在于:
由于负数部分恒为0,会导致一些神经元无法激活(可通过设置小学习率部分解决)输出不是以0为中心的
leakrelu
leak relu就是为了解决relu的0区间带来的影响,而且包含了relu的所有优点,其中k是leak系数,一般选择0.01或者0.02,或者通过学习而来。
elu
elu激活函数也是为了解决relu的0区间带来的影响,但是elu相对于leakrelu来说,计算要更耗时间一些。
3. 使用长短期记忆网络LSTM(Long Short-Term Memory)
在循环神经网络中,梯度爆炸的发生可能是因为某种网络的训练本身就存在不稳定性,使用长短期记忆(LSTM)单元和相关的门类型神经元结构可以减少梯度爆炸问题。采用 LSTM 单元是适合循环神经网络的序列预测的最新最好实践。
4. 使用梯度截断(Gradient Clipping)
梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内,这可以防止梯度爆炸。
5. 权重正则化(Weight Regularization)
如果梯度爆炸仍然存在,可以尝试检查网络权重的大小,并惩罚产生较大权重值的损失函数,该过程被称为权重正则化。通常使用的是 L1 惩罚项(权重绝对值)或 L2 惩罚项(权重平方)。
事实上,在深度神经网络中,往往是梯度消失出现的更多一些。
6、预训练加finetunning
其基本思想是每次训练一层隐藏层节点,将上一层隐藏层的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,这就是逐层预训练。在预训练完成后,再对整个网络进行“微调”(fine-tunning)。Hinton在训练深度信念网络(Deep Belief Networks中,使用了这个方法,在各层预训练完成后,再利用BP算法对整个网络进行训练。此思想相当于是先寻找局部最优,然后整合起来寻找全局最优,此方法有一定的好处,但是目前应用的不是很多了。现在基本都是直接拿imagenet的预训练模型直接进行finetunning。
7、批量归一化
Batchnorm具有加速网络收敛速度,提升训练稳定性的效果,Batchnorm本质上是解决反向传播过程中的梯度问题。batchnorm全名是batch normalization,简称BN,即批规范化,通过规范化操作将输出信号x规范化保证网络的稳定性。
8、残差结构
残差网络的出现导致了image net比赛的终结,自从残差提出后,残差可以很轻松的构建几百层,一千多层的网络而不用担心梯度消失过快的问题,原因就在于残差的捷径(shortcut)部分,残差网络通过加入 shortcut connections,变得更加容易被优化。包含一个 shortcut connection 的几层网络被称为一个残差块(residual block)。