瞭解RNN以前,神經網絡的知識是前提,若是想了解神經網絡,能夠去參考一下我以前寫的博客:數據挖掘入門系列教程(七點五)之神經網絡介紹 and 數據挖掘入門系列教程(八)之使用神經網絡(基於pybrain)識別數字手寫集MNISThtml
這篇博客介紹RNN的原理,同時推薦你們去看李宏毅老師的課程:ML Lecture 21-1: Recurrent Neural Network (Part I)。基本上看完他的課程,也就沒有必要看這篇博客了。算法
RNN全稱Recurrent Neural Network ,中文名爲循環神經網絡(亦或稱遞歸神經網絡)。相信你們在看這篇博客以前都已經簡單的瞭解過RNN。將RNN說的簡單一點,就是進行預測(或者回歸)的時候,不只要考慮到當前時刻的輸入,還要考慮上一個時刻的輸入(甚至有些RNN的變種還會考慮將來的狀況)。換句話說,預測的結果不只與當前狀態有關,還與上一個時刻的狀態有關。網絡
RNN用於處理時序信息 。而在傳統的神經網絡中,咱們認爲輸入的 \(x_1,x_2,x_3\),是相互獨立的:好比說在Iris分類中,咱們認爲鳶尾花的長寬是獨立的,之間不存在先後序列邏輯關係。架構
儘管傳統的神經網絡在預測中可以取得不錯的成績(好比說人臉識別等等),可是對於如下方式情景可能就心有餘而力不足了。框架
當咱們想要預測一段話「小丑竟是我自____」時,咱們必須根據前文的意思來predict。而RNN之因此叫作循環(recurrent),這是由於它的預測會考慮之前的信息。換句話說,也就是RNN具備memory,它「記得」以前計算後的狀況。函數
在知乎全面理解RNN及其不一樣架構上,說了一個很形象的例子:學習
以捏陶瓷爲例,不一樣角度至關於不一樣的時刻:ui
- 若用前饋網絡:網絡訓練過程至關於不用轉盤,而是徒手將各個角度捏成想要的形狀。不只工做量大,效果也難以保證。
- 若用遞歸網絡(RNN):網絡訓練過程至關於在不斷旋轉的轉盤上,以一種手勢捏造全部角度。工做量下降,效果也可保證。
RNN的原理圖,咱們最常見的即是如左圖所示,可是實際上將它展開,即是以下右圖所示。spa
在RNN中,咱們能夠將黃框稱之爲一個layer,全部的layer的參數在一個batch中是相同的(參數共享),也就是說,上圖中的 \(U,W,V\) 等參數在某個batch所有相同。(經過一個batch的訓練以後,通過反向傳播,參數會發生改變)3d
Layer的層數根據本身的須要來定,舉個例子,好比說咱們分析的句子是5個單詞構成的句子,那麼layer的層數即是5,每個layer對應一個單詞。
上圖既有多個輸入\(X_{t-1},X_{t},X_{t+1}\) , 也能夠有多個輸出\(O_{t-1},O_{t},O_{t+1}\) , 可是實際上輸出能夠根據實際的須要而定,既能夠爲多個輸出,也能夠只有一個輸出,有以下幾種:
Type of RNN | Illustration | Example |
---|---|---|
One-to-one \(T_x=T_y=1\) | ![]() |
Traditional neural network |
One-to-many \(T_x=1, T_y>1\) | ![]() |
Music generation |
Many-to-one \(T_x>1, T_y=1\) | ![]() |
Sentiment classification |
Many-to-many \(T_x=T_y\) | ![]() |
Name entity recognition |
Many-to-many \(T_x\neq T_y\) | ![]() |
Machine translation |
Gif圖以下所示:
下圖是李宏毅老師在課堂上講的一個例子。
下面是來自Recurrent Neural Networks cheatsheet對RNN原理的解釋:
\(a^{<t>}\) 和 \(y^{<t>}\) 的表達式以下所示:
\(W_{a x}, W_{a a}, W_{y a}, b_{a}, b_{y}\) 在時間上是共享的:也就是說,在一個batch中,不管是哪個layer,其\(W_{a x}, W_{a a}, W_{y a}, b_{a}, b_{y}\)都是相同的(shared temporally)。固然,通過一個batch的訓練以後,其值會由於反向傳播而發生改變。
\(g_{1}, g_{2}\) 皆爲激活函數(好比說tanh,sigmoid)
$ \mathcal{L}$ 爲可微分的損失函數,好比交叉熵,其中\(y^{<t>}\)爲t時刻正確的詞語,\(\hat{y}^{<t>}\)爲t時刻預測的詞語。
反向傳播目的就是求預測偏差 \(E\) 關於全部參數 \((U, V, W)\) 的梯度, 即 \(\frac{\partial E}{\partial U}, \frac{\partial E}{\partial V}\) 和 \(\frac{\partial E}{\partial W}\) 。關於具體的推導能夠參考循環神經網絡(RNN)模型與前向反向傳播算法。
知道梯度後,即可以對參數係數進行迭代更新了。
在上述博客中,簡單的對RNN進行了介紹,介紹了RNN做用,以及部分原理。而在下篇博客中,我將介紹如何使用keras構建RNN模型寫唐詩。🤭