torch.nn.utils.clip_grad_norm_

梯度裁剪

为了缓解在BP过程中产生的梯度爆炸(就是偏导很大,甚至出现NAN,导致神经网络参数无法正常更新)最简单粗暴的方法,设定阈值,当梯度超过阈值时,强制把梯度设置为最大阈值(梯度裁剪解决的是梯度爆炸的问题,即设定阈值)如下图所示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’)

使用实例

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 ↩︎

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐