在上一篇文章《什麼是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)是一類人工神經網絡,其中節點之間的連接沿着時間序列形成有向圖。這允許它表現出時間動態行爲。神經網絡源自前饋神經網絡,可以利用其內部狀態來處理可變長度的輸入序列。
所以神經網絡的主要特點在於:
- 能夠構建時間序列,表現出時間動態行爲。
- 在前饋神經網絡的基礎上衍生而來
- 處理可變長度的輸入序列
從深度神經網絡(DNN)說起
既然,RNN是從DNN衍生而來,那麼我們就從DNN說起。
如下圖所示,我們給出了一張DNN的網絡結構圖。
比如,我們在神經網絡中需要處理一個這樣的序列:
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模型中神經元的結構大概也就是下面這個亞子!
在上面的圖中,我們的這個權重用於記錄模型訓練過程中的序列狀態。
還是以上面這個例子來說明爲題,那麼現在輸入輸出對就成了這個樣子。
[((我, ), (I, )),
((是, ), (am, )),
((一個, ), (a, )),
((程序員, ), (loser, ))]
那麼這單個神經元在時間維度上展開可以表示爲如下方式:
看一下這圖片,這曲線着身材是不是高端大氣上檔次。
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中,給出了神經網絡中的一個神經元的,這個神經元的輸入爲
通過這個神經元之後我們得到一個未激活值:
在未激活值的基礎上,採用softmax做激活函數得到激活值:
RNN的數學形式描述
在上述網絡的基礎上,來看一下RNN的數學形式描述是什麼樣子的?
圖4所示,是一個神經元的結構,那麼這一層hidden layer我們需要通過什麼樣的方式來描述這一個Hidden Layer。
此外,在完成這個描述的基礎上我們通過這個Hidden Layer完成前向傳播和後向傳播的模型訓練。
我們依舊考慮在 時刻的某一個神經元 。
這個時候輸入層輸入的輸入爲向量 ,上一次輸入對應的狀態值爲 。
根據這些條件,我們計算當前狀態值爲:
根據上述公式,我們完全可以計算得到這一次輸入的對應的狀態位輸出 和輸出層輸出
其中不同參數的含義如下:
: 是輸入和隱藏層之間的權重矩陣
: 是相鄰步長上隱藏層之間的遞歸權重矩陣。
: 是隱藏層到輸出層之間的權重
: 是隱藏層便置量
: 輸出層偏置量。
爲什麼是這個樣子
在前饋網絡的基礎上,我們得到了一個RNN神經元的數學表示形式如下:
那麼有一個靈魂問題,這個公式爲什麼是這個樣子?
- 存在不一定合理
- 即使在合理的情況下也不一定合適
我們對比一下FNN和RNN單個神經元的描述形式會發現。
在FNN中對輸出的計算描述成爲的公式如下:
在RNN中,對輸出的計算公式描述方式爲
這兩個公式在本質上沒有太大的區別,而唯一的區別在於輸入的不同。
在FNN中,我們將輸入層給出的輸入直接作爲Input的結果參與到未激活值的計算,然後激活得到激活值。
在RNN中,神經網絡和FNN中的區別之處在於原本直接作爲輸入的輸入向量 需要和隱藏狀態hidden status做一下加權。
因此,在神經網絡的訓練過程中,我們認爲這個時候的計算激活值的 不僅僅攜帶輸入信息還攜帶了前面的信息。