梯度爆炸的解决办法:clip gradient

1.梯度爆炸的影响

在一个只有一个隐藏节点的网络中,损失函数和权值w偏置b构成error surface,其中有一堵墙,如下所示
 
这里写图片描述

损失函数每次迭代都是每次一小步,但是当遇到这堵墙时,在墙上的某点计算梯度,梯度会瞬间增大,指向某处不理想的位置。如果我们使用缩放,可以把误导控制在可接受范围内,如虚线箭头所示

2.解决梯度爆炸问题的方法

通常会使用一种叫”clip gradients “的方法. 它能有效地权重控制在一定范围之内.
算法步骤如下。

  • 首先设置一个梯度阈值:clip_gradient
  • 在后向传播中求出各参数的梯度,这里我们不直接使用梯度进去参数更新,我们求这些梯度的l2范数
  • 然后比较梯度的l2范数||g||与clip_gradient的大小
  • 如果前者大,求缩放因子clip_gradient/||g||, 由缩放因子可以看出梯度越大,则缩放因子越小,这样便很好地控制了梯度的范围
  • 最后将梯度乘上缩放因子便得到最后所需的梯度
     
    这里写图片描述
     

3. 有无clip_gradient在GRU模型中的结果比较

  • 无clip_gradient
     可以很清楚地发现在2000次迭代出发生了梯度爆炸,最终影响了训练的效果。
      
    这里写图片描述
     
     
  • 有clip_gradient
    可以发现clip_gradient在前期有效了控制了梯度爆炸的影响,使得最终的loss能下降到满意的结果
     
    这里写图片描述
### 解决深度学习梯度消失和梯度爆炸的方法 为了应对深度学习训练中的梯度消失和梯度爆炸问题,可以采用多种策略来稳定并加速模型的训练过程。以下是几种有效的解决方案: #### 1. 梯度裁剪 (Gradient Clipping) 梯度裁剪是一种简单而有效的方式,用于防止梯度过大而导致数值不稳定的情况。通过设定一个阈值,当某一层的梯度超过这个阈值时,将其按比例缩放至不超过该阈值的程度。 ```python import torch.nn.utils as utils utils.clip_grad_norm_(model.parameters(), max_norm=1.0) ``` 这种方法能够有效地控制梯度大小,从而避免梯度爆炸的发生[^2]。 #### 2. 使用合适的激活函数 选择具有更好梯度特性的激活函数对于缓解梯度消失至关重要。传统的Sigmoid和tanh函数容易造成饱和区间的梯度接近于零的现象;相比之下,ReLU及其变体(如Leaky ReLU, ELU)可以在一定程度上改善这一状况,因为它们不会完全抑制负输入部分的信息传递。 ```python class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.fc1 = nn.Linear(in_features, out_features) self.relu = nn.ReLU() def forward(self, x): x = self.fc1(x) x = self.relu(x) return x ``` 这些改进型激活函数有助于保持信号强度,减少梯度消失的可能性。 #### 3. Batch Normalization 批标准化(BatchNorm)不仅可以加快收敛速度,还可以减轻内部协变量偏移带来的负面影响。它通过对每一层输出做归一化处理,使得各层之间的数据分布更加一致,进而降低了梯度消失的风险。 ```python class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.bn = nn.BatchNorm1d(num_features=out_features) def forward(self, x): x = self.bn(x) return x ``` 此操作能够在不改变原有架构的前提下显著提升性能表现。 #### 4. 构建残差连接或跳跃连接 引入跳过某些层次的设计理念——即所谓的“捷径”,可以让信息更顺畅地从前端传送到末端,即使在网络非常深的情况下也能维持良好的梯度流动特性。ResNet就是一个典型例子,利用这种机制成功解决了极深层次下的优化难题。 ```python def residual_block(x): shortcut = x # 假设这里有一些卷积层和其他组件构成的基础block output = basic_block(x) result = shortcut + output return result ``` 这样的设计思路极大地促进了深层网络的学习能力。 #### 5. 长短期记忆单元(LSTM) 和门控循环单元(GRU) 针对时间序列预测等问题中存在的长期依赖关系难以捕捉的问题,LSTM和GRU等特殊类型的RNN结构提供了更好的解决方案。这两种模型内置了专门用来管理历史状态的记忆细胞以及相应的调控门限机构,因此具备更强的时间维度上的表达力,同时也减少了传统RNN面临的梯度消失困扰[^5]。 ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值