Bonky Zhu
If someone is able to show me that what I think or do is not right, I will happily change, for I seek the truth, by which no one was ever truly harmed. It is the person who continues in his self-deception and ignorance who is harmed.

梯度裁剪及其作用

本文简单介绍梯度裁剪(gradient clipping)的方法及其作用,最近在训练 RNN 过程中发现这个机制对结果影响非常大。

梯度裁剪一般用于解决梯度爆炸(gradient explosion) 问题,而梯度爆炸问题在训练 RNN 过程中出现得尤为频繁,所以训练 RNN 基本都需要带上这个参数。常见的 gradient clipping 有两种做法

  1. 根据参数的 gradient 的值直接进行裁剪
  2. 根据若干参数的 gradient 组成的 vectorL2 norm 进行裁剪

第一种做法很容易理解,就是先设定一个 gradient 的范围如 (-1, 1), 小于 -1 的 gradient 设为 -1, 大于这个 1 的 gradient 设为 1.

第二种方法则更为常见,先设定一个 clip_norm, 然后在某一次反向传播后,通过各个参数的 gradient 构成一个 vector,计算这个 vectorL2 norm(平方和后开根号)记为 LNorm,然后比较 LNormclip_norm 的值,若 LNorm <= clip_norm 不做处理,否则计算缩放因子 scale_factor = clip_norm/LNorm ,然后令原来的梯度乘上这个缩放因子。这样做是为了让 gradient vectorL2 norm 小于预设的 clip_norm

关于 gradient clipping 的作用可更直观地参考下面的图,没有 gradient clipping 时,若梯度过大(当发生梯度爆炸时)优化算法会越过最优点。

img

Pytorch 中,使用梯度剪裁的方法如下

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


一般用在计算完loss之后,进行 backward 得到梯度之后,进行剪裁,再step() 更新梯度

Share

You may also like...

发表评论