详讲torch.nn.utils.clip_grad_norm_

Pytorch梯度截断:torch.nn.utils.clip_grad_norm_

梯度裁剪:

既然在BP过程中会产生梯度消失(即偏导无限接近0,导致长时记忆无法更新),那么最简单粗暴的方法,设定阈值,当梯度小于阈值时,更新的梯度为阈值(梯度裁剪解决的是梯度消失或爆炸的问题,即设定阈值),如下图所示:

详讲torch.nn.utils.clip_grad_norm__第1张图片

详讲torch.nn.utils.clip_grad_norm__第2张图片

torch.nn.utils.clip_grad_norm_(parameters, max_norm, norm_type=2)

函数定义:裁剪可迭代参数的渐变范数,范数是在所有梯度一起计算的,就好想他们被连接成单个矢量一样,渐变是就地修改的。

原理:对网络所有参数求范数,和最大梯度阈值相比,如果clip_coef < 1,范数大于阈值,则所有梯度值乘以系数。

参数列表:

  • parameters(Iterable[Tensor]或Tensor)——一个由张量或单个张量组成的可迭代对象(模型参数),将梯度归一化、
  • max_norm:(float or int)——梯度的最大范数
  • norm_type:(float or int)——所使用的范数类型

使用:

optimizer.zero_grad()        
loss, hidden = model(data, hidden, targets)
loss.backward()
 
torch.nn.utils.clip_grad_norm_(model.parameters(), args.clip)
optimizer.step()

但是,clip_grad_norm还不够狠,有时候失效,这个时候更狠的就出来了:

torch.nn.utils.clip_grad_value_(model.parameters(), number)

你可能感兴趣的:(pytorch,深度学习,机器学习)