RNN的tf.clip_by_value和tf.clip_by_global_norm之间的区别以及如何确定要裁剪的最大值?

RNN的tf.clip_by_value和tf.clip_by_global_norm之间的区别以及如何确定要裁剪的最大值?,第1张

RNN的tf.clip_by_value和tf.clip_by_global_norm之间的区别以及如何确定要裁剪的最大值?

TL; DR

tf.clip_by_global_norm
用于渐变裁剪。

clip_by_value

tf.clip_by_value
将每个值裁剪到一个张量内,而不管张量中的其他值如何。例如,

tf.clip_by_value([-1, 2, 10], 0, 3)  -> [0, 2, 3]  # only the values below 0 or above 3 are changed

因此,它可以改变张量的方向,因此,如果张量中的值彼此解相关(对于梯度裁剪而言不是这种情况),则应使用它,或者避免张量中的零/无限值可能导致其他地方的Nan
/无限值(例如,通过裁剪最小epsilon = 1e-8和非常大的最大值)。

clip_by_norm

tf.clip_by_norm
如有必要,重新缩放一个张量,以使其L2范数不超过特定阈值。通常,避免梯度在一个张量上爆炸很有用,因为您可以保持梯度方向。例如:

tf.clip_by_norm([-2, 3, 6], 5)  -> [-2, 3, 6]*5/7  # The original L2 norm is 7, which is >5, so the final one is 5tf.clip_by_norm([-2, 3, 6], 9)  -> [-2, 3, 6]  # The original L2 norm is 7, which is <9, so it is left unchanged

但是,

clip_by_norm
仅在一个梯度上起作用,因此,如果在所有梯度张量上使用它,则将使它们不平衡(某些将被重新缩放,另一些则不会,并且并非全部具有相同的比例)。

请注意,前两个仅在一个张量上起作用,而最后一个在张量列表上使用。

clip_by_global_norm

tf.clip_by_global_norm
重新缩放张量列表,以使所有范数的向量的总范数不超过阈值。目标与
clip_by_norm
(避免爆炸梯度,保持梯度方向)相同,但是它一次处理所有梯度,而不是分别作用于每个梯度(也就是说,如有必要,对所有梯度都按相同的因子进行缩放,或者不进行缩放)他们被重新缩放)。这样更好,因为可以保持不同梯度之间的平衡。

例如:

tf.clip_by_global_norm([tf.constant([-2, 3, 6]),tf.constant([-4, 6, 12])] , 14.5)

将两个张量缩放一个因子

14.5/sqrt(49 + 196)
,因为第一个张量的L2范数为7,第二个张量的L2范数为14,并且
sqrt(7^2+14^2)>14.5

这(

tf.clip_by_global_norm
)是您应该用于渐变剪切的那个。例如,请参阅此以获取更多信息。

选择价值

选择最大值是最困难的部分。您应该使用最大的值,以免出现爆炸梯度(其影响可以是

Nan
s或
infinite
张量中出现的值,在经过一些训练后,损失/准确度恒定)。该值应该
tf.clip_by_global_norm
比其他值更大,因为由于隐含的张量的数量,全球L2规范在机械上将比其他规范更大。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5673599.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存