笔记:Pytorch梯度截断:torch.nn.utils.clip_grad_norm_
torch.nn.utils.clip_grad_norm_梯度裁剪既然在BP过程中会产生梯度消失(就是偏导无限接近0,导致长时记忆无法更新),那么最简单粗暴的方法,设定阈值,当梯度小于阈值时,更新的梯度为阈值,(梯度裁剪解决的是梯度消失或爆炸的问题,即设定阈值)如下图所示1:函数torch.nn.utils.clip_grad_norm_(parameters, max_norm, norm_t
·
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条内容
所有评论(0)