tf.clip_by_global_norm理解
2017-02-21 14:14
615 查看
Gradient Clipping的引入是为了处理gradient explosion或者gradients vanishing的问题。当在一次迭代中权重的更新过于迅猛的话,很容易导致loss divergence。Gradient Clipping的直观作用就是让权重的更新限制在一个合适的范围。
具体的细节是
1.在solver中先设置一个
2.在前向传播与反向传播之后,我们会得到每个权重的梯度
3.最后将所有的权重梯度乘以这个缩放因子,这时得到的梯度才是最后的梯度信息。
这样就保证了在一次迭代更新中,所有权重的梯度的平方和在一个设定范围以内,这个范围就是clip_gradient.
通过权重梯度的总和的比率来截取多个张量的值。
其中
但是这个函数的速度比
具体的细节是
1.在solver中先设置一个
clip_gradient
2.在前向传播与反向传播之后,我们会得到每个权重的梯度
diff,这时不像通常那样直接使用这些梯度进行权重更新,而是先求所有权重梯度的平方和
sumsq_diff,如果
sumsq_diff>
clip_gradient,则求缩放因子
scale_factor=
clip_gradient/
sumsq_diff。这个
scale_factor在(0,1)之间。如果权重梯度的平方和
sumsq_diff越大,那缩放因子将越小。
3.最后将所有的权重梯度乘以这个缩放因子,这时得到的梯度才是最后的梯度信息。
这样就保证了在一次迭代更新中,所有权重的梯度的平方和在一个设定范围以内,这个范围就是clip_gradient.
tf.clip_by_global_norm
tf.clip_by_global_norm(t_list, clip_norm, use_norm=None, name=None)
通过权重梯度的总和的比率来截取多个张量的值。
t_list是梯度张量,
clip_norm是截取的比率, 这个函数返回截取过的梯度张量和一个所有张量的全局范数。
t_list[i]的更新公式如下:
t_list[i] * clip_norm / max(global_norm, clip_norm)
其中
global_norm = sqrt(sum([l2norm(t)**2 for t in t_list]))
global_norm是所有梯度的平方和,如果
clip_norm > global_norm,就不进行截取。
但是这个函数的速度比
clip_by_norm()要慢,因为在截取之前所有的参数都要准备好。其他实现的函数还有这些
相关文章推荐
- 转载!tf.clip_by_global_norm理解
- tf.clip_by_global_norm理解
- tf.clip_by_norm理解
- TensorFlow-tf.clip_by_global_norm函数原理
- tensorflow clip_by_norm函数理解
- 值域范围 tf.clip_by_value的用法
- tf.clip_by_value()
- tensorflow学习笔记(2):tf.clip_by_value,tf.expand_dims等函数的用法
- tensorflow API: tf.clip_by_value
- tf.clip_by_value 用法
- TensorFlow tf.clip_by_value tf.select 绝对值用法!
- Tensorflow: tf.clip_by_value
- tf.clip_by_value:将tensor中的0和NONE进行范围限制的函数
- 关于 tf.nn.softmax_cross_entropy_with_logits 及 tf.clip_by_value
- tf.clip_by_value的用法
- Windows硬件系统函数 - ClipCursor, ClipCursorBynum
- opencv里的norm范数和图像里的深度和通道数的理解和意义和相机标定后对内外参数的质量评估
- The AnimationClip 'xxx' used by the Animation component 'xxx' must be marked as Legacy.
- 宋体、构造函数-浅出C++对象模型——理解构造函数、析构函数执行顺序-by小雨
- 统计、案例-深入理解Oracle索引(10):索引列字符类型统计信息的32位限制-by小雨