什么是梯度消失问题介绍
在神经网络中,当前面隐藏层的学习速率低于后面隐藏层的学习速率,即随着隐藏层数目的增加,分类准确率反而下降了。这种现象叫做消失的梯度问题。
梯度消失问题简介
图1是神经网络在训练过程中, 随epoch增加时各种隐藏层的学习率变化。
两个隐藏层:
三个隐藏层:
四个隐藏层:
可以看到:前面的隐藏层的学习速度要低于后面的隐藏层。这种现象普遍存在于神经网络之中, 叫做消失的梯度问题(vanishing gradient problem)。更加一般地说,在深度神经网络中的梯度是不稳定的,在前面的层中或会消失,或会激增。这种不稳定性才是深度神经网络中基于梯度学习的根本问题。
梯度消失问题产生原因
图2是一个极简单的深度神经网络:每一层都只有一个单一的神经元。
代价函数C对偏置b1的偏导数的结果计算如下:
sigmoid 函数导数的图像如图3:
该导数在σ′(0) = 1/4时达到最高。如果我们使用标准方法来初始化网络中的权重,那么会使用一个均值为0 标准差为1 的高斯分布。因此所有的权重通常会满足|wj|<1。从而有wjσ′(zj) < 1/4。这就是消失的梯度出现的本质原因。
根本的问题其实并非是消失的梯度问题或者激增的梯度问题,而是在前面的层上的梯度是来自后面的层上项的乘积。所以神经网络非常不稳定。唯一可能的情况是以上的连续乘积刚好平衡大约等于1,但是这种几率非常小。
梯度消失问题解决方案
预训练加微调
Hinton为了解决梯度的问题,提出采取无监督逐层训练方法,其基本思想是每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,此过程就是逐层“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)。Hinton在训练深度信念网络(Deep Belief Networks中,使用了这个方法,在各层预训练完成后,再利用BP算法对整个网络进行训练。此思想相当于是先寻找局部最优,然后整合起来寻找全局最优。
梯度剪切、正则
梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。
另外一种解决梯度爆炸的手段是采用权重正则化(weithts regularization)比较常见的是l1正则,和l2正则,在各个深度框架中都有相应的API可以使用正则化,比如在tensorflow中,若搭建网络的时候已经设置了正则化参数,则调用以下代码可以直接计算出正则损失:
regularization_loss = tf.add_n(tf.losses.get_regularization_losses(scope=\'my_resnet_50\'))
如果没有设置初始化参数,也可以使用以下代码计算l2正则损失:
l2_loss = tf.add_n()
relu、leakrelu、elu等激活函数
Relu:如果激活函数的导数为1,那么就不存在梯度消失的问题了,每层的网络都可以得到相同的更新速度,relu就这样应运而生。先看一下relu的数学表达式:
其函数图像为:
可以看出,relu函数的导数在正数部分是恒等于1的,因此在深层网络中使用relu激活函数就不会导致梯度消失的问题。
relu的主要贡献在于:
1、 解决了梯度消失、爆炸的问题 -- 计算方便,计算速度快 。
2、 加速了网络的训练
同时也存在一些缺点:
1、 由于负数部分恒为0,会导致一些神经元无法激活(可通过设置小学习率部分解决) 2. 输出不是以0为中心的。
leakrelu解决了relu的0区间带来的影响,其数学表达为:
其中k是leak系数,一般选择0.01或者0.02,或者通过学习而来。
elu激活函数也是为了解决relu的0区间带来的影响,其数学表达为:
其函数及其导数数学形式为:
LSTM
LSTM全称是长短期记忆网络(long-short term memory networks),是不那么容易发生梯度消失的,主要原因在于LSTM内部复杂的“门”(gates),如图4,LSTM通过它内部的“门”可以接下来更新的时候“记住”前几次训练的”残留记忆“,因此,经常用于生成文本中。