這篇文章的內容來自B站UP主“梗直哥丶 ”的視頻
-
《【循環神經網絡】5分鐘搞懂RNN,3D動畫深入淺出: https://www.bilibili.com/video/BV1z5411f7Bm
-
《【LSTM長短期記憶網絡】3D模型一目瞭然: https://www.bilibili.com/video/BV1Z34y1k7mc/
RNN
簡單的神經網絡一般這樣,輸入層x進入隱藏層神經元s,再經過輸出產生最後的結果y,通過調整權重\(W_{in}\)和\(W_{out}\)就可以實現學習的效果。
通常情況下,深度神經網絡都是水平方向延伸的,比如卷積神經網絡CNN,隱藏層數量多了,但是沒有考慮單個隱層在時間上時序變化。
RNN則不同,它關注隱層每個神經元在時間維度上的不斷成長與進步。體現在圖上,變換一下3D的視角,網絡結構不變,沒有添加新的神經元,但是沿着時間軸recurrent,也就是重複,建立時序上的關聯,這裏的層級擴展並非神經元數量的真實增加,而是表示隱層在不同時刻的狀態。
根據問題的需要,隱層的時間關聯既可以是全連接式的,所有線都相連。
但也可以是自己對自己
假如用\(W_S\)來表示層級間的權重矩陣,RNN通常會假定不同的層,其實也就是不同的時刻共享一個\(W_S\),這樣可以有效地減少訓練參數。
對神經元模型,如果隱藏層輸出\(S_i = f(\sum_{n}^N(w_{in}^i·x_n^i + b_i))\)
寫成矩陣形式就是\(S = f(W_{in}·X + b)\)
對RNN而言輸出就變成了\(S_t = f(W_{in}X + W_sS_{t-1} + b)\)
多了一項\(W_sS_{t-1}\)
這樣就建立了隱層在不同時刻,t-1時刻和t時刻他們之間的一種迭代關係。換言之,就是讓神經網絡有了某種記憶的能力。
RNN本質上就是用這樣一種看似是級聯,但實際上卻是沿着時序,反覆迭代的網絡結構,實現了對序列數據的學習
LSTM
傳統的RNN對時間序列的預測捉襟見肘,它雖然建立了不同時刻隱藏層之間的聯繫,實現了記憶效果,但只是基於前一時刻,是一種short-memory。
與RNN相比,LSTM增加了一條新的時間鏈,記錄long-term memory,用C來表示,同時它增加了兩條鏈間的關聯關係。新增加的鏈條就相當於記事的日記本。
以t時刻爲例,和RNN相比,計算隱層狀態\(S_t\)時,除了輸入和前一時刻,還要包含當前時刻的日記信息\(C_t\)。
放大\(S_t\)和\(C_t\)間的關聯,一條線拆成了三條線,其中包含兩步更加細緻的操作,刪除舊日記,增添新日記。
首先,函數f1就像是一塊橡皮擦,根據昨天的記憶\(s_{t-1}\)和今天的輸入\(x_t\),決定要修改日記中的那些記錄,數學語言描述就是:
\(f_1 = sigmoid (w_1 \begin{bmatrix} s_{t-1} \\ x_t \end{bmatrix}+ b_1)\)
其中sigmoid函數取值在0-1之間,矩陣元素相乘時,會抹掉那些取值爲零的元素,相當於選擇性遺忘部分記憶,因此也常常被稱爲forget gate。
然後,函數f2就像是一支鉛筆,再次根據昨天的記憶和今天的輸入,決定要在日記本上增加那些記錄,數學語言沒描述就是:
\(f_2 = sigmoid (w_2 \begin{bmatrix} s_{t-1} \\ x_t \end{bmatrix}+ b_2) * tanh(\tilde{w_2}\begin{bmatrix} s_{t-1} \\ x_t \end{bmatrix}+\tilde{b_2})\)
其中sigmoid函數再次對內容進行了選擇,tanh函數取值在-1到1之間,這步操作不是遺忘,而是相當於把這兩天的事情進行梳理和歸納,因此也常常被稱爲input gate。
先用橡皮在日記本上刪減,再用鉛筆在日記本上增加記錄,兩步操作合起來,用公式表示就是
\(c_t = f_1 * c_{t-1} + f_2\)
這樣就得到了新的日記\(c_t\),它除了會繼續往下傳遞,同時會被用作更新當前短期記憶\(s_t\),最後就可以計算輸出得到的\(y_t\),同時保持短期網絡記憶鏈\(s_t\)和長期記憶鏈\(c_t\),並且相互更新。
把3D模型旋轉90度,拉伸變形,然後把長期記憶鏈C投影到平面上,再擴展長短期記憶鏈間的關聯,就對應上經典LSTM示圖了。
這個圖之所以難懂,主要是因爲它用二維視角看三維信息,產生了重疊,而且一下子擺上了太多的細節,極大地增加了初學者的理解難度。
和RNN相比,LSTM引入了更多的參數矩陣,因此訓練起來麻煩一些,但依然可以用梯度下降算法進行。
由於深度發覺了數據時序上的有趣關聯,LSTM在某種程度上模擬了大腦,關注重要片段,而忽略無關信息,這極大拓展了人工智能的領域。