用「動圖」和「舉例子」講明白RNN

RNN本質上是在原有全連接神經網路的基礎上,增加了一個時間軸的概念。所帶來的影響是:同樣的數據,不同的輸入順序,會得到不同的結果。這樣的效果天生適合處理跟時間順序(時序)有關的數據,比如語音、文本、翻譯……,其實,隨著RNN的發展,某些變種甚至還能巧妙地用在圖像處理問題上,達到不輸CNN的效果。

基於全連接神經網路發展而來的CNN和RNN,我們可以簡單的把他倆的長處區分為:

  • CNN能「看懂」圖形
  • RNN能「記住」順序

RNN如此有效就在於它擁有記憶能力,尤其是LSTM(RNN的一個應用廣泛的變種)更是在長期記憶方面有不俗的表現。

網上很多文章對於RNN的構成和運作原理已經介紹的很詳細了。不過由於基礎不同,筆者發現有些入門同學在閱讀網上資料時對一些部分難以理解,這篇文章會側重於用形象化講給最基礎的入門同學。有不準確的地方,還請指正!

先看一下之前學習的全連接神經網路

喂數據時的動態圖

然後,為與網路上其他教程一致,先把整個網路旋轉90度

接著引入時間概念。

圖上的t我們稱為時間步(time_step),每個t稱為1步,t1-t5為1個周期。

然後引入記憶概念。把上一個時間步產生的結果( Y_{t-1} )同X一起輸入進去

RNN之所以有記憶力,是因為在每個t完成後,其產生的結果會在下一個t開始時,與X一起輸送給RNN運算,相當於輸入中包含了之前所有t的「精華」

現在將RNN的運算部分包裝起來,並把相應變數修改為慣例字母。其實普通RNN內部並非為多層網路,僅僅是一個tanh層。

這個圖按時間軸展開,即為常見的RNN結構圖

圖片來自《Understanding LSTM Networks》


很多初學者在接觸time_step時,很容易與全神經網路下的batch混淆。下面我們區分一下。

我們用碎紙做個比方。有一張A4紙,長寬分別為297*210 mm,現在要把紙塞進碎紙機里。

圖片來自淘寶

在這個例子中,

  • A4紙就是數據,總數據量為297*210,
  • 碎紙機是神經網路
  • 輸出的結果是粉碎的紙,這裡我們先不管輸出是什麼樣,只關注輸入。

每次塞紙時,都要正拿A4紙,把210的一邊沖著碎紙機的口塞入。

現在開始考慮各個參數的意義。

下圖代表input_size=1,batch=1,餵給碎紙機的是一個1*1的小紙片,訓練1000次代表喂1000次紙;

下圖代表數據維度input_size=210,batch=1,也就說,數據本身發生了變化——增加維度了;

下圖代表input_size=1,批次batch=297,數據本身沒變,每次訓練時進的數據量多了

相應的,下圖就代表input_size=210,batch=297,一共只需要1次就能訓練完所有數據。

以上是我們之前學習的全連接神經網路。

現在引入RNN。RNN保留了之前所有參數,並增加了參數time_step(時間步),對於這個例子,我們應該怎麼理解這個新參數呢?

此刻你手中的紙突然有了厚度(10*297*210),碎紙機還是那台,紙變厚了,就必須切片才能塞進去,在這個例子中,紙被切成了10層。

  1. RNN要求你,每次塞紙時,不管紙是什麼形狀(不管batch等於多少),都必須把10層紙依次、先後、全塞進去,才算一次完整的喂紙,中間不許停(time_step=10)
  2. 同時,每層紙在進紙時,還需要跟上層產生的碎紙片一起塞進去( h_{t-1}+x_{t}

至此,我們看到,batch依然保留,與time_step分別代表不同意義。

其實,從另一個角度也可以區分,time_step是神經網路的參數,網路建好了便不會改變;batch是訓練參數,在訓練時可根據效果隨時調整。


推薦閱讀:

基於Numpy實現同態加密神經網路
機器學習是一種認識世界的方式
RNN part 6-Bidirectional RNN
人工神經網路
當Node.js遇上OpenCV深度神經網路

TAG:神經網路 | RNN | 教程 |