1. 程式人生 > >深度學習-*-RNN正向及反向傳播

深度學習-*-RNN正向及反向傳播

RNN簡介

RNN(迴圈神經網路)是深度神經網路中,應用最廣泛的兩種神經網路架構之一。並且,作為一種時序結構的神經網路,RNN經常用於時序相關的問題中,且在NLP中應用廣泛。還有一種RNN稱為遞迴神經網路,雖然名字類似,但是卻是不一樣的架構。

RNN圖示

RNN結構圖
x t x_t 是輸入層資料, s

t s_t 是隱含層資料, o t o_t 是輸出層資料,我們令:每一個 y
t y_t
是t時刻對應的真實輸出, y t h a t
y^{hat}_t
是對 o t o_t 進行softmax計算之後得到的估計值。 U U 是輸入層到隱含層的權重, W W 是上一時刻隱含層到當前時刻隱含層的權重, V V 是隱含層到輸出層的權重。

正向傳播

由上圖易知: a t = b + W s t 1 + U x t a_t=b+W*s_{t-1}+U*x_t s t = t a n h ( a t ) s_t=tanh(a_t) o t = c + U s t o_t=c+U*s_t y t h a t = s o f t m a x ( o t ) y^{hat}_t=softmax(o_t)
我們假設t時候的損失函式為 L t L^t (一般為交叉熵損失/負對數似然),則一次正向傳播的損失 L = t L t L=\sum_tL^t

反向傳播

反向傳播中,還是使用鏈式推導方法,與傳統的神經網路推導類似。但不一樣的地方在於隱含層受到了前一時刻隱含層的影響,故 t t 時刻隱含層 s t s_t 的誤差傳播源來自於 o t o_t s t + 1 s_{t+1} 兩個方向。這裡推導我是參考了很多部落格文章,但是一直都沒理解。後來看了文獻1,多少有點明白的意思。有幸各位大牛們看了這篇文章,請指點。
我們首先看誤差對 o t o_t 的影響 o t L = L o t = L t o t = y t y t h a t I i = j y t \nabla o_tL=\frac{\partial L}{\partial o_t}=\frac{\partial L^t}{\partial o_t}=y_t*y^{hat}_t-I_{i=j}*y_t 其中i是當前資料所屬真實類別索引,j為所有類別的索引分量。當i=j時, I i = j I_{i=j} 是1,否則是0,參考了文獻2。
假設總時刻長度為 t = τ t=\tau , s t L = V T o t L t = τ \nabla s_tL = V^T*\nabla o_tL,t=\tau s t L = ( s t + 1 L s t L ) s t + 1 L + ( o t L s t L ) o t L t < τ \nabla s_tL=(\frac{\partial s_{t+1}L}{\partial s_tL})*\nabla s_{t+1}L + (\frac{\partial o_{t}L}{\partial s_tL})*\nabla o_{t}L,t<\tau
也就是說最後一個節點的隱含層誤差只來源於他的輸出層。其餘各層除了本身輸出層外,還會有上一層的誤差來源。通過鏈式求導有
s t L = W T s t + 1 L d i a g ( 1 s t + 1 2 ) + V T o t L t < τ d i a g \nabla s_tL=W^T*s_{t+1}L*diag(1-s_{t+1}^2)+V^T*\nabla o_tL,t<\tau,diag是對角線矩陣