我在RNN上遵循本教程,在第177行执行以下代码.
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())
Run Code Online (Sandbox Code Playgroud)
我们为什么这样做clip_by_global_norm?价值如何max_grad_norm决定?
削减规范的原因是否则可能会爆炸:
正确训练复发神经网络存在两个众所周知的问题,Bengio等人详述的消失和爆炸梯度问题.(1994).在本文中,我们试图通过从分析,几何和动态系统的角度探讨这些问题来提高对潜在问题的理解.我们的分析用于证明一个简单而有效的解决方案.我们提出了一种梯度范数裁剪策略来处理爆炸梯度
上述取自此纸张.
在如何设置方面max_grad_norm,您可以稍微玩一下,看看它如何影响您的结果.这通常设置为非常小的数字(我在几个案例中看到过5个).请注意,tensorflow不会强制您指定此值.如果不这样做,它将自行指定(如文档中所述).
在rnn中爆炸\消失梯度的常见原因是因为在进行反向传播时(这称为反向传播),我们需要将梯度矩阵一直乘以t=0(也就是说,如果我们当前处于t=100100,那就是100的字符)在一个句子中,我们需要乘以100个矩阵).这是以下等式t=3:
(这个等式取自这里)
如果矩阵的范数大于1,它最终会爆炸.它小于1,它最终会消失.如果它们具有许多隐藏层,则这可能发生在通常的神经网络中.然而,前馈神经网络通常没有这么多隐藏层,而rnn的输入序列很容易有很多字符.
| 归档时间: |
|
| 查看次数: |
3996 次 |
| 最近记录: |