梯度消失(Vanishing Gradient Problem)

梯度消失问题是深度神经网络训练中的一个常见问题,梯度消失会使得梯度值过小,甚至为 0,使得网络参数无法得到有效的更新。大白话理解的话,一个参数对应了一个特征,参数如果无法得到有效的更新,意味着模型对该特征没有进行充分的学习。

有些同学可能会想,我们有那么多几百上千的特征,少学习几个特征也没啥。其实对于我们来讲,我们希望模型能够尽可能学习到每个特征,以及特征之间的联系,得到一个性能更好的模型。

我们的目标是:不放弃每一特征。

梯度消失主要是由于反向传播算法中的链式法则导致的。链式法则指的是在反向传播算法中,每一层的梯度都是由上一层的梯度和当前层的导数相乘得到的。

而在深度神经网络中,当层数较多时,每一层的导数往往小于 1,这会导致梯度逐渐变小。当梯度逐渐变小时,越接近输入层的梯度值会变得非常小甚至接近于 0,导致网络参数更新不动或无法更新,出现梯度消失问题。

梯度消失产生的原因会有多种,例如:使用带有饱和区的 sigmod 或者 tanh 激活函数。什么是带有饱和区的激活函数?

带有饱和区的激活函数是指在输入值较大或较小时,函数值趋于一个常数,称为饱和值,即函数的斜率趋近于零,此时函数不再对输入变化做出响应。

例如:常见的带有饱和区的激活函数有 sigmoid 函数和 tanh 函数。

以 sigmoid 为例,sigmoid 激活函数的导数为:\(f(x) * (1 – f(x))\),\(f(x)\) 表示 sigmoid 激活函数的输出值。由于 sigmoid 激活函数的输出值在接近边界时会接近 0 或 1,导数值非常小,并且在多层神经网络中,这种情况也非常容易出现。比如:一个包含 10 层的神经网络中,如果每个神经元的激活函数都是 sigmoid,那么传播到第 10 层时,其梯度可能会变得非常小,甚至趋近于 0,从而导致梯度消失问题。

简言之,由于 sigmoid 激活函数的导数小于 1,在反向传播时,每一层的梯度都会逐渐缩小,从而导致梯度消失。因此,在深度神经网络中,为了避免梯度消失的问题,通常会采用其他的激活函数,例如ReLU函数、LeakyReLU函数等,这些函数在反向传播时具有较为稳定的导数,可以更好地避免梯度消失问题的出现。

输入数据分布不均匀也可能会导致梯度消失问题。什么是输入数据不均匀?

输入数据分布不均匀指的是训练数据中不同特征的取值范围、分布等不同。例如,在一个分类任务中,如果某个特征的取值范围很小,而另一个特征的取值范围很大,那么模型可能更容易学习到后者特征的权重,而无法充分利用前者特征的信息。

为什么说数据分布不均匀,也是到底梯度消失的原因呢?

输入数据中某个特征值的方差很小,即:这些特征值都很接近于某个常数。方差小意味着该特征对模型的贡献就越小,例如:如果猫图片的背景色与狗图片的背景色相同,那么分类器可能无法通过背景区分猫和狗。

对于方差较大的特征,其对模型的贡献就越大,这里的贡献指的是该特征的出现有利于模型做出正确的决策。

对于方差本身就较小的特征,这里有两种情况,一种是整个数据集该特征的方差整体就很小,一种是仅仅送入网络的批次数据的方差很小,整体特征方差是可以的。

如果是第二种情况,说明该特征需要学习,由于批量训练的原因导致参数无法学习,此时通过 BN 层控制方差、分布就可以了。

如果是第一种情况,说明该特征已经不需要再学习了。此时,不再更新参数属不属于梯度消失呢?

我个人认为,应该也算。原因是,虽然有些特征方差小,无法更新。但是从模型的角度,模型认为这也是要学习的一个特征,也希望该特征能够为模型贡献更多,即:默认也认为该参数也要学习。举个栗子,比如10个人打架,其中一个人很弱,但是从打架要打赢这个角度,我们也不能放弃这个很弱的人,也要尽量发挥出它的价值。所以,此时梯度过小或者为 0 也可以理解为梯度消失。

所以,我们就需要对输入数据进行标准化或归一化,比如:神经网络中使用 BN 层来控制批量数据的分布。以及对训练样本进行重采样或增强,使得数据分布更加均匀,使得模型更好地学习到各个特征之间的关系,从而提高模型的性能。

网络结构设计不合理也可能会导致梯度消失问题。比如:网络层次过深的话,我们可以在网络中引入残差连接,像很多的大而深的模型中,都有残差连接的身影。再比如:如果输入序列太长的话,我们可以使用 LSTM 等能够缓解梯度消失的网络结构。

未经允许不得转载:一亩三分地 » 梯度消失(Vanishing Gradient Problem)
评论 (0)

8 + 7 =