2017-04-22 76 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 –

相關問題