迴圈神經網路

Galois發表於2020-03-14

理論

Embedding 與 Padding

  • Embedding 是把神經網路應用到 NLP 上的關鍵層,能夠把詞語轉化成數字,從而讓迴圈神經網路可以讀取。
  • 序列式問題
  • 迴圈神經網路
  • LSTM 模型

    Embedding

    One-hot 編碼
  • Word -> index -> [0, 0, 0, …, 0, 1, 0, …, 0]
    Dense embedding
  • Word -> index -> [1.2, 4.2, 2.9, …, 0.1]

    Padding

  • Word index: [3,2,5,9,1]
  • padding: [3,2,5,9,1,0,0,0,0,0]

    0: unknow word(UNK)
    如果位數不足,用「padding」,如果位數溢位,用「截斷」。

合併

rTFb5ZJUlA.png!large

合併 + padding 的缺點

合併 + padding 的操作會使資訊丟失,比如多個 embedding 合併,會產生 Pad 噪音,無主次。這樣做會有太多的無效計算,非常抵消,因為有太多的 padding。

序列式問題

aeNVJEg6WD.png!large

迴圈神經網路

XWaADmpDGw.png!large

上圖中虛線的作用是維護一個狀態作為下一步的額外輸入,每一步使用同樣的啟用函式和引數。

s_t=f_W(s_{t-1},x_t)

s_t代表新狀態,s_{t-1}代表舊狀態,x_t代表輸入,f_W代表「RNN」的計算函式。

s_t=f_W(s_{t-1},x_t)\\{}\\ \downarrow\\{}\\ s_t=\tanh(Ws_{t-1}+Ux_t)\\{}\\ \widehat{y_t}=\mathrm{softmax}(Vs_t)

EdtMzSS9Pu.png!large

傳統文字處理任務的方法中一般將 TF-IDF 向量作為特徵輸入。顯而易見,這樣的表示實際上丟失了輸入的文字序列中每個單詞的順序。在神經網路的建模過程中,一般的前饋神經網路,如卷積神經網路,通常接受一個定長的向量作為輸入。卷積神經網路對文字資料建模時,輸入變長的字串或者單詞串,然後透過滑動視窗加池化的方式將原先的輸入轉換成一個固定長度的向量表示,這樣做可以捕捉到原文字中的一些區域性特徵,但是兩個單詞之間的長距離依賴關係還是很難被學習到。
迴圈神經網路卻能很好地處理文字資料變長並且有序的輸入序列。它模擬了人閱讀一篇文章的順序,從前到後閱讀文章中的每一個單詞,將前面閱讀到的有用資訊編碼到狀態變數中去,從而擁有了一定的記憶能力,可以更好地理解之後的文字。
其網路結構如下圖所示:

iDDCB3zJwp.png!large

由圖可見,t是時刻,x是輸入層,s是隱藏層,o是輸出層,矩陣W就是隱藏層上一次的值作為這一次的輸入的權重。
輸出層o和隱藏層s的計算方法:

\displaystyle o_t=g(Vs_t)\\{}\\ s_t=f(Ux_t+Ws_{t-1})

可以連續檢視o_t迭代關係:

\displaystyle o_t=g(Vs_t)\\{}\\ =Vf(Ux_t+Ws_{t-1})\\{}\\ =Vf(Ux_t+Wf(Ux_{t-1}+Ws_{t-2}))\\{}\\ =Vf(Ux_t+Wf(Ux_{t-1}+Wf(Ux_{t-2}+Ws_{t-3})))\\{}\\ =Vf(Ux_t+Wf(Ux_{t-1}+Wf(Ux_{t-2}+Wf(Ux_{t-3}+...))))

其中fg為啟用函式,U為輸入層到隱含層的權重矩陣,W為隱含層從上一時刻到下一時刻狀態轉移的權重矩陣。在文字分類任務中,f可以選取\tanh函式或者\mathrm{ReLU}函式,g可以採用\mathrm{Softmax}函式。

透過最小化損失誤差(即輸出的y與真實類別之間的距離),我們可以不斷訓練網路,使得得到的迴圈神經網路可以準確地預測文字所屬的類別,達到分類目的。相比於卷積神經網路等前饋神經網路,迴圈神經網路由於具備對序列順序資訊的刻畫能力,往往能得到更準確的結果。

訓練演算法

RNN 的訓練演算法為:BPTT
BPTT 的基本原理和 BP 演算法是一樣的,同樣是三步:
1.前向計算每個神經元的輸出值;
2.反向計算每個神經元的誤差項值,它是誤差函式E對神經元j的加權輸入的偏導數;
3.計算每個權重的梯度。
最後再用隨機梯度下降演算法更新權重。
具體參考:詳解迴圈神經網路(Recurrent Neural Network)
最後由鏈式法則得到下面以雅可比矩陣來表達的每個權重的梯度:

\displaystyle 迴圈層權重矩陣W的梯度的公式\\{}\\ \nabla _WE=\sum_{i=1}^t\nabla _W {_{_i}}E\\{}\\ =\left [\begin{matrix} \delta_1^ts_1^{t-1} & \delta_1^ts_2^{t-1} & \cdots & \delta_1^ts_n^{t-1}\\{}\\ \delta_2^ts_1^{t-1} & \delta_2^ts_2^{t-1} & \cdots & \delta_2^ts_n^{t-1}\\{}\\ \vdots & \vdots & \ddots & \vdots\\{}\\ \delta_n^ts_1^{t-1} & \delta_n^ts_2^{t-1} & \cdots & \delta_n^ts_n^{t-1} \end{matrix} \right] +\cdots+\left [\begin{matrix} \delta_1^1s_1^0 & \delta_1^1s_2^0 & \cdots & \delta_1^1s_n^0\\{}\\ \delta_2^1s_1^0 & \delta_2^1s_2^0 & \cdots & \delta_2^1s_n^0\\{}\\ \vdots & \vdots & \ddots & \vdots\\{}\\ \delta_n^1s_1^0 & \delta_n^1s_2^0 & \cdots & \delta_n^1s_n^0 \end{matrix} \right]\\{}\\ 迴圈層權重矩陣U的梯度的公式\\{}\\ \nabla_U{_{_t}}E=\left[ \begin{matrix} \delta_1^tx_1^t & \delta_1^tx_2^t & \cdots & \delta_1^tx_m^t\\{}\\ \delta_2^tx_1^t & \delta_2^tx_2^t & \cdots & \delta_2^tx_m^t\\{}\\ \vdots & \vdots & \ddots & \vdots\\{}\\ \delta_n^tx_1^t & \delta_n^tx_2^t & \cdots & \delta_n^tx_m^t \end{matrix} \right]

由於預測的誤差是沿著神經網路的每一層反向傳播的,因此當雅克比矩陣的最大特徵值大於1時,隨著離輸出越來越遠,每層的梯度大小會呈指數增長,導致梯度爆炸;反之,若雅克比矩陣的最大特徵值小於1,梯度的大小會呈指數縮小,產生梯度消失。對於普通的前饋網路來說,梯度消失意味著無法透過加深網路層次來改善神經網路的預測效果,因為無論如何加深網路,只有靠近輸出的若干層才真正起到學習的作用。這使得迴圈神經網路模型很難學習到輸入序列中的長距離依賴關係
RNN梯度下降的詳細推導

梯度爆炸的問題可以透過梯度裁剪來緩解,即當梯度的正規化大於某個給定值時,對梯度進行等比收縮。而梯度消失問題相對比較棘手,需要對模型本身進行改進。深度殘差網路是對前饋神經網路的改進,透過殘差學習的方式緩解了梯度消失的現象,從而使得我們能夠學習到更深層的網路表示;而對於迴圈神經網路來說,長短時記憶模型及其變種門控迴圈單元等模型透過加入門控機制,很大程度上彌補了梯度消失所帶來的損失。

在英文裡遞迴神經網路(recursive neural network)和迴圈神經網路(recurrent neural net work)都簡稱 RNN,雪上加霜的是,有些地方把 recurrent neural network 翻譯成遞迴伸進網路,或者,時間遞迴神經網路。
一般提到的 RNN 指的是 recurrent neural network,也就是迴圈神經網路。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
不要試圖用百米衝刺的方法完成馬拉松比賽。

相關文章