上一篇我们讲解了如何使用反向传播梯度下降法来进行参数更新,今天我们来讲讲更新参数过程中可能出现的问题:梯度消失。
首先讲解一下什么是梯度消失:梯度消失(Gradient Vanishing)是深度神经网络训练过程中常见的问题,特别是在使用基于梯度的优化算法(如反向传播)时。梯度消失指的是在网络的较深层(靠近输入层的层,因为梯度是从输出层往前传,反向传播,所以靠近输入层的层是较深层)中,梯度逐渐变得非常小,甚至接近于零,导致这些层的参数几乎没有更新,从而使得这些层无法有效地学习到数据的特征。
那么为什么会出现梯度消失的问题呢?有以下几个原因:
-
1. 链式法则的乘积效应:在深层网络中,通过链式法则计算梯度时,梯度会通过每一层逐层传播。如果每层的梯度都小于1(例如,激活函数的导数是0到1之间的值),多个小于1的数相乘会导致梯度逐渐变得非常小。
2. 激活函数的选择:某些激活函数(例如 sigmoid 和 tanh)在输入较大或较小的时候,导数接近于0,因此在深层网络中使用这些激活函数容易导致梯度消失。
3. 参数初始化:不恰当的参数初始化可能导致梯度消失问题。如果参数初始化过大或过小,激活值会偏向于某个方向,导致梯度逐渐减小。
-
梯度消失会导致以下问题:
-
-
1. 网络训练缓慢:由于深层网络中底层参数无法有效更新,网络学习速度变慢。
-
2. 网络性能下降:无法学习到深层次的抽象特征,影响网络的表征能力和泛化能力。
-
3. 梯度爆炸问题:梯度消失的对立面是梯度爆炸,即梯度变得非常大,可能导致数值不稳定和训练失败。
这么说可能有点抽象,让我们来举一个例子来说明什么是梯度消失。
假设我们有一个深度神经网络,网络结构包括多个层,并且使用 sigmoid 激活函数。考虑一个具有L层的神经网络,每个隐藏层都使用 sigmoid 激活函数:
其中Z是输入加权和,我们将使用反向传播算法来计算每一层的梯度,并观察梯度消失的现象。
-
-
设我们的网络输入是x,输出值是y^(预测值),真实标签是 y,我们使用均方误差(MSE)作为损失函数:
现在我们来计算每一层的梯度并观察梯度消失的情况。
假设我们的网络有 L 个隐藏层(不包括输入层和输出层),每个隐藏层的大小为 n,输出层的大小为 1。
前向传播
1. 输入层到第一个隐藏层:
-
2. 各隐藏层之间的传播:对于第 l 层
-
3. 最后一层到输出层:
反向传播
-
我们可以看到,由于梯度下降的链式法则,每层参数的梯度都需要乘以之前层的激活函数的导数,更新参数时 w=w-n*梯度。这里的n指学习率。而sigmiod函数的导数的取值范围是(0,0.25」,如果我们的网络非常深,梯度会从输出层传播回输入层,每经过一层梯度都会缩小。假如sigmoid求导为0.25,且网络有 10 层。那么,通过 10 层网络后,梯度的大小将变为 0.00095,这说明在网络的前几层,梯度将会变得非常接近于零,几乎无法对参数进行有效的更新,从而导致梯度消失问题。
-
为了避免梯度消失,我们可以重新选择激活函数,比如 ReLU,它在正区间具有常数梯度,有助于避免梯度消失,让我们看下他的图像:
负数部分导数为0,正数部分导数为1, 从而使梯度下降能够继续迭代。不会出现梯度消失问题。可以有效防止梯度消失现象的发生。
喜欢的话点个关注哦~会每天分享人工智能机器学习内容,回复关键字可获取相关算法数据及代码~
-