2017-04-22 96 views
1

我在RNN上关注this tutorial,其中在第177行执行了以下代码。为什么我们clip_by_global_norm在执行RNN时获得梯度

max_grad_norm = 10 
.... 
grads, _ = tf.clip_by_global_norm(tf.gradients(cost, tvars), max_grad_norm) 
optimizer = tf.train.GradientDescentOptimizer(self.lr) 
self._train_op = optimizer.apply_gradients(zip(grads, tvars), 
    global_step=tf.contrib.framework.get_or_create_global_step()) 

为什么我们要做clip_by_global_normmax_grad_norm的价值是如何决定的?

+0

查找_exploding渐变problem_。 – Styrke

回答

2

原因剪裁的标准是,否则可能发生爆炸:

没有与正常训练复发 神经网络,消失和爆炸梯度问题 在Bengio等人详细介绍两种广泛已知问题。 (1994)。在本文中,我们试图通过从分析,几何和动态系统的角度探索这些问题 来提高对潜在问题的理解。 我们的分析用于证明简单而有效的解决方案。我们 提出梯度模裁剪的策略来应对爆炸 梯度

this文件采取的上方。

关于如何设置max_grad_norm,您可以稍微玩一下,看看它是如何影响您的结果的。这通常设置为非常小的数字(我在几种情况下看到了5)。请注意,tensorflow不会强制您指定此值。如果你不这样做,它会自己指定它(如documentation中所述)。

在rnn中爆炸\渐消渐变是常见的原因是因为在做反向传播时(这种情况称为反向传播时间),我们需要将梯度矩阵乘以t=0(也就是说,如果我们目前处于t=100,说一个句子中的100个字符,我们将需要乘以100个矩阵)。下面是t=3公式:

enter image description here

(这个等式是从here拍摄)

如果矩阵的范数大于1,它将最终爆炸。它小于1,它最终会消失。这可能会发生在通常的神经网络中,如果它们有很多隐藏层。然而,前馈神经网络通常没有那么多的隐藏层,而输入序列到rnn可以容易地具有许多字符。

+0

感谢您的回答。我们如何处理消失渐变? – suku

+1

一种选择是构建一个梯度为1(或非常接近1)的网络。 LSTM网络就是这样的网络,它们确实很受欢迎。你可以在这里阅读更多关于它的信息:https://www.quora.com/How-does-LSTM-help-prevent-the-vanishing-and-exploding-gradient-problem-in-a-recurrent-neural-network –

相关问题