摘要:假設$w=1.01$,那麼$y^{1000}\approx 20000$,這就跟蝴蝶效應一樣,$w$有一點小小的變化,就會對output產生非常大的影響,但是我們可以通過把learning rate設小一點。假設$w$是我們要learn的參數,我們想知道它的Gradient,所以我們觀察一下當$w$改變的而時候,對neural的output有多大的影響。

RNN-based is always not easy to learn

一般而言,你在做training的時候,你會希望,你的learning curve是像藍色這條線,縱軸是total loss,橫軸是epoch的數目,你會希望:隨着epoch的增加,參數的不斷update,loss會慢慢下降最後趨於收斂。但不幸的是,在訓練RNN的時候,有時會看到這條綠色的線

我們分析下RNN的性質,看看RNN的error surface的變化

假設你從橙色的點當作初始點($w_1=-2.2,w_2=4.6$),利用Gradient Descent更新參數,有一種情況是你一腳蹬上了懸崖,loss暴漲。另一種更慘的情況是你一腳踩到了懸崖邊上(從右往左數第三個橙色的點),此時當前這個點的Gradient很大,導致整個參數飛出去了

解決辦法相當粗暴,clipping。具體來說就是當Gradient大於某個設定的閾時,讓Gradient直接等於這個閾值,所以就算踩在這個懸崖邊上,也不會飛出去,而是飛到一個比較近的地方,這樣你還可以繼續做RNN的training

思考:爲什麼RNN會有這種奇怪的特性?有人認爲,是不是因爲activation function用的是sigmoid從而導致了Gradient Vanish,其實並不是,如果真是這個問題,你換成ReLU去解決是不是就行了?並不,使用ReLU會導致RNN performance更差,所以activation function其實並不是關鍵點

舉個很簡單的例子,只有一個neuron,這個neuron是Linear的。input沒有bias,weight是1。output的weight也是1,transition的weight是$w$,也就是說memory接到neuron的input weight是$w$

現在假設input是[1,0,0,0,...,0],那這個neural network在最後一個時間點(1000)的output值就是$w^{999}$。假設$w$是我們要learn的參數,我們想知道它的Gradient,所以我們觀察一下當$w$改變的而時候,對neural的output有多大的影響。假設$w=1$,那麼$y^{1000}=1$;假設$w=1.01$,那麼$y^{1000}\approx 20000$,這就跟蝴蝶效應一樣,$w$有一點小小的變化,就會對output產生非常大的影響,但是我們可以通過把learning rate設小一點。但如果假設$w=0.99$,那麼$y^{1000}\approx 0$,也就是說這時候需要一個很大的learning rate。所以,一會兒你又要很小的learning rate,一會兒又要很大的learning rate,這就很麻煩了。RNN training的問題其實來自於它把同樣的東西在transition的時候反覆使用,所以這個$w$只要一有變化,造成的影響都是天崩地裂級別的

相關文章