參考Coursera-Sequence Models
https://www.coursera.org/learn/nlp-sequence-models/notebook/X20PE/building-a-recurrent-neural-network-step-by-step
1. 普通神經網絡的缺點
- 對於不同的樣本,輸入輸出的長度可能不同
- 無法共享序列中不同位置的信息
2. RNN的基本結構與數學表達
輸入層的維數是(nx,m,Tx),其中nx是每個訓練樣本的維數,例如輸入詞one-hot向量的大小,也即詞典大小;m是一個batch的大小;Tx是輸入序列的長度。
輸出層的維數是(ny,m,Ty),其中ny是輸出預測向量的維數;m是一個batch的大小;Ty是輸出序列的長度。
我們先研究輸入向量和輸出向量相等,即nx=ny的情況。
圖2.1 RNN基本結構-輸入輸出維數相等
上下標說明:a5(2)[3]<4>表示第2個訓練樣本,第3層,第4個時刻,激活函數輸出向量的第5維。
圖2.2 RNN的一個基本單元
注意,輸出y^是狀態向量a經過線性變換再經過softmax變換得到的。
a⟨t⟩y^⟨t⟩=tanh(Waxx⟨t⟩+Waaa⟨t−1⟩+ba)=softmax(Wyaa⟨t⟩+by)(2-1)
3. GRU(Gated Recurrent Unit)
GRU的提出是爲了解決RNN難以學習到輸入序列中的長距離信息的問題。
GRU引入一個新的變量——記憶單元,簡稱C。C⟨t⟩其實就是a⟨t⟩
C的表達式不是一步到位的,首先定義C的候選值C~:
C~⟨t⟩=tanh(Wc[C⟨t−1⟩,x⟨t⟩]+bc)
更新門:
Γu=σ(Wu[C⟨t−1⟩,x⟨t⟩]+bu)
在實際訓練好的網絡中Γ要麼很接近1要麼很接近0,對應着輸入序列裏面有些元素起作用有些元素不起作用。
C⟨t⟩=Γu∗C~⟨t⟩+(1−Γu)∗C⟨t−1⟩
也即輸入序列的有些元素,記憶單元不需要更新,有些元素需要更新。
The cat, which already ate …, was full
cat後面的詞直到was之前,都不需要更新C,直接等於cat對應的C
可以解決梯度消失的問題.輸出層的梯度可以傳播到cat處
注:C和Γ都可以是想聊,它們在相乘時採用的是element-wise的乘法。當爲向量時,與cat的單複數無關的詞對應的Γ可能有些維度爲零,有些維度不爲零。爲零的維度,是用來保留cat的單複數信息的;不爲零的維度可能是保留其他語義信息的,比如是不是food呀之類的
目前討論的是簡化版的GRU,結構圖如下
完整的GRU:
C~⟨t⟩ΓuΓrC⟨t⟩a⟨t⟩=tanh(Wc[Γr∗C⟨t−1⟩,x⟨t⟩]+bc)=σ(Wu[C⟨t−1⟩,x⟨t⟩]+bu)=σ(Wr[C⟨t−1⟩,x⟨t⟩]+br)=Γu∗C~⟨t⟩+(1−Γu)∗C⟨t−1⟩=C⟨t⟩(3-1)
Γr表示了C~⟨t⟩和C⟨t−1⟩之間的相關程度
4 LSTM(Long Short-Term Memory)
沒有了Γr,將1−Γu用Γf代替
C~⟨t⟩ΓuΓfΓoC⟨t⟩a⟨t⟩y~⟨t⟩=tanh(Wc[a⟨t−1⟩,x⟨t⟩]+bc)=σ(Wu[a⟨t−1⟩,x⟨t⟩]+bu)=σ(Wf[a⟨t−1⟩,x⟨t⟩]+bf)=σ(Wo[a⟨t−1⟩,x⟨t⟩]+bo)=Γu∗C~⟨t⟩+Γf∗C⟨t−1⟩=Γo∗tanh(C⟨t⟩)=softmax(a⟨t⟩)(4-1)
(注意公式裏面的Γu等價於圖片中的Γi)
圖4.1 LSTM的一個基本單元
圖4.2 標準LSTM模型-輸入維數等於輸出維數]
4.1. peephole連接
圖4.3 LSTM變種-peephole
5. RNN的反向傳播
dL/di=dL/da⋅da/dz⋅dz/di
5. RNN實戰技巧
5.1. 對梯度的範圍進行限制
在反向傳播的過程中,爲了避免梯度爆炸,可以對梯度的值進行限制,具體來說,可以給定一個區間[-a,a],小於-a的值強行定爲-a,大於a的值強行定爲a
5.2. 對輸出值進行採樣