標籤:

DL 學習 - 認識 RNN

最近開始學習循環神經網路(Recurrent Neural Networks / RNN),發現了一個博客 WILDML,野生機器學習?哈哈。作者名叫 Denny Britz,在 Google Brain 工作。他的博客中有一個 RNN 入門的系列文章寫得很棒,我的筆記也就從總結他關於 RNN 的系列入門博客開始:PART 1 – INTRODUCTION TO RNNS。

啥是 RNN?

通常傳統神經網路各個節點的輸入和輸出都是獨立的,這樣的設定並不適用於處理某些有序的信息,例如預測一句正在被說出的話的下一個字:

星期三晚上,我吃了超多米飯,覺得很( )

前面這些字的順序是帶有信息的。假設一個人在猜上面括弧內的字,看到「感到很」,會推測這是一個形容詞,繼續往前看到「吃了超多」,會自然認為這個形容詞和吃得多有關,如飽、撐、脹等。在這樣的應用場景下,就不合適將括弧前的每個字作為獨立輸入來處理。RNN 模型則是能對有序數據的每個輸入單位都做相同的運算,而每個單位的輸出都依賴於之前的計算結果。換言之,RNN 模型是有「內存」的,理論上它會記錄和獲取之前所有的計算結果,不過由於計算資源的限制,它只會回頭看有限步。因為我們相信,通常越是離當前計算位置近的信息相關性越大,例如上面的填空題,句首的時間信息與被預測值的關聯就比較弱。

Source: Nature

上圖的左側是一個簡單的 RNN 模型,因為對每個輸入的計算方式相同,右邊就是模型展開後的樣子。上文例句包括標點,不計空格有 17 個中文字元,那展開後就是一個 17 層的 RNN 模型。上圖對應的 x_t 就是序列為 t 的輸入,如果是時間序列那就是一個時間點,如上文中:

x_1= 「星」,x_2= 「期」,...

s_t 被稱為隱性狀態(hidden state),可以理解為在 t 時的「內存」,由不同結構的計算單元構成。「內存」的狀態會根據上個「內存」狀態 s_{t-1} 和輸入 x_t 而更新。

U, V, W 為模型的不同參數。我們通過訓練,如常用的反向傳播(Backpropagation)演算法來優化這些參數以達到更好的預測表現。

s_t = f(Ux_t + Ws_{t-1})

o_t = f(Vs_t)

o_t 是在 t 時的輸出,假設這是一個有效的模型,那麼很可能

o_{17}= 「飽」

推薦閱讀:

谷歌傳道AI方法論:通過免費在線課程教你掌控人工智慧和機器學習
基於深度學習的文本分類
聲紋識別演算法、資源與應用(一)
嘗試克服一下小夥伴對神經網路的恐懼No.26
機器學習篇:XGB為啥這麼萬能

TAG:機器學習 |