详解torch.nn.utils.clip_grad_norm_ 的使用与原理


免费链接: Blogger(需翻Q)


clip_grad_norm_的原理

本文是对梯度剪裁: torch.nn.utils.clip_grad_norm_()文章的补充。所以可以先参考这篇文章

从上面文章可以看到,clip_grad_norm最后就是对所有的梯度乘以一个clip_coef,而且乘的前提是clip_coef一定是小于1的,所以,按照这个情况:clip_grad_norm只解决梯度爆炸问题,不解决梯度消失问题

clip_grad_norm_参数的选择(调参)

从上面文章可以看到,clip_coef的公式为:

### 对两个模型应用 `torch.nn.utils.clip_grad_norm_` 在 PyTorch 中,`torch.nn.utils.clip_grad_norm_` 函数可以应用于单个或多个模型的参数。为了对两个不同的模型应用此操作,需要分别调用该函数并传递相应模型的参数。 #### 方法一:单独处理每个模型 对于两个独立的模型,可以在各自的优化器更新之前分别执行梯度裁剪: ```python import torch from torch import nn # 假设有两个模型 model1 和 model2 model1 = nn.Sequential(nn.Linear(10, 5), nn.ReLU()) model2 = nn.Sequential(nn.Linear(5, 2), nn.Sigmoid()) optimizer1 = torch.optim.Adam(model1.parameters(), lr=0.001) optimizer2 = torch.optim.Adam(model2.parameters(), lr=0.001) loss_fn = nn.MSELoss() input_data = torch.randn((8, 10)) target = torch.randn((8, 2)) output1 = model1(input_data) output2 = model2(output1) loss = loss_fn(output2, target) # 清除之前的梯度 optimizer1.zero_grad() optimizer2.zero_grad() # 反向传播损失 loss.backward() # 应用 clip_grad_norm_ max_norm = 1.0 norm_type = 2.0 torch.nn.utils.clip_grad_norm_(model1.parameters(), max_norm=max_norm, norm_type=norm_type)[^1] torch.nn.utils.clip_grad_norm_(model2.parameters(), max_norm=max_norm, norm_type=norm_type) # 更新权重 optimizer1.step() optimizer2.step() ``` 这种方法适用于完全分离的两组网络结构,在实际项目里较为常见。 #### 方法二:组合成单一列表一起处理 如果希望简化代码逻辑或将这两个模型视为整体的一部分,则可以把它们的所有可训练参数收集到同一个列表中再做统一管理: ```python combined_parameters = list(model1.parameters()) + list(model2.parameters()) torch.nn.utils.clip_grad_norm_(combined_parameters, max_norm=max_norm, norm_type=norm_type) ``` 这种方式适合于那些共享某些层或者紧密关联的任务场景下使用
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iioSnail

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值