随着神经网络层数的增多,会出现梯度消失或梯度爆炸问题。原因可以参考之前写过的文章。
针对梯度爆炸问题,解决方案是引入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 = ttf.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)更慢一些,因为它需要等所有的梯度都求出来才可以进行梯度截断。
本文介绍了在深度学习中使用梯度裁剪(tf.clip_by_norm和tf.clip_by_global_norm)来解决梯度爆炸问题的方法。通过约束梯度大小,避免了因梯度过大导致的模型训练不稳定。
988

被折叠的 条评论
为什么被折叠?



