为什么sigmoid会造成梯度消失?

本文通过数学分析探讨了在神经网络中使用sigmoid激活函数时梯度消失的现象。文章指出,当网络深度增加时,梯度在反向传播过程中逐渐减小,导致靠近输入层的权重几乎无法更新,从而影响模型的学习能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里仅仅做一些数学上的简单分析,首先看sigmoid的公式:

sigmoid= \sigma(z) = \frac{1}{1+e^{-z}}

它的导数:

\sigma(z)' = \frac{e^{-z}}{(1+e^{-z})^2}=\sigma (z)*(1-\sigma(z))

\sigma(z)的图像如下:

也就是说任何输入都会被缩放到0到1,如果隐层的所有layer都使用sigmoid,除了第一层的输入,最后一层的输出,其他层的输入输出都是0到1,看看\sigma(z)'的完整图像:

z大概在-5到5之间,\sigma(z)'才有值,而除第一层隐层的输入都在0到1之间,所以\sigma(z)'的图像如下:

\sigma(z)'最终取值大概0.2到0.25之间,下面以一个简单的神经原结构举例:

\frac{\partial L}{\partial z} = \sigma '(z)(w1 \frac{\partial L}{\partial z'}+w2 \frac{\partial L}{\partial z''})

\frac{\partial L}{\partial w} = \frac{\partial L}{\partial z} \frac{\partial z}{\partial w}=a\frac{\partial L}{\partial z}

由于\sigma(z)'会把\frac{\partial L}{\partial z}缩小4至5倍,而这个\frac{\partial L}{\partial z}又会影响前一层的\frac{\partial L}{\partial z},反向下去,每一层的\frac{\partial L}{\partial z}在不断被缩小,深度越深这种连锁反应越明显,越靠近输入层越小,\frac{\partial L}{\partial w}中a又是0到1之间的梯度再次被整体缩小,这里主要考虑了\sigma '(z)以及\frac{\partial L}{\partial z}的传递性以及输入a带来的影响,我认为权重w只会对局部的\frac{\partial L}{\partial z}带来影响,而\sigma(z)'带来的这种连续缩小的影响将传递到计算前层的\frac{\partial L}{\partial z}中。

梯度消失带来的影响,靠近输入层的参数几乎不能被更新,靠近输入层的layer预测结果不准确,产生对整个后面的影响,最后无法训练。

### BN(Batch Normalization)如何防止梯度消失和梯度爆炸 Batch Normalization 通过归一化每一层的输入,有效缓解了梯度消失和梯度爆炸问题,其作用机制可以从以下几个方面进行分析。 #### 1. **缓解梯度消失问题** 梯度消失通常出现在使用如 Sigmoid 或 Tanh 等饱和激活函数的深层网络中。在反向传播过程中,当输入值远离激活函数的线性区域时,其导数趋近于零,导致梯度在多层传播过程中迅速衰减,参数更新缓慢,训练效率降低[^4]。 Batch Normalization 通过对输入数据进行标准化处理,使得每一层的输入分布在激活函数的敏感区域(例如 Sigmoid 的中间线性部分),从而避免了输入值过大或过小导致的导数趋近于零的问题。这种归一化操作提高了反向传播过程中梯度的有效性,加快了参数更新的速度[^4]。 #### 2. **缓解梯度爆炸问题** 梯度爆炸通常由权重初始化不当引起,当权重值过大时,激活值的分布也会扩大,导致反向传播过程中梯度以指数形式增长,造成参数更新不稳定[^2]。 Batch Normalization 通过将每一层的输入规范化为均值为 0、方差为 1 的分布,有效限制了激活值的范围,从而避免了因输入值过大而引发的梯度异常增长。这种归一化机制在一定程度上抑制了梯度爆炸的发生[^3]。 #### 3. **稳定网络训练过程** Batch Normalization 在每一层的输入上引入了均值和方差的标准化操作,使得网络各层的输入分布更加稳定,减少了内部协方差偏移(Internal Covariate Shift)的影响。这种分布的稳定性不仅提高了训练效率,还使得网络对权重初始化的敏感度降低,从而进一步缓解了梯度消失和梯度爆炸的风险[^1]。 此外,BN 层还引入了可学习的缩放因子 γ 和偏移因子 β,允许网络根据需要调整归一化后的分布,从而保留模型的表达能力[^3]。 #### 4. **允许使用更大的学习率** 由于 Batch Normalization 限制了输入分布的范围,使得损失函数的梯度更加平滑,优化过程更加稳定。因此,在训练过程中可以使用更大的学习率而不会导致参数更新的剧烈震荡,进一步提升了训练速度和稳定性。 ### 示例代码 以下是一个在 PyTorch 中使用 BatchNorm1d 的简单示例: ```python import torch import torch.nn as nn # 定义一个包含 Batch Normalization 的简单网络 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.linear = nn.Linear(10, 50) self.bn = nn.BatchNorm1d(50) self.relu = nn.ReLU() def forward(self, x): x = self.linear(x) x = self.bn(x) x = self.relu(x) return x # 创建模型和输入数据 model = Net() input_data = torch.randn(32, 10) # batch_size=32, input_dim=10 output = model(input_data) ``` 在这个示例中,`nn.BatchNorm1d` 对线性层输出的每一维进行归一化处理,使得后续的激活函数输入分布更加稳定。 ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值