RNN學習歷程part1
#機器學習百日馬拉松10
最近AIA的學員開始進入我負責的RNN課程了,所以這幾天會是一系列的RNN學習歷程分享。一方面可以為學員做一些補充資料,一方面也在medium上做分享,如果有內容不清晰可以跟我提個醒,可能在下一次的分享會做一些補充。
如果還沒看過上一篇的建議先去看一下(DNN(深度神經網路)的全面認識)會有比較好的認識喔。
RNN全面認識:
RNN(recurrent neural networks,RNN),中文稱為遞迴神經網路,最標準的應用就是NLP自然語言處理和聊天機器人。
他是一種專門設計來解決時間相關問題的神經網路。那麼首先:
什麼是時間相關問題?
時間相關問題,就是當下的答案會受過去的答案影響,而且也會影響未來的答案的一種特殊情況。也可以說是次序相關問題。
舉例來說:
如果我們中午訂便當的流程如下:
星期一麥當勞、星期二肯德基、星期三胖老爹、星期四摩斯漢堡、星期五漢堡王
那麼就算我們忘記今天星期幾,我們只要記得昨天吃了什麼就可以推斷出今天要吃什麼。那我們就會說這個答案是有時間相關性的。
而只要答案有所謂的時間相關性,那他就是一個時間相關問題,可以用RNN來解決。
神經網路與遞迴神經網路的差別?
在「設計的心理學」這本書裡有提到一個概念:
人的記憶其實很零碎,大部分的問題都必需透過環境資訊來引發聯想才能得到答案。
神經網路就是以類似的構造運作,在神經網路裡面儲存了關於特定問題的許多特徵(也就是權重),這些特徵各自儲存在不同的神經元裡。
當我們要用訓練好的神經網路來預測時,只要把一筆新的資料丟進去,神經網路就會把資料分解成包含特徵的訊息。這些訊息會在神經網路內部傳遞並讓某些神經元受到刺激,而神經網路則透過這些刺激來分析訊息所包含的特徵,並藉此得到答案。
但這個答案,並沒有時間相關。
因為訓練好的神經網路每個神經元儲存的特徵(權重)都已經被固定住而不能更改了,所以同一筆資料不論丟幾次,都會得到相同的答案。
所以遞迴神經網路在這之上做出改進,每個神經元除了儲存特徵之外,還有一個偷偷儲存了歷史資訊的小房間(hidden state),這個歷史資訊會在同一層的每個神經元之間共享。
當我們進行預測時,每個神經元的特徵(權重)依然被固定而不能更改,但小房間卻沒有被固定住,儘管他能儲存的訊息量不大,但每一個小房間卻都彼此相連,並能夠讓神經元們透過小倉庫們的儲存的資訊來得知輸入資料的變化、並調整輸出。並藉此,得到一個時間相關的結果。
你可以把hidden state當成一群小衛兵,他們雖然不能真正輸出,但他們手上卻有歷史本文(誤)歷史紀錄,並且很認真的在各個神經元之間通風報信,讓神經元在計算上更加的靈活。
RNN的致命缺點
如果只看前文你可能覺得RNN已經天下無敵了,但他有一個非常致命的缺點,很容易梯度消失。
梯度消失是一種在訓練的時候因為梯度歸零而發現訓練沒有效果的情況。那麼為什麼RNN特別容易發生梯度消失呢?這要從他的訓練方法BPTT(Back Propagation Through Time)開始說起。
BPTT與梯度消失
RNN所使用的訓練方法並不是之前在DNN的章節所提到的反向傳播法(BP, Back Propagation),而是進階版本的BPTT,與BP不同的地方就在於BPTT是透過時間來進行訓練的。
那為什麼要透過時間來進行訓練呢?
還記得我們的小衛兵hidden state嗎?它是用來儲存歷史訊息的小房間,而神經元會透過這些歷史訊息在特徵(權重)已經被固定的情況下,得出與時間相關的對應答案。所以其實歷史訊息和應該出現的答案之間的關係是需要被訓練的,這就是為什麼我們需要BPTT。
那為什麼RNN做BPTT會容易出現梯度消失呢?答案其實很簡單:
因為歷史資訊太長了。
首先,梯度消失是因為對參數連續進行偏微分而導致數值爆炸性的縮小。你可以簡單想像是係數相乘而導致數值不斷趨近於零。
比方說,我們有那經典的一句 To be or not to be, that's the question.
。很顯然,單字的出現是一個時間相關問題(次序相關)。那麼我們應該可以用RNN來訓練。
但是如果想要學習單字跟單字之間的關係並沒有那麼容易,只是To
跟be
大概沒什麼問題,我們使用反向傳播訓練,只要對歷史資訊偏微分一次就可以找到他們在歷史資訊上的相關性。
但是To
跟question
呢?反向傳播法會需要連續的進行偏微分來找到To
跟question
之間的關係,但連續的偏微分就會導致梯度消失,這讓我們很難找到他們之間的關係。
所以在對歷史資訊做反向傳播法的時候,很容易會遇到很嚴重的梯度消失問題,你壓根沒辦法讓神經元透過hidden state的變化來找出應該有的輸出。
那怎麼辦呢?這裡要出動我們的救星LSTM和GRU。
LSTM與GRU
LSTM和GRU都是為了解決梯度消失而誕生的RNN變種,他們都是在hidden state上動手腳來避免梯度消失問題。
LSTM(Long short-term memory)
LSTM比起原來單純的hidden state小房間,他多了三個門(gate),分別是Input gate(輸入門),Forget gate(遺忘門),和Output gate(輸出門)。
- 輸入門: 決定這一次的輸入需不需要被記憶,或者要記多少(可能只有記個三成)
- 遺忘門: 決定要不要遺忘之前的hidden state,也可以按比例遺忘。
- 輸出門: 決定這一次所得到的輸出要放多少(也是比例)進去hidden state小房間。
這三個門的合作可以讓某些不重要單字被忽略,進而讓梯度可以順利進行遠距離的傳遞,進而完成訓練。
而且由於hidden state來自三個門的線性運算,這讓hidden state與歷史資訊之間呈現線性而非乘積的關係,從而避免了梯度消失。
GRU(Gated recurrent unit)
接下來是GRU,GRU有兩個門,Reset Gate(重製門)和Update Gate(更新門)。
- 重製門: 決定是否要遺忘之前留下來的hidden state。
- 更新門: 決定這一次的hidden state所要留下來的比例。
所以GRU也是透過兩個門之間的線性運算來產生hidden state,這使的GRU的hidden state與歷史資訊之間同樣變成線性關係,進而避免了梯度消失。
上面的部分非常建議參考這個連結(理解RNN、LSTM、GRU和Gradient Vanishing)再繼續學習,關於LSTM和GRU的部分我相當大部分是借鑑這篇文章。
總結
這次RNN的全面認識篇幅較長,可能真的要花費心力才能把他看完了。不過還是照慣例給三個問題做為學習評量:
- hidden state裡隱藏著歷史資訊,而能夠對hidden state做梯度下降的方法被稱為什麼?
- RNN跟傳統NN有什麼不同?
- 為什麼會有梯度消失?
圖片出處:
chatbot:
<a href="https://www.freepik.com/free-photos-vectors/logo">Logo vector created by roserodionova - www.freepik.com</a>