反向傳播(Back Propagation)是一種與最優化方法(比如梯度下降方法)結合、用來訓練人工神經網絡的常見方法。該方法對網絡中所有權重計算損失函數的梯度,然後將梯度反饋給最優化方法,用來更新網絡權重以最小化損失函數。
在神經網絡中一個典型的問題就是梯度消失(Gradient Vanishing)的問題,其原因在於是隨著神經網絡層數的加深,梯度逐漸減小甚至接近0,當梯度變的非常小的時候,就不能為學習提供足夠的信息。
Recurrent Neural Networks(遞歸神經網絡,RNN)也存在梯度消失的問題,當輸入的序列足夠長時,RNN前期的層通常通常由於梯度消失而停止學習,從而導致RNN只擁有短期記憶。也就是說如果輸入的序列的足夠長,RNN在處理序列後面的信息時,可能已經將序列前面的信息丟失或者遺忘了,RNN很難完整的傳遞完整的長序列信息。視頻來源Youtube: https://www.youtube.com/watch?v=8HyCNIVRbSU
短期記憶的解決方案-LSTM和GRU為了更好的理解LSTM和GRU是如何實現的,先回顧下Recurrent Neural Network是如何工作的。
以機器翻譯為例,RNN先將句子和詞語轉換為機器可識別的詞向量(Word Vector),然後把詞向量one by one的交給RNN進行處理。
Processing sequence one by oneRNN處理信息過程中,Hidden State作為神經網絡的記憶數據,保留了神經網絡已經看到的歷史信息。通過將前一單元的Hidden State傳遞給後一個RNN單元,從而實現對歷史信息的記憶。
Passing hidden state to next time stepRNN計算Hidden State的過程如下:它將當前RNN單元的輸入和前一個RNN單元輸出的Hidden State組合起來,經過一個Tanh激活函數,生成當前單元的Hidden State。
RNN CellTanh激活函數將輸入值壓縮至-1和1之間。
Tanh squishes values to be between -1 and 1如果不採用Tanh激活函數,數據流經多層神經網絡後,個別維度會出現急劇膨脹,甚至變成一個天文數字。下圖是神經網絡每層都對輸入數據做了一個x3的操作的效果。
vector transformations without tanhTanh函數確保網絡的輸出值在-1與1之間,下圖是同樣的輸入數據流經激活函數為Tanh的多層神經網絡的效果。
vector transformations with tanhLSTMLSTM與RNN有相似的數據流控制機制,差別在於LSTM Cell內部的運作邏輯。
LSTM Cell and It’s OperationsLSTM的核心概念是Cell States和各種Gates。Cell State在整個序列的處理過程中都攜帶相關的信息,即使較早時刻的信息也可以很好的保留,從而降低了短期記憶問題的影響。
Gates都是不同神經網絡,它們可以決定哪些信息需要保留在Cell States中,哪些信息需要遺忘。
SigmoidGates中使用了Sigmoid激活函數,Sigmoid激活函數與Tanh激活函數類似,只不過它不是將所有輸入數據壓縮到(-1, 1)之間,而是將輸入數據壓縮到(0, 1)之間。Sigmoid激活函數對於Gates數據更新或者遺忘數據非常有用,因為任意數值乘以0都等於0,從而使得這些數據被遺忘或則消失;任意數值乘以1都等於原數值,從而使得這些信息保留下來。所以最終Gates通過訓練可以哪些數據是重要的,需要保留;哪些數據是不重要的,需要遺忘。
Sigmoid squishes values to be between 0 and 1下面在深入看看各種Gates都做了什麼。
Forget GateForget Gate決定哪些信息需要丟棄,哪些信息需要保留。它合併前一個Hidden State和當前的Input信息,然後輸入Sigmoid激活函數,輸出(0,1)之間的數值。輸出值接近0的信息需要被遺忘,輸出值接近1的信息需要被保留。
Forget gate operationsInput GateInput Gate首先將前一個Hidden State和當前Input合併起來,送入Sigmoid函數,輸出(0,1)之間的值,0表示信息不重要,1表示信息重要。
Hidden State和Input的輸入同時也被送入Tanh函數,輸出(-1, 1)之間的數值。
Sigmoid的輸出和Tanh的輸出相乘,決定哪些Tanh的輸出信息需要保留,哪些輸出信息需要丟棄。
Input gate operations
Cell State前一個Cell State的輸出,首先與Forget Gate的輸出相乘,選擇性的遺忘不重要的信息,再與Input Gate的輸出相加,從而實現將當前的Input信息添加到Cell State中,輸出新的Cell State。
Calculating cell stateOutput GateOutput Gate用於輸出Hidden State。Output Gate首先將前一個Hidden State和當前Input送入Sigmoid函數,然後與新的Cell State通過Tanh函數的輸出相乘,決定Hidden State要將哪些信息攜帶到下一個Time Step。
output gate operations概括來說,就是Forget Gate決定哪些歷史信息要保留;Input Gate決定哪些新的信息要添加進來;Output Gate決定下一個Hidden State要攜帶哪些歷史信息。
Code Demo通過Python偽代碼輔助更好的理解整個LSTM的運行過程。
GRUGRU與LSTM非常相似,但它去除了Cell State,使用Hidden State來傳遞信息。GRU只有兩個Gates: Reset Gate和Update Gate。
GRU cell and it’s gates上圖不夠直接明白,再來一張臺灣大學李宏毅教學視頻中的講解。
其中
如上圖所示,r是Reset Gate,z為Update Gate。
通過重置門(Reset Gate)處理前一個Cell的輸出:
再將
最後進行記憶更新的步驟:
Update Gate z的範圍為0~1,它的值越接近1,代表記憶數據越多;它的值越接近0,則代表遺忘的越多。
相比LSTM,GRU的Tensor Operation更少,因而訓練速度更快,並且效果與LSTM不相上下。
參考材料1.https://towardsdatascience.com/illustrated-guide-to-lstms-and-gru-s-a-step-by-step-explanation-44e9eb85bf21
2.https://zhuanlan.zhihu.com/p/32481747
註:本文所有圖片均來自參考材料。