1. 程式人生 > >迴圈神經網路(一般RNN)推導

迴圈神經網路(一般RNN)推導

本文章的例子來自於WILDML

vanillaRNN是相比於LSTMs和GRUs簡單的迴圈神經網路,可以說是最簡單的RNN。

RNN結構

RNN結構

RNN的一個特點是所有的隱層共享引數(U,V,W),整個網路只用這一套引數。

RNN前向傳導

st=tanh(Uxt+Wst1)
ot=softmax(Vst)

stt時刻隱層的狀態值,為向量。
ott時刻輸出的值(這裡是輸入一個xt就有一個輸出ot,這個是不必要的,也可以在全部x輸入完之後開始輸出,根據具體應用來設計模型)

本文例子介紹:RNN語言模型

關於語言模型的介紹就不說了,是NLP基礎。這裡只說說輸入和輸出的內容。

語言模型的生成屬於無監督學習,只需要大量的文字即可生成。我們只需要做的是構造訓練資料。

構造過程:
1. 生成詞典vocab。(分詞、去掉低頻詞)
2. 將語料中的句子轉為word_id序列,並在頭尾加上開始和結束id。
3. 生成訓練資料:對於每個句子,輸入為前len(sent)-1的序列,輸出為後len(sent)-1的序列(也就是輸入一個詞就預測下一個詞)

如,“我 在 沙灘 上 玩耍”輸入的向量為[0,5,85,485,416,55],輸出的向量為[5,85,485,416,55,1]

假設我們的詞彙有8000個,採用one-hot向量,則每個輸入xt為8000維,對應的位置為1,其他為0。隱層設定100個神經元。
則列出網路所有引數和輸入輸出的shape,方便推導:
x

tR8000
otR8000
stR100
UR100×8000
VR8000×100
WR100×100

總引數量為2HC+H2,即1,610,000。

損失函式(loss function)採用交叉熵:
Et(yt,y^t)=ytlogy^t
E(y,y^)=tEt(yt,y^t)=tytlogy^t
其中yt為t時刻正確的詞語,y^t為t時刻預測的詞語。

反向傳播

反向傳播目的就是求預測誤差E關於所有引數(U,V,W)的梯度,即EUEVEW

如下圖所示,每個時刻t預測的詞都有相應的誤差,我們需要求這些誤差關於引數的所有梯度,最後進行引數的下降調整操作(由於目標是降低Loss function,所以是梯度下降,如果是目標是最大似然,則為梯度上升)。
誤差生成

我們這裡以計算E3關於引數的梯度為例(其他Et都需要計算):

E3V=E3y^3y^3V=E3y^3