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和非常大的最大值)。
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_normtf.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)是您应该用于渐变剪切的那个。例如,请参阅此以获取更多信息。选择价值
选择最大值是最困难的部分。您应该使用最大的值,以免出现爆炸梯度(其影响可以是
Nans或
infinite张量中出现的值,在经过一些训练后,损失/准确度恒定)。该值应该
tf.clip_by_global_norm比其他值更大,因为由于隐含的张量的数量,全球L2规范在机械上将比其他规范更大。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)