RNN-迴圈神經網路和LSTM_01基礎
一、介紹
1、什麼是RNN
- 傳統的神經網路是層與層之間是全連線的,但是每層之間的神經元是沒有連線的(其實是假設各個資料之間是獨立的)
- 這種結構不善於處理序列化的問題。比如要預測句子中的下一個單詞是什麼,這往往與前面的單詞有很大的關聯,因為句子裡面的單詞並不是獨立的。
RNN
的結構說明當前的的輸出與前面的輸出也有關,即隱層之間的節點不再是無連線的,而是有連線的- 基本的結構如圖,可以看到有個迴圈的結構,將其展開就是右邊的結構
2、運算說明
- 如上圖,輸入單元(
inputs units
): {x0,x1,⋯⋯,xt,xt+1,⋯⋯}{x0,x1,⋯⋯,xt,xt+1,⋯⋯},- 輸出單元(output units)為:{o0,o1,⋯⋯,ot,ot+1,⋯⋯}{o0,o1,⋯⋯,ot,ot+1,⋯⋯},
- 隱藏單元(hidden units)輸出集: {s0,s1,⋯⋯,ost,st+1,⋯⋯}{s0,s1,⋯⋯,ost,st+1,⋯⋯}
- 時間
t
隱層單元的輸出為:st=f(Uxt+Wst−1)st=f(Uxt+Wst−1)f
就是激勵函式,一般是sigmoid,tanh, relu
等- 計算s0s0時,即第一個的隱藏層狀態,需要用到s−1s−1,但是其並不存在,在實現中一般置為0向量
- (如果將上面的豎著立起來,其實很像傳統的神經網路,哈哈)
- 時間
t
的輸出為:ot=Softmax(Vst)ot=Softmax(Vst)- 可以認為隱藏層狀態stst是網路的記憶單元. stst包含了前面所有步的隱藏層狀態。而輸出層的輸出otot只與當前步的stst有關。
- (在實踐中,為了降低網路的複雜度,往往stst只包含前面若干步而不是所有步的隱藏層狀態)
- 在
RNNs
中,每輸入一步,每一層都共享引數U,V,W
,(因為是將迴圈的部分展開,天然應該相等) RNNs
的關鍵之處在於隱藏層,隱藏層能夠捕捉序列的資訊。
3、應用方面
- 迴圈神經網路(
Recurrent Neural Networks,RNNs
)已經在眾多自然語言處理(Natural Language Processing, NLP
)中取得了巨大成功以及廣泛應用。目前使用最廣泛最成功的模型便是LSTMs
(Long Short-Term Memory,長短時記憶模型)模型(1) 語言模型和文字生成
- 給定一個單詞序列,根據前面的單詞預測下面單詞的可能性
- 也可以根據概率生成新的詞
- 這裡給出了3篇論文
- 和上面的語言模型很像,只不過是根據一段過生成另外的一段話
- 注意的是開始的輸出是在全部輸入結束後生成的
- 一些論文
(3) 語音識別
- 論文
- 根據影像,生成一段描述影像的話
- 需要和
CNN
結合使用
二、結構
1、One to One
- 即一個輸入對應一個輸出,就是上面的圖
2、Many to One
- 即多個輸入對應一個輸出,比如情感分析,一段話中很多次,判斷這段話的情感
- 其中x1,x2,…,xtx1,x2,…,xt表示句子中的
t
個詞,o
代表最終輸出的情感標籤 - 前向計算就是:f(x)=Vst=V(Uxt+Wst−1)=V(Uxt+W(Uxt−1+Wst−2))⋯f(x)=Vst=V(Uxt+Wst−1)=V(Uxt+W(Uxt−1+Wst−2))⋯
3、One to Many
- 前向計算類似,不再給出
4、Many to Many
- 前向計算類似,不再給出
5、雙向RNN(Bidirectional RNN)
- 比如翻譯問題往往需要聯絡上下文內容才能正確的翻譯,我們上面的結構線性傳遞允許“聯絡上文”,但是聯絡下文並沒有,所以就有雙向RNN
- 前向運算稍微複雜一點,以
t
時刻為例
ot=W(os)tst+W(oh)tht=W(os)t(W(ss)t−1st−1+W(sx)txt−1)+W(oh)t(W(hh)tht+1+W(hx)txt)ot=Wt(os)st+Wt(oh)ht=Wt(os)(Wt−1(ss)st−1+Wt(sx)xt−1)+Wt(oh)(Wt(hh)ht+1+Wt(hx)xt)
6、深層的RNN
- 上面的結構都是隻含有一層的
state
層,根據傳統NN和CNN,深層次的結構有更加號的效果,結構如圖
三、Back Propagation Through Time(BPTT)訓練
- 關於傳統神經網路BP演算法可以檢視這裡神經網路部分的推導
1、符號等說明
- 以下圖為例
- 符號說明
- ϕϕ………………………………………………隱藏層的激勵函式
- φφ………………………………………………輸出層的變換函式
- Lt=Lt(ot,yt)Lt=Lt(ot,yt)……………………………模型的損失函式
- 標籤資料ytyt是一個
one-hot
向量
- 標籤資料ytyt是一個
2、反向傳播過程
- 接受完序列中所有樣本後再統一計算損失,此時模型的總損失可以表示為(假設輸入序列長度為
n
):L=∑t=1nLtL=∑t=1nLt - ot=φ(Vst)=φ(V(Uxt+Wst−1))ot=φ(Vst)=φ(V(Uxt+Wst−1))
- 其中s0=0=(0,0,…,0)Ts0=0=(0,0,…,0)T
- 令:o∗t=Vst,s∗t=Uxt+Wst−1…………(1)ot∗=Vst,st∗=Uxt+Wst−1…………(1) (就是沒有經過激勵函式和變換函式前)
- 則:ot=φ(o∗t)ot=φ(ot∗)
- st=ϕ(s∗t)st=ϕ(st∗)
(1) 矩陣V的更新
- 對矩陣 V 的更新過程,根據(1)式可得, (和傳統的神經網路一致,根據求導的鏈式法則):
- ∂Lt∂o∗t=∂Lt∂ot∗∂ot∂o∗t=∂Lt∂ot∗φ′(o∗t)∂Lt∂ot∗=∂Lt∂ot∗∂ot∂ot∗=∂Lt∂ot∗φ′(ot∗)
- ∂Lt∂V=∂Lt∂Vst∗∂Vst∂V=∂Lt∂o∗t×sTt=(∂Lt∂ot∗φ′(o∗t))×sTt∂Lt∂V=∂Lt∂Vst∗∂Vst∂V=∂Lt∂ot∗×stT=(∂Lt∂ot∗φ′(ot∗))×stT- 因為L=∑nt=1LtL=∑t=1nLt,所以對矩陣V的更新對應的導數:∂L∂V=∑t=1n(∂Lt∂ot∗φ′(o∗t))×sTt∂L∂V=∑t=1n(∂Lt∂ot∗φ′(ot∗))×stT
(2) 矩陣U和W的更新
RNN
的BP
演算法的主要難點在於它State
之間的通訊- 可以採用迴圈的方法來計算各個梯度,
t
應從n
開始降序迴圈至1
- 計算時間通道上的區域性梯度(同樣根據鏈式法則)∂Lt∂s∗t=∂Lt∂Vst×∂sTtVTt∂st∗∂st∂s∗t=VT×(∂Lt∂ot∗φ‘(o∗t))∂Lt∂st∗=∂Lt∂Vst×∂stTVtT∂st∗∂st∂st∗=VT×(∂Lt∂ot∗φ‘(ot∗))
∂Lt∂s∗k−1=∂s∗k∂s∗k−1×∂Lt∂s∗k=WT×(∂Lt∂s∗k∗ϕ′(s∗k−1)),(k=1,……,t)………(2)∂Lt∂sk−1∗=∂sk∗∂sk−1∗×∂Lt∂sk∗=WT×(∂Lt∂sk∗∗ϕ′(sk−1∗)),(k=1,……,t)………(2)
- 利用區域性梯度計算
U
和W
的梯度- 這裡累加是因為權值是共享的,所以往前推算一直用的是一樣的權值∂Lt∂U+=∑k=1t∂Lt∂s∗k×∂s∗k∂U=∑k=1t∂Lt∂s∗k×xTt∂Lt∂U+=∑k=1t∂Lt∂sk∗×∂sk∗∂U=∑k=1t∂Lt∂sk∗×xtT∂Lt∂W+=∑k=1t∂Lt∂s∗k×∂s∗k∂W=∑k=1t∂Lt∂s∗k×sTt−1………………..(3)∂Lt∂W+=∑k=1t∂Lt∂sk∗×∂sk∗∂W=∑k=1t∂Lt∂sk∗×st−1T………………..(3)
- 這裡累加是因為權值是共享的,所以往前推算一直用的是一樣的權值
3、訓練問題
- 從 公式(2)和(3) 中可以看出,時間維度上的權重
W
更新需要計算ϕ‘(s∗k)ϕ‘(sk∗),即經過激勵函式的導數 - 如果時間維度上很長,則這個梯度是累積的,所以造成梯度消失或爆炸
- 可以想象將結構圖豎起來,就是一個深層的神經網路,所以容易出現梯度問題
- 關於梯度消失的問題可以檢視我這裡一遍部落格
RNN
主要的作用就是能夠記住之前的資訊,但是梯度消失的問題又告訴我們不能記住太久之前的資訊,改進的思路有兩點- 一是使用一些
trick
,比如合適的激勵函式,初始化,BN等等 - 二是改進
state
的傳遞方式,比如就是下面提及的LSTM
- 關於為何
LSTMs
能夠解決梯度消失,直觀上來說就是上方時間通道是簡單的線性組合
- 關於為何
- 一是使用一些
四、Long Short-Term Memory(LSTM,長短時記憶網路)
1、介紹
LSTM
是一般RNN
的升級,因為一些序列問題,我們可能需要忘記一些東西,LSTM
和普通RNN
相比, 多出了三個控制器. (輸入控制, 輸出控制, 忘記控制)- 在
LSTM
裡,這個叫做cell
(其實就是前面的state
,只是這裡更加複雜了), 可以看作一個黑盒,這個cell
結合前面cell
的輸出ht−1ht−1和當前的輸入xtxt來決定是否記憶下來,該網路結構在對長序列依賴問題中非常有效
2、結構
- 一個經典的
cell
結構如下圖- ϕ1ϕ1是
sigmoid
函式,ϕ2ϕ2 是tanh
函式 *
表示element wise
乘法(就是點乘),使用X
表示矩陣乘法
- ϕ1ϕ1是
LSTMs
的cell
的時間通道有兩條。- 上方的時間通道(h(old)→h(new)h(old)→h(new))僅包含了兩個代數運算,這意味著它資訊傳遞的方式會更為直接h(new)=h(old)∗r1+r2h(new)=h(old)∗r1+r2
- 位於下方的時間通道(s(old)→s(new)s(old)→s(new))則運用了大量的層結構,在
LSTMs
中,我們通常稱這些層結構為門(Gates
)
- 上方的時間通道(h(old)→h(new)h(old)→h(new))僅包含了兩個代數運算,這意味著它資訊傳遞的方式會更為直接
3、運算說明
Sigmoid
函式取值區間為0-1
,那麼當Sigmoid
對應的層結構輸出0
時,就對應著遺忘這個過程;當輸出1
時,自然就對應著接受這個過程。- 事實上這也是
Sigmoid
層叫門的原因——它能決定“放哪些資料進來”和決定“不讓哪些資料通過”
- 事實上這也是
- 最左邊的
Sigmoid gate
叫做遺忘門, 控制著時間通道資訊的遺忘程度- 前向計算: r1=ϕ1(W1×x∗)r1=ϕ1(W1×x∗)
- 其中 x∗=Δ[x,s(old)]x∗=Δ[x,s(old)],表示當前輸入樣本和下方時間通道s(old)s(old)連線(
concat
)起來
- 其中 x∗=Δ[x,s(old)]x∗=Δ[x,s(old)],表示當前輸入樣本和下方時間通道s(old)s(old)連線(
- 前向計算: r1=ϕ1(W1×x∗)r1=ϕ1(W1×x∗)
- 第二個
Sigmoid Gate
通常被稱為輸入門(Input Gate), 控制著當前輸入和下方通道資訊對上方通道資訊的影響- 前向運算為:g1=ϕ1(W2×x∗)g1=ϕ1(W2×x∗),
- 第三個
Tanh Gate
則允許網路結構駁回歷史資訊, 因為tanh
的值域是(-1,1)- 前向運算為:g2=ϕ2(W3×x∗)g2=ϕ2(W3×x∗)
- r2=g1∗g2r2=g1∗g2
- 第四個
Sigmoid Gate
通常被稱為輸出門(Output Gate),它為輸出和傳向下一個cell
的下方通道資訊作出了貢獻。- 對應的前向傳導演算法為:g3=ϕ1(W4×x∗)g3=ϕ1(W4×x∗)
- 最終
cell
的輸出為:o=s(new)=ϕ2(h(new))∗g3o=s(new)=ϕ2(h(new))∗g3 - 每個
Gate
對應的權值矩陣是不同的(W1∼W4W1∼W4),切勿以為它們會共享權值
Reference
- http://www.wildml.com/2015/09/recurrent-neural-networks-tutorial-part-1-introduction-to-rnns/
- http://www.wildml.com/2015/09/recurrent-neural-networks-tutorial-part-2-implementing-a-language-model-rnn-with-python-numpy-and-theano/
- https://zhuanlan.zhihu.com/p/26891871
- https://zhuanlan.zhihu.com/p/26892413
相關文章
- 迴圈神經網路神經網路
- 迴圈神經網路(RNN)神經網路RNN
- 迴圈神經網路 RNN神經網路RNN
- 迴圈神經網路介紹神經網路
- pytorch--迴圈神經網路PyTorch神經網路
- 第五週:迴圈神經網路神經網路
- 一文讀懂LSTM和迴圈神經網路神經網路
- 迴圈神經網路(Recurrent Neural Network,RNN)神經網路RNN
- 動畫圖解迴圈神經網路動畫圖解神經網路
- (一)線性迴圈神經網路(RNN)神經網路RNN
- 常見迴圈神經網路結構神經網路
- (二)非線性迴圈神經網路(RNN)神經網路RNN
- YJango的迴圈神經網路——實現LSTMGo神經網路
- 深度學習之RNN(迴圈神經網路)深度學習RNN神經網路
- 深度學習迴圈神經網路詳解深度學習神經網路
- 4.5 RNN迴圈神經網路(recurrent neural network)RNN神經網路
- 從網路架構方面簡析迴圈神經網路RNN架構神經網路RNN
- YJango的迴圈神經網路——scan實現LSTMGo神經網路
- NLP與深度學習(二)迴圈神經網路深度學習神經網路
- 迴圈神經網路LSTM RNN迴歸:sin曲線預測神經網路RNN
- [譯] RNN 迴圈神經網路系列 2:文字分類RNN神經網路文字分類
- 圖神經網路的介紹(基礎,DeepWalk和GraphSage)神經網路
- 從零開始用 Python 構建迴圈神經網路Python神經網路
- 【神經網路篇】--RNN遞迴神經網路初始與詳解神經網路RNN遞迴
- [譯] RNN 迴圈神經網路系列 3:編碼、解碼器RNN神經網路
- 用於自然語言處理的迴圈神經網路RNN自然語言處理神經網路RNN
- 使用PyTorch從零開始構建Elman迴圈神經網路PyTorch神經網路
- 迴圈神經網路之embedding,padding,模型構建與訓練神經網路padding模型
- 關於 RNN 迴圈神經網路的反向傳播求導RNN神經網路反向傳播求導
- 純Python和PyTorch對比實現迴圈神經網路RNNCell及反向傳播PythonPyTorch神經網路RNN反向傳播
- 卷積神經網路—基礎知識(1)卷積神經網路
- 【機器學習基礎】卷積神經網路(CNN)基礎機器學習卷積神經網路CNN
- 【機器學習基礎】神經網路/深度學習基礎機器學習神經網路深度學習
- python 基礎習題6--for迴圈和while迴圈PythonWhile
- 十 | 門控迴圈神經網路LSTM與GRU(附python演練)神經網路Python
- [譯] 如何在 keras 中使用迴圈神經網路創作音樂Keras神經網路
- 從前饋到反饋:解析迴圈神經網路(RNN)及其tricks神經網路RNN
- 【機器學習】李宏毅——Recurrent Neural Network(迴圈神經網路)機器學習神經網路