马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
梯度裁剪(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企服之家,中国第一个企服评测及商务社交产业平台。 |