遞迴神經網路教程(1)-RNN介紹
Source: http://www.wildml.com/2015/09/recurrent-neural-networks-tutorial-part-1-introduction-to-rnns/
遞迴神經網路(RNNs)作為一種流行的模型,已經在NLP問題上顯示巨大的應用前景。儘管最近很流行,但是對RNNs原理以及如何實施進行全面解釋的資源卻很少。因此就有了這個教程。這個教程將包含以下四個部分: RNNs介紹 使用Python和Theano實現RNN 理解BPTT演算法和梯度消失問題 GRU和LSTM的實現
作為本教程的一部分,我們將實現一個基於RNN的語言模型。這個語言模型的應用是雙重的:首先,使用它我們可以基於現實可能性對任意句子評分。這也可以用來衡量句子文法與語義的正確性。這樣的模型通常也是機器翻譯系統的一部分。第二點,使用這個語言模型可以產生新的文本(這個應用會更酷)。比如說,我們使用莎士比亞作品訓練模型將能產生與莎士比亞相似的文本。Andrej Karpathy的部落格給出了基於RNNs的字元級語言模型可以實現的很多任務。
這裡假定你已經對神經網路基礎有一定瞭解。如果沒有,你可以閱讀我寫的這個部落格,這個部落格給出了非遞迴網路的原理與實現。 RNNs是什麼。
RNNs的背後原理是利用序列資訊。在傳統的神經網路中,我們假定所有的輸入與輸出都是相互獨立的。但是對於很多問題,這是一個非常糟糕的想法。如果你想預測一個句子中的先一個單詞,你最好知道它之前的單詞。RNNs被稱為遞迴神經網路是因為它對一個序列中的每個節點執行相同的任務,而且輸出依賴於前面的計算。理解RNNs的另外一個方式是認為RNNs存在一個“記憶”,它能夠捕獲已經計算出的資訊。理論上,RNNs可以利用任意長序列中的資訊,但是實際上它們僅僅能夠利用前面極少步的資訊(後面會解釋)。經典的RNNs如下所示:
遞迴神經網路以及它在時間步長上展開的前向計算圖(來源:Nature)
上面的圖將RNNs展開成一個全網路。通過展開,我們得到了全序列的網路。例如,如果我們研究的是5單詞的句子序列,網路將被展開成5層神經網路,每一層對應一個單詞。RNNs計算圖中的公式如下: xt 是在 t 步的輸入。例如, x1 對應是句子序列中的第二個單詞的one-hot詞向量。 st 是在 t 步的隱含層狀態。它是網路的“記憶”。 st 通過上一步的隱含層狀態與當前步的輸入來進行計算: st=f(Uxt+Wst−1) 。函數 f 通常是非線性,比如tanh和ReLU。為了計算第一步的隱含層狀態,必須要知道 s−1 ,通常它被全部初始化為0。 ot 是在 t 步的的輸出。例如,如果我們想預測句子中的下一個單詞,它將是詞彙表上的一個機率向量: ot=softmax(Vst) 。
有幾點需要注意: 你可以將 st 看做網路的記憶。 st 捕獲了所有前面步中的計算資訊。而輸出 ot 的計算僅僅利用在 t 步的記憶。正如前面提及的那樣,實際上處理 st 有點複雜,因為通常它不能捕獲很多前面時間步的資訊。 傳統的深層網路每層的參數是不同的,但是RNNs所有時間步上共用相同的參數( U,V,W )。這說明我們每個時間步執行相同的任務,僅僅是輸入不同。這也大大減少了我們需要學習的參數總數。 在上面的圖中每個時間步都有輸出,但是對於某些任務這可能不是必要的。例如,當做句子情感分析時,我們可能只關心最終的輸出,而不是每個時間步的輸出。同樣,我們可能不需要在每個時間步都有輸入。RNN的主要特徵是它的隱含層狀態能夠捕獲一個序列的一些資訊。 RNNs可以做什麼。
RNNs在NLP問題上已經取得了很大成功。此時,必須要說明的是最常用的RNNs模型是LSTMs,相比基本RNNs,它能夠更好地捕獲長期依賴。但是不要擔心,LSTMs本質上與RNNs相同,在之後我們將會介紹,它們僅僅使用了一種計算隱含層狀態的不同方法。後面的教程會詳細介紹LSTMs。這裡列出RNNs在NLP上的一些應用執行個體(並不是全部): 語言建模和產生文本
給定一個單詞序列,我們想預測每個單詞在給定前面的單詞後的機率。語言模型允許我們衡量句子的可能性,這是機器翻譯的一個重要輸入(由於高機率的句子一般正確)。能預測下一個單詞帶來一個好處是我們可以得到一個產生模型,這允許我們可以通過輸出機率進行抽樣而產生新的文本。訓練資料不同,我們可以得到各種各樣的模型。語言建模的輸入通常是單詞序列(例如使用one-hot向量編碼),輸出是預測單詞的機率。訓練網路時,我們令 ot=xt+1 ,因為我們希望每一步的輸出恰好是實際的下一個單詞。
語言建模和產生文本的相關論文如下: Recurrent neural network based language model型 Extensions of Recurrent neural network based language model Generating Text with Recurrent Neural Networks 機器翻譯
機器翻譯與語言建模的相同之處是源語言(比如德語)的輸入也是單詞序列。我們想要的輸出是對應目標語言(比如英語)的單詞序列。一個關鍵差別在於當我們看到了所有的輸入後才開始輸出,因為在翻譯的句子中的第一個單詞要依賴於從整個輸入序列中捕獲的資訊。
遞迴神經網路用於機器翻譯(來源:http://cs224d.stanford.edu/lectures/CS224d-Lecture8.pdf)
機器翻譯的相關論文如下: A Recursive Recurrent Neural Network for Statistical Machine Translation Sequence to Sequence Learning with Neural Networks Joint Language and Translation Modeling with Recurrent Neural Networks 語音辨識
輸入一個聲波的聲訊號序列,我們可以預測一個語音序列以及它們的機率。
語音辨識方面的相關論文如下: Towards End-to-End Speech Recognition with Recurrent Neural Networks 產生映像描述
結合卷積神經網路,RNNs已經被用於無標記映像描述產生模型的一部分。很驚奇的是其實現的效果。組合模型甚至將產生的文字描述與映像中的特徵對其。
用於產生映像描述的深層視覺語義對齊(來源:http://cs.stanford.edu/people/karpathy/deepimagesent/) 訓練RNNs
訓練RNNs與訓練傳統神經網路類似。我們同樣使用反向傳播演算法(BP),但是需要一些變化。因為網路中的參數在所有的時間步上是共用的,每個輸出的梯度不僅僅與目前時間步的計算相關,而且依賴於前面的時間步。比如,為了計算 t=4 時的梯度我們必須反向傳播到前面的 3 個時間步,然後總和這些梯度。這被成為通過時間的反向傳播(BPTT)。如果這些介紹還很難理解,不用擔心,後面會有一整篇文章詳細介紹BPTT。現在,你要知道普通RNNs通過BPTT訓練很難學習到長期依賴(比如在很遠時間步間的依賴),這是由於梯度消失或者爆炸問題。存在一些方法來解決這些問題,還有些特定的RNNs(如LSTMs)是專門用來解決這類問題。 RNN擴充
多年來,研究人員開發了更複雜的RNN來處理普通 RNN模型的一些缺點。我們將在後面的文章中更詳細地介紹這些內容,而這部分只作為簡要概述,以便你熟悉這些模型的分類。
雙向RNNs基於這樣的創想,即在時間 t 的輸出不僅取決於序列中的先前元素,而且還取決於未來元素。例如,要預測序列中缺少的單詞,你要瞭解上下文。雙向RNNs非常簡單。它們只是兩個RNN相互堆積而成。然後基於兩個RNN的隱含層狀態計算輸出。
深層雙向RNNs與雙向RNNs相似,只是每個時間步是多層網路。因此實際上,它將有更高的學習能力(但是你也需要更大的訓練樣本)
LSTM網路在最近很受歡迎,我們在前面簡單地介紹過。 LSTM與RNN基本架構相同,但是它們使用不同的函數來計算隱含層狀態。 LSTM中的記憶稱為單元,你可以將它們視為黑箱,其輸入是前一狀態 ht−1 和當前輸入 xt 。內部的這些單元決定記憶中哪些部分儲存與遺忘。然後,它們組合先前的狀態,當前記憶和輸入。事實證明,這些類型的單元在捕獲長期依賴性方面非常有效。 LSTMs在剛開始接觸時非常難懂,但如果你感興趣,你可以從這篇文章中學習到更多。 結語
目前為止一切都很好。我希望你已經對RNNs是什麼以及能做什麼有一個基本的瞭解。在下一篇文章我們將使用Python和Theano實現RNN語言模型的第一個版本。請在評論裡提問題!