独家连载 | 梯度消失和梯度爆炸

4.6 梯度消失与梯度爆炸

4.6.1 梯度消失

根据上文BP算法中的推导,我们从公式4.44,4.45,4.46中可以知道,权值的调整ΔW是跟学习信号δ相关的。同时我们从4.41,4.42,4.43中可以知道在学习信号δ表达式中存在f ’ (x)。也就是说激活函数的导数会影响学习信号δ的值,而学习信号δ的值会影响权值调整ΔW的值。那么激活函数的值越大,ΔW的值就越大;激活函数的值越小,ΔW的值也就越小。

假设激活函数为sigmoid函数,前文中我们已经知道了sigmoid函数的表达式为:f(x)=11+e−xf(x)=\frac{1}{1+e^{-x}}f(x)=1+ex1,sigmoid函数的导数为:f′(x)=f(x)[1−f(x)]f ' (x) = f(x)[1-f(x)]f(x)=f(x)[1f(x)],我们可以画出sigmoid函数的导数图像为图4.18:
图4.18 sigmoid函数导数

这里我们发现当x=0时,sigmoid函数导数可以取得最大值0.25。x取值较大或较小时,sigmoid函数的导数很快就趋向于0。不管怎么样,sigmoid函数的导数都是一个小于1的数,学习信号δ乘以一个小于1的数,那么δ就会减小。学习信号从输出层一层一层向前反向传播的时候,每传播一层学习信号就会变小一点,经过多层传播后,学习信号就会接近于0,从而使得权值ΔW调整接近于0。ΔW接近于0那就意味着该层的参数不会发生改变,不能进行优化。参数不能优化,那整个网络就不能再进行学习了。学习信号随着网络传播逐渐减小的问题也被称为**梯度消失(vanishing gradient)**的问题。

我们再考虑一下tanh函数的导数,tanh函数的表达式为:f(x)=ex−e−xex+e−xf(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}f(x)=ex+exexex,tanh函数的导数为:f′(x)=1−(f(x))2f ' (x) = 1- (f(x))^2f(x)=1(f(x))2 ,tanh函数的导数如图4.19:
图4.19 tanh函数导数

tanhtanhtanh函数导数图像看起来比sigmoid函数要好一些,x=0时,tanhtanhtanh函数导数可以取得最大值1。x取值较大或较小时,tanhtanhtanh函数的导数很快就趋向于0。不管怎么样,tanhtanhtanh函数导数的取值总是小于1的,所以tanh作为激活函数也会存在梯度消失的问题。

对于softsign函数,softsign函数的表达式为:f(x)=x1+∣x∣f(x)=\frac{x}{1+|x|}f(x)=1+xx,softsign函数的导数为:f′(x)=1(1+∣x∣)2f '(x)=\frac{1}{(1+|x|)^2}f(x)=(1+x)21,softsign函数的导数如图4.20:
图4.20 softsign函数导数

softsign函数x=0时,softsign函数导数可以取得最大值1。x取值较大或较小时,softsign函数的导数很快就趋向于0。不管怎么样,softsign函数导数的取值总是小于1的,所以softsign作为激活函数也会存在梯度消失的问题。

4.6.2 梯度爆炸

当我们使用sigmoid,tanh和softsign作为激活函数时,它们的导数取值范围都是小于等于1的,所以会产生梯度消失的问题。那么我们可能会想到,如果使用导数大于1的函数作为激活函数,情况会如何?

如果学习信号δ乘以一个大于1的数,那么δ就会变大。学习信号从输出层一层一层向前反向传播的时候,每传播一层学习信号就会变大一点,经过多层传播后,学习信号就会接近于无穷大,从而使得权值ΔW调整接近于无穷大。ΔW接近于无穷大那就意味着该层的参数,处于一种极不稳定的状态,那么网络就不能正常工作了。学习信号随着网络传播逐渐增大的问题也被称为**梯度爆炸(exploding gradient)**的问题。

4.6.3 使用ReLU函数解决梯度消失和梯度爆炸的问题

我们知道ReLU的表达式为:f(x) = max(0,x)。当x小于0时,f(x)的取值为0;当x大于0时,f(x)的取值等于x。ReLU函数的导数如图4.21:
图4.21 ReLU函数导数

前面我们讨论了当激活函数的导数小于1时,网络会产生梯度消失,激活函数的导数大于1时,网络会产生梯度爆炸。那么当我们使用ReLU作为激活函数的时候,x小于0时,ReLU的导数为0;x大于0时,ReLU的导数为1。导数为1是一个很好的特性,不会使得学习信号越来越小,也不会让学习信号越来越大,可以让学习信号比较稳定地从后向前传播。解决了梯度消失和梯度爆炸的问题,同时计算方便,可以加速网络的训练。

ReLU也存在缺点,由于x小于0的部分f(x)的取值恒定为0,会导致一些神经元无法激活。

不过总的来说,ReLU还是优点大于缺点的,所以在一些比较深层的神经网络中,通常都会使用ReLU作为神经网络的激活函数。

除此之外可能我们还会想到线性激活函数y = x 的导数也是等于1,也可以克服梯度消失和梯度爆炸的问题。不过之前我们也多次提到线性激活函数不会能描绘非线性的分类边界,所以无法处理非线性问题。因此线性函数依旧不算是一个好的激活函数。

作者介绍

### 梯度消失梯度爆炸问题的原因 在深度神经网络训练过程中,梯度消失梯度爆炸是两个常见的问题,它们源于反向传播算法中的链式求导机制。当网络层数增加时,这些现象会更加显著,从而影响模型的收敛性能。 梯度消失是指在反向传播过程中,计算得到的梯度值逐渐缩小,最终接近于零。这种现象通常发生在深层网络中,特别是当激活函数导数小于1时,梯度在逐层传递过程中会被不断缩小,导致前几层的权重几乎无法更新,从而阻碍学习过程[^3]。 与之相反,梯度爆炸则表现为梯度值在反向传播过程中被不断放大,可能超过数值计算的范围,导致权重更新异常剧烈,甚至引发数值不稳定或模型崩溃。这种情况通常发生在网络结构设计不当或初始化不当时,例如权重初始化值过大[^2]。 --- ### 梯度消失梯度爆炸的影响 梯度消失梯度爆炸都会显著影响深度神经网络的训练效果。具体而言: - **梯度消失**会导致模型训练缓慢甚至停滞,特别是在深层网络中,前几层的权重更新几乎为零,使得模型难以学习到有效的特征表示[^2]。 - **梯度爆炸**则会导致权重更新幅度过大,使得优化过程不稳定,模型可能无法收敛,甚至出现数值溢出等问题[^3]。 这些现象在深度学习模型中尤为突出,尤其是在使用Sigmoid或Tanh等饱激活函数时,梯度消失问题更为严重。 --- ### 解决方法 为了解决梯度消失梯度爆炸问题,研究者提出了一系列有效的策略,主要包括以下几种: #### 1. 残差连接(Residual Connections) 残差网络(ResNet)通过引入跳跃连接(skip connection),允许梯度直接从前向传播到后层,从而缓解梯度消失问题。这种结构使得网络能够学习残差函数,而不是直接拟合原始映射函数,从而提高了深层网络的可训练性。 ```python class ResidualBlock(nn.Module): def __init__(self, in_channels): super(ResidualBlock, self).__init__() self.conv1 = nn.Conv2d(in_channels, in_channels, kernel_size=3, padding=1) self.bn1 = nn.BatchNorm2d(in_channels) self.relu = nn.ReLU() self.conv2 = nn.Conv2d(in_channels, in_channels, kernel_size=3, padding=1) self.bn2 = nn.BatchNorm2d(in_channels) def forward(self, x): residual = x x = self.relu(self.bn1(self.conv1(x))) x = self.bn2(self.conv2(x)) x += residual x = self.relu(x) return x ``` #### 2. 激活函数的选择 使用ReLU(Rectified Linear Unit)及其变体(如Leaky ReLU、ELU)可以有效缓解梯度消失问题。ReLU在正区间导数恒为1,避免了梯度在反向传播过程中被压缩,从而提升了深层网络的训练效率。 #### 3. 批归一化(Batch Normalization) 批归一化通过在每一层对输入进行标准化处理,使得数据分布更加稳定,从而减少梯度消失梯度爆炸的发生概率。此外,它还能加速训练过程并提升模型的泛化能力。 #### 4. 权重初始化策略 采用合适的权重初始化方法,如Xavier初始化He初始化,可以避免初始梯度过大或过小的问题。He初始化特别适用于ReLU激活函数,在深层网络中表现出良好的训练稳定性[^2]。 #### 5. 梯度裁剪(Gradient Clipping) 对于梯度爆炸问题,可以在优化过程中使用梯度裁剪技术,将梯度的范数限制在一个合理范围内,防止其过大导致模型不稳定。该方法在循环神经网络(RNN)等结构中尤为常见。 #### 6. 网络结构优化 除了残差连接,还可以采用DenseNet中的密集连接结构,使得每一层都能直接接收前面所有层的输出,增强信息流动,进一步缓解梯度消失问题。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Qin_bf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值