tf.clip_by_global_norm理解

本文介绍了GradientClipping的概念及其在解决梯度爆炸或消失问题中的应用。通过限制权重更新的范围,防止loss发散。具体步骤包括设置clip_gradient阈值、计算缩放因子并对权重梯度进行调整。

refer to :https://blog.youkuaiyun.com/u013713117/article/details/56281715

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) 
  • 1

通过权重梯度的总和的比率来截取多个张量的值。 
t_list 是梯度张量, clip_norm 是截取的比率, 这个函数返回截取过的梯度张量和一个所有张量的全局范数。

t_list[i] 的更新公式如下:

t_list[i] * clip_norm / max(global_norm, clip_norm)
  • 1

其中global_norm = sqrt(sum([l2norm(t)**2 for t in t_list])) 
global_norm 是所有梯度的平方和,如果 clip_norm > global_norm ,就不进行截取。 
但是这个函数的速度比clip_by_norm() 要慢,因为在截取之前所有的参数都要准备好。其他实现的函数还有这些

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值