您的位置:首页 > 其它

tf.clip_by_global_norm理解

2017-02-21 14:14 615 查看
Gradient Clipping的引入是为了处理gradient explosion或者gradients vanishing的问题。当在一次迭代中权重的更新过于迅猛的话,很容易导致loss divergence。Gradient Clipping的直观作用就是让权重的更新限制在一个合适的范围。

具体的细节是

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()
要慢,因为在截取之前所有的参数都要准备好。其他实现的函数还有这些
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: