PyTorch梯度裁剪避免训练loss nan的操作

在训练深度学习模型时遇到loss为nan的问题,通过引入PyTorch的torch.nn.utils.clip_grad_norm_进行梯度裁剪解决了这一问题。在训练代码中,在损失函数反向传播后,对模型参数的梯度进行裁剪,限制最大范数为20,防止梯度爆炸。此外,检查除0、log0等操作,确保在优化器.step()前后正确处理梯度,以及适当调整学习率和优化器,都是排查nan损失的有效方法。
摘要由CSDN通过智能技术生成

近来在训练检测网络的时候会出现loss为nan的情况,需要中断重新训练,会很麻烦。因而选择使用PyTorch提供的梯度裁剪库来对模型训练过程中的梯度范围进行限制,修改之后,不再出现loss为nan的情况。

PyTorch中采用torch.nn.utils.clip_grad_norm_来实现梯度裁剪,链接如下:

torch.nn.utils.clip_grad — PyTorch 1.10 documentation

训练代码使用示例如下:

1

2

3

4

5

6

7

8

from torch.nn.utils import clip_grad_norm_

outputs = model(data)

loss= loss_fn(outputs, target)

optimizer.zero_grad()

loss.backward()

# clip the grad

clip_grad_norm_(model.parameters(), max_norm=20, norm_type=2)

optimizer.step()

其中,max_norm为梯度的最大范数,也是梯度裁剪时主要设置的参数。

备注:网上有同学提醒在(强化学习)使用了梯度裁剪之后训练时间会大大增加。目前在我的检测网络训练中暂时还没有碰到这个问题,以后遇到再来更新。

补充:pytorch训练过程中出现nan的排查思路

1、最常见的就是出现了除0或者log0这种

看看代码中在这种操作的时候有没有加一个很小的数,但是这个数数量级要和运算的数的数量级要差很多。一般是1e-8。

2、在optim.step()之前裁剪梯度

1

2

3

4

optim.zero_grad()

loss.backward()

nn.utils.clip_grad_norm(model.parameters, max_norm, norm_type=2)

optim.step()

max_norm一般是1,3,5。

3、前面两条还不能解决nan的话

就按照下面的流程来判断。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

...

loss = model(input)

# 1. 先看loss是不是nan,如果loss是nan,那么说明可能是在forward的过程中出现了第一条列举的除0或者log0的操作

assert torch.isnan(loss).sum() == 0, print(loss)

optim.zero_grad()

loss.backward()

# 2. 如果loss不是nan,那么说明forward过程没问题,可能是梯度爆炸,所以用梯度裁剪试试

nn.utils.clip_grad_norm(model.parameters, max_norm, norm_type=2)

# 3.1 在step之前,判断参数是不是nan, 如果不是判断step之后是不是nan

assert torch.isnan(model.mu).sum() == 0, print(model.mu)

optim.step()

# 3.2 在step之后判断,参数和其梯度是不是nan,如果3.1不是nan,而3.2是nan,

# 特别是梯度出现了Nan,考虑学习速率是否太大,调小学习速率或者换个优化器试试。

assert torch.isnan(model.mu).sum() == 0, print(model.mu)

assert torch.isnan(model.mu.grad).sum() == 0, print(model.mu.grad)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值