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

torch.nn.utils.clip_grad_norm_

梯度裁剪

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

函数

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

官网介绍

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

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

参数列表

  • parameters (Iterable[Tensor] 或 Tensor) —— 一个由张量或单个张量组成的可迭代对象(模型参数),将梯度归一化(原文: an iterable of Tensors or a single Tensor that will have gradients normalized)
  • max_norm (float or int) – 梯度的最大范数(原文:max norm of the gradients)
  • norm_type (float or int) – 所使用的范数类型。默认为L2范数,可以是无穷大范数(‘inf’)(原文:type of the used p-norm. Can be for infinity norm.‘inf’)

返回值

参数的总范数(作为单个向量来看)。(原文:Total norm of the parameters (viewed as a single vector).)

使用实例

batch_out = model(batch_seqs, token_type_ids=batch_seq_segments, attention_mask=batch_seq_masks, labels=batch_labels)
loss = batch_out.loss
model.zero_grad()
loss.backward()
# 梯度截断
nn.utils.clip_grad_norm_(model.parameters(), max_norm=clip_grad)
optimizer.step()

参考


  1. http://www.manongjc.com/detail/9-xgaenmxqpwuinin.html ↩︎

  2. https://blog.csdn.net/qq_29340857/article/details/70574528 ↩︎

  3. https://blog.csdn.net/csnc007/article/details/97804398 ↩︎

你可能感兴趣的:(自然语言处理,pytorch,python,深度学习)