神经网络在反向传播的过程中会产生梯度消失/梯度爆炸的问题,梯度消失/爆炸会导致网络中的参数长时间无法更新,模型进而无法得到很好的训练效果
梯度截断,就是要解决 梯度消失/梯度爆炸 的问题,也就是设定阈值,当预更新的梯度小于阈值时,那么将预更新的梯度设置为阈值
梯度截断通常发送在,损失函数反向传播计算完之后,优化器梯度更新之前。
在 pytorch 中通过 clip_grad_norm 方法来实现
# measure accuracy and record loss
self.optimizer.zero_grad()
loss = self.forward_loss(img_emb, cap_emb)
# compute gradient and do SGD step
loss.backward()
# 梯度截断,设置阈值,当要更新的梯度小于阈值时,更新的梯度为阈值
if self.grad_clip > 0:
clip_grad_norm(self.params,self.grad_clip)
# 根据梯度更新参数
self.optimizer.step()
文章出处登录后可见!
已经登录?立即刷新