梯度裁剪(Gradient Clipping)
梯度裁剪(Gradient Clipping)是一种用于防止梯度爆炸(Gradient Explosion)的技能,具体来说:1. 梯度裁剪的作用
[*] 标题背景:在训练深度神经网络(尤其是RNN/LSTM)时,反向传播过程中梯度大概会变得非常大(称为"梯度爆炸"),导致参数更新幅度过大,模型无法收敛。
[*] 解决方案:梯度裁剪通过限定梯度向量的最大范数(magnitude)来稳定训练。
2. 代码表明
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
[*] model.parameters():获取模型中全部需要梯度更新的参数
[*] max_norm=1.0:答应的梯度最大范数(常用值0.5~5.0)
[*] clip_grad_norm_:原地修改全部参数的梯度(带下划线表现原地操作)
3. 数学原理
假设全部参数的梯度组成一个向量 g,裁剪操作如下:
[*] 盘算梯度范数:‖g‖ = sqrt(∑gᵢ²)
[*] 如果 ‖g‖ > max_norm:
[*] 缩放梯度:g = g × (max_norm / ‖g‖)
4. 使用场景
通常在loss.backward()之后、optimizer.step()之前调用:
for batch in dataloader:
loss = model(batch) # 前向传播
loss.backward() # 反向传播
# 梯度裁剪(关键位置!)
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
optimizer.step() # 参数更新
optimizer.zero_grad() # 梯度清零 5. 直观理解
想象你在下山(优化丧失函数):
[*] 正常情况:沿着平缓的坡度逐步下降(梯度适中)
[*] 梯度爆炸:忽然遇到悬崖,直接跳下去(梯度极大)
[*] 梯度裁剪:给悬崖装上安全绳,限定最大步幅
6. 参数选择发起
典范值适用场景0.5非常敏感的模型(如深层Transformer)1.0通用保举值(LSTM/CNN等)5.0较简单的模型 7. 对比其他方法
方法长处缺点梯度裁剪简单直接,通用性强需要手动选择max_norm权重初始化预防性步伐不能完全防止爆炸改用LSTM/GRU布局上更稳定盘算本钱略高 发起在训练RNN、Transformer等模型时默认添加梯度裁剪,这是实践中稳定训练的常用技巧。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]