梯度爆炸之Gradient Clipping

随着神经网络层数的增多,会出现梯度消失或梯度爆炸问题。原因可以参考之前写过的文章。

针对梯度爆炸问题,解决方案是引入Gradient Clipping(梯度裁剪)。通过Gradient Clipping,将梯度约束在一个范围内,这样不会使得梯度过大。

在tensorflow 文档中,可以看到Gradient Clipping板块有五个函数。这里,我们仅仅介绍其中两个:tf.clip_by_norm(t,clip_norm,name=None)tf.clip_by_global_norm(t_list,clip_norm,use_norm=None,name=None)

  • tf.clip_by_norm(t,clip_norm,name=None)
    参数说明: t: a tensor ; clip_norm: 阈值,即maximum L2-norm。
    如果 tensor的L2-norm大于clip_norm,则 t = t * clip_norm / l2norm(t)
    否则t = t
  • tf.clip_by_global_norm(t_list,clip_norm,use_norm=None,name=None)
    参数说明: t_list: multiple tensors; clip_norm: a clipping ratio; use_norm: 如果你已经计算出global_norm,你可以在use_norm进行指定。
t_list[i] = t_list[i] * clip_norm / max(global_norm,clip_norm)
where 
global_norm = sqrt(sum(l2norm(t)**2 for t in t_list))

Any of the entries of t_list that are of type None are ignored.
This is the correct way to perform gradient clipping (for example, see R. Pascanu, T. Mikolov, and Y. Bengio, “On the difficulty of training Recurrent Neural Networks”. http://arxiv.org/abs/1211.5063)

通过介绍这两个函数,可以意识到tf.clip_by_global_norm(t_list,clip_norm,use_norm=None,name=None)更慢一些,因为它需要等所有的梯度都求出来才可以进行梯度截断。

猜你喜欢

转载自blog.csdn.net/yqmind/article/details/80955838
今日推荐