在RNN裏繞蒙圈

在上一篇文章《什麼是seq2seq模型》中簡單介紹了一下Seq2Seq。

在上次Seq2Seq的基礎之上,我們聊一下RNN。

什麼是RNN

在瞭解RNN的具體原理之前,我們先來看一下WIKI對RNN的介紹。

A recurrent neural network (RNN) is a class of artificial neural networks where connections between nodes form a directed graph along a temporal sequence. This allows it to exhibit temporal dynamic behavior. Derived from feedforward neural networks, RNNs can use their internal state (memory) to process variable length sequences of inputs.

遞歸神經網絡(RNN)是一類人工神經網絡,其中節點之間的連接沿着時間序列形成有向圖。這允許它表現出時間動態行爲。神經網絡源自前饋神經網絡,可以利用其內部狀態來處理可變長度的輸入序列。

所以神經網絡的主要特點在於:

  1. 能夠構建時間序列,表現出時間動態行爲。
  2. 在前饋神經網絡的基礎上衍生而來
  3. 處理可變長度的輸入序列

從深度神經網絡(DNN)說起

既然,RNN是從DNN衍生而來,那麼我們就從DNN說起。

如下圖所示,我們給出了一張DNN的網絡結構圖。

圖1 前饋神經網絡的基本結構

比如,我們在神經網絡中需要處理一個這樣的序列:

input:我是一個程序員。

output:I am a loser!

這個時候如果輸入輸出對是:

[(我, I), (是, am), (一個 a), (程序員, loser)]

這個時候input layer對應的輸入分別爲:

我, 是, 一個, 程序員

output layer對應的輸出爲:

I, am, a, loser

在這個時候,第一個輸入輸出對(我, I)(是, am)這個輸入輸出對實際上存在序列關係,但是深度神經網絡沒有辦法捕獲這種關係。

這個時候,我們想是不是有一種方法能夠根據記錄前一個輸入的狀態,從而構建出有效的序列關係。

比如輸入 “I” 該網絡可以知道後面是 “am"用第一人稱,輸入"he” 知道用第三人稱"is"。

RNN的基本結構及原理

在DNN模型結構的基礎上,我們有了樸素的希望構建序列之間關係的想法之後,第一個反應就是:
我們能否通過一個hidden state在網絡中隱性地傳遞下去,記錄序列之間的關係。

基於此,我們得到一個基本的RNN模型中神經元的結構大概也就是下面這個亞子!

RNN單個神經元細胞

在上面的圖中,我們的這個權重ww用於記錄模型訓練過程中的序列狀態。

還是以上面這個例子來說明爲題,那麼現在輸入輸出對就成了這個樣子。

[((我, w0w_0), (I, w1w_1)),

((是, w2w_2), (am, w3w_3)),

((一個, w3w_3), (a, w4w_4)),

((程序員, w4w_4), (loser, w5w_5))]

那麼這單個神經元在時間維度上展開可以表示爲如下方式:

圖2 RNN單個細胞按照時間維度展開

看一下這圖片,這曲線着身材是不是高端大氣上檔次。

RNN的數學描述

在上面的基礎上,有了模型結構和基本思想之後,我們試圖想辦法用數學形式來定義和描述上面的模型結構。

畢竟,在程序員眼裏沒有辦法用數學形式描述的東西都是耍流氓。

沒有辦法轉化成0,1二進制的東西都是瞎扯淡,接下來要開始痛苦的歷程了。

在《Recurrent Neural Networks cheatsheet》這樣寫道:

Recurrent neural networks are a strict superset of feedforward neural networks,
augmented by the inclusion of recurrent edges that span adjacent time steps,
introducing a notion of time to the model.

RNN是一個嚴格的前饋神經網絡超集,增加了包含一條循環的邊來連接臨近的步長,從而在模型中引入時序的概念。

根據上面這段描述,我們可以簡單知道的是:

  • 在瞭解RNN之前,我們有必要先回顧一下feedforward nerual的神經網絡結構和數學形式的描述。

  • RNN是feedforward nerual的超集。那麼在數學形式的描述上必然有很多相似的地方。

  • RNN在feedforward nerual的基礎上增加了一條遞歸邊以記錄時間序列。那麼相比於前饋神經網絡。怎麼樣描述那條遞歸邊是一個非常重要的問題。

FNN 數學形式的描述

如圖3所示,feedforward nerual network中單個神經元的構成如下。

圖3 feedforward nerual artificial neuron

在圖3中,給出了神經網絡中的一個神經元jj的,這個神經元的輸入爲x1,...,xnx_1,...,x_n

通過這個神經元之後我們得到一個未激活值:
aj=j  =0nwjj  xj  a_j = \sum_{j\;'=0}^{n}w_{jj\;'}{x_{j\;'}}

在未激活值的基礎上,採用softmax做激活函數得到激活值:
σ(aj)=11+eaj\sigma(a_j) = \frac{1}{1+e^{-a_j}}

RNN的數學形式描述

在上述網絡的基礎上,來看一下RNN的數學形式描述是什麼樣子的?

圖4 RNN nerual artiticial neuron

圖4所示,是一個神經元的結構,那麼這一層hidden layer我們需要通過什麼樣的方式來描述這一個Hidden Layer。

此外,在完成這個描述的基礎上我們通過這個Hidden Layer完成前向傳播和後向傳播的模型訓練。

我們依舊考慮在 tt 時刻的某一個神經元 jj

這個時候輸入層輸入的輸入爲向量 xtx^t,上一次輸入對應的狀態值爲 ht1h^{t-1}

根據這些條件,我們計算當前狀態值爲:

ht=σ(Whxxt+Whhht1+bh)h^t=\sigma(W_{hx}x^t + W_{hh}h^{t-1}+b_h)

y^t=softmax(Wyhht+by)\hat{y}^t = softmax(W_{yh}h^t + b_y)

根據上述公式,我們完全可以計算得到這一次輸入的對應的狀態位輸出 hth^t 和輸出層輸出 y^t\hat{y}^t

其中不同參數的含義如下:

WhxW_{hx}: 是輸入和隱藏層之間的權重矩陣

WhhW_{hh}: 是相鄰步長上隱藏層之間的遞歸權重矩陣。

WyhW_{yh}: 是隱藏層到輸出層之間的權重

bhb_h: 是隱藏層便置量

byb_y: 輸出層偏置量。

爲什麼是這個樣子

在前饋網絡的基礎上,我們得到了一個RNN神經元的數學表示形式如下:

ht=σ(Whxxt+Whhht1+bh)h^t=\sigma(W_{hx}x^t + W_{hh}h^{t-1}+b_h)

y^t=softmax(Wyhht+by)\hat{y}^t = softmax(W_{yh}h^t + b_y)

那麼有一個靈魂問題,這個公式爲什麼是這個樣子?

  • 存在不一定合理
  • 即使在合理的情況下也不一定合適

我們對比一下FNN和RNN單個神經元的描述形式會發現。

在FNN中對輸出的計算描述成爲的公式如下:

σ(aj)=11+eaj\sigma(a_j) = \frac{1}{1+e^{-a_j}}

在RNN中,對輸出的計算公式描述方式爲
y^t=softmax(Wyhht+by)\hat{y}^t = softmax(W_{yh}h^t + b_y)

這兩個公式在本質上沒有太大的區別,而唯一的區別在於輸入的不同。

在FNN中,我們將輸入層給出的輸入直接作爲Input的結果參與到未激活值的計算,然後激活得到激活值。

在RNN中,神經網絡和FNN中的區別之處在於原本直接作爲輸入的輸入向量 xx 需要和隱藏狀態hidden status做一下加權。

因此,在神經網絡的訓練過程中,我們認爲這個時候的計算激活值的 y^t\hat{y}^t 不僅僅攜帶輸入信息還攜帶了前面的信息。

參考資料

一文詳解什麼是RNN(循環神經網絡)

Understanding RNN and LSTM

Recurrent Neural Networks cheatsheet

Deep Learning: Feed Forward Neural Networks (FFNNs)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章