什么是梯度爆炸/梯度消失?

本文探讨了深度神经网络训练时遇到的梯度消失和梯度爆炸问题,以及如何应对。针对梯度消失,建议使用ReLU激活函数和高斯权重初始化。对于梯度爆炸,可以通过梯度裁剪和使用ReLU等激活函数来控制。BatchNormalization(BN)被提出作为一种有效手段,它可以加速网络收敛,控制过拟合,降低权重初始化敏感性,并允许使用更大学习率。BN通过规范化层间信号分布,解决内在协变量转移问题,提高网络泛化能力。
部署运行你感兴趣的模型镜像

深度神经网络训练的时候,采用的是反向传播方式,该方式使用链式求导,计算每层梯度的时候会涉及一些连乘操作,因此如果网络过深。
那么如果连乘的因子大部分小于1,最后乘积的结果可能趋于0,也就是梯度消失,后面的网络层的参数不发生变化.
那么如果连乘的因子大部分大于1,最后乘积可能趋于无穷,这就是梯度爆炸

如何防止梯度消失?

sigmoid容易发生,更换激活函数为 ReLU即可。
权重初始化用高斯初始化

如何防止梯度爆炸?

1 设置梯度剪切阈值,如果超过了该阈值,直接将梯度置为该值。

2 使用ReLU,maxout等替代sigmoid
区别:

  1. sigmoid函数值在[0,1],ReLU函数值在[0,+无穷],所以sigmoid函数可以描述概率,ReLU适合用来描述实数;
  2. sigmoid函数的梯度随着x的增大或减小和消失,而ReLU不会。
  3. Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生

    图片名称

sigmoid导数最大为1/4
a的数值变化范围很小,若x数值仅在[-4,4]窄范围内会出现梯度消失,若大于4则梯度爆炸。
对于sigmoid更容易出现梯度消失。

Battch Normal

ref

解决了梯度消失与加速收敛(数据本身在0均值处)和internal covariate shift(内部神经元分布的改变) 数据分布不一致问题。
传统的深度神经网络在训练是,每一层的输入的分布都在改变,因此训练困难,只能选择用一个很小的学习速率,但是每一层用了BN后,可以有效的解决这个问题,学习速率可以增大很多倍.

  1. 通过将activation规范为均值和方差一致的手段使得原本会减小的activation的scale变大。

  2. 初始化的时候,我们的参数一般都是0均值的,因此开始的拟合y=Wx+b,基本过原点附近,如图b红色虚线。因此,网络需要经过多次学习才能逐步达到如紫色实线的拟合,即收敛的比较慢。如果我们对输入数据先作减均值操作,如图c,显然可以加快学习。更进一步的,我们对数据再进行去相关操作,使得数据更加容易区分,这样又会加快训练,如图d。 通过把梯度映射到一个值大但次优的变化位置来阻止梯度过小变化。

    图片名称

  3. 统计机器学习中的一个经典假设是“源空间(source domain)和目标空间(target domain)的数据分布(distribution)是一致的”。如果不一致,那么就出现了新的机器学习问题,如,transfer learning/domain adaptation等。
    covariate shift就是分布不一致假设之下的一个分支问题,它是指源空间和目标空间的条件概率是一致的,但是其边缘概率不同,即:对所有x∈X,Ps(Y|X=x)=Pt(Y|X=x)

,但是Ps(X)≠Pt(X)

  1. .
    对于神经网络的各层输出,由于它们经过了层内操作作用,其分布显然与各层对应的输入信号分布不同,而且差异会随着网络深度增大而增大,可是它们所能“指示”的样本标记(label)仍然是不变的,这便符合了covariate shift的定义。由于是对层间信号的分析,也即是“internal”的来由。
    因此至少0均值1方差的数据集可以减少样本分布的变化问题

  2. 使用BN训练时,一个样本只与minibatch中其他样本有相互关系;对于同一个训练样本,网络的输出会发生变化。这些效果有助于提升网络泛化能力,像dropout一样防止网络过拟合,同时BN的使用,可以减少或者去掉dropout类似的策略。

BN(Batch Normalization)层的作用

  1. 加速收敛
  2. 控制过拟合,可以少用或不用Dropout和正则
  3. 降低网络对初始化权重敏感
  4. 允许使用较大的学习率
    在每一层输入的时候,加个BN预处理操作。BN应作用在非线性映射前,即对x=Wu+b做规范化。在BN中,是通过将activation规范为均值和方差一致的手段使得原本会减小的activation的scale变大。可以说是一种更有效的local response normalization方法

PS:
Batch Norm会忽略图像像素(或者特征)之间的绝对差异(因为均值归零,方差归一),而只考虑相对差异,所以在不需要绝对差异的任务中(比如分类),有锦上添花的效果。而对于图像超分辨率这种需要利用绝对差异的任务,Batch Norm只会添乱。

参考
参考

常见问题备查
1
2
3

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.15

TensorFlow-v2.15

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

### 深度学习梯度消失梯度爆炸问题的原因及解决方案 #### 一、概念解释 梯度消失是指在网络训练过程中,随着层数增加,在反向传播时误差梯度逐渐变小甚至趋近于零的现象。这使得深层网络难以有效更新参数,从而影响模型性能和收敛速度[^1]。 相反,梯度爆炸指的是当执行反向传播算法时某些权重的梯度过大,导致这些权重值迅速增长并可能溢出的情况。这种情况同样阻碍了稳定有效的训练过程[^2]。 #### 二、原因分析 对于梯度消失而言,主要原因在于: - **激活函数的选择不当**:例如Sigmoid这样的饱和型激活函数会在输入较大或较小时输出接近极限值,此时导数值非常小,进而造成整个乘积项变得极微弱,最终引发梯度消失现象[^3]。 而对于梯度爆炸来说,则是因为: - 权重初始化不合理可能导致初始阶段部分节点上的梯度异常增大;另外,在RNN类结构里由于时间跨度较长也会累积较大的梯度变化幅度。 #### 三、解决方案探讨 针对上述两种情况可以采取如下措施加以改善: ##### (一)缓解梯度消失的方法 - 使用ReLU及其变体作为激活单元代替传统的Sigmoid/Tanh等容易引起饱和效应的功能模块; - 应用Batch Normalization技术对每一层的数据分布进行标准化处理,有助于保持合理的梯度范围; - 合理设置权重矩阵W的初值规模,采用Xavier/Glorot均匀分布或者He正态分布等方式来进行随机赋值操作。 ##### (二)防止梯度爆炸的技术手段 - 实施Gradient Clipping策略限制每次迭代期间允许的最大绝对梯度大小; - 对于循环神经元架构下的长期依赖建模任务可考虑引入LSTM/GRU机制替代标准版RNN单元以更好地控制记忆状态传递路径上可能出现的信息流失风险; - 类似地调整优化器的学习率参数也有助于抑制过激波动趋势的发生发展。 ```python import torch.nn as nn class Model(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(Model, self).__init__() # Using ReLU activation function to mitigate vanishing gradient problem self.fc1 = nn.Linear(input_size, hidden_size) self.relu = nn.ReLU() self.fc2 = nn.Linear(hidden_size, output_size) def forward(self, x): out = self.fc1(x) out = self.relu(out) # Applying ReLU after linear transformation out = self.fc2(out) return out ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值