有没有办法在张量流中剪切中间爆炸梯度

时间:2016-10-12 09:54:08

标签: tensorflow deep-learning clipping gradients adam

问题:一个非常长的RNN网

N1 -- N2 -- ... --- N100

对于AdamOptimizer之类的优化工具,compute_gradient()会为所有训练变量提供渐变。

但是,它可能会在某个步骤中爆炸。

how-to-effectively-apply-gradient-clipping-in-tensor-flow中的方法 可以剪裁大的最终渐变。

但是如何剪辑那些中级的?

一种方法可能是从“N100 - > N99”手动执行backprop,剪切渐变,然后是“N99 - > N98”等等,但这太复杂了。

所以我的问题是:是否有更简单的方法来剪辑中间渐变? (当然,严格来说,它们不再是数学意义上的渐变)

2 个答案:

答案 0 :(得分:0)

您可以使用custom_gradient装饰器制作tf.identity版本,剪辑中间爆炸渐变。

``` 来自tensorflow.contrib.eager.python import tfe

@ tfe.custom_gradient def gradient_clipping_identity(tensor,max_norm):   result = tf.identity(tensor)

def grad(dresult):     return tf.clip_by_norm(dresult,max_norm),None

返回结果,毕业 ```

然后使用gradient_clipping_identity,因为您通常会使用身份,并且您的渐变会在向后传递中被剪切。

答案 1 :(得分:0)

@tf.custom_gradient
def gradient_clipping(x):
  return x, lambda dy: tf.clip_by_norm(dy, 10.0)