做者:zhbzz2007 出處:http://www.cnblogs.com/zhbzz2007 歡迎轉載,也請保留這段聲明。謝謝!html
本文翻譯自 RECURRENT NEURAL NETWORKS TUTORIAL, PART 1 – INTRODUCTION TO RNNS 。git
Recurrent Neural Networks(RNNS) ,循環神經網絡,是一個流行的模型,已經在許多NLP任務上顯示出巨大的潛力。儘管它最近很流行,可是我發現可以解釋RNN如何工做,以及如何實現RNN的資料不多。這個系列將會涵蓋以下幾個主題,github
咱們將會實現一個 基於語言模型的循環神經網絡 。語言模型有兩個應用。第一,基於句子在真實世界中出現的可能性,語言模型可讓咱們對任意的句子進行打分。這個就給予咱們一種度量語法和語義正確性的方式。語言模型一般應用在機器翻譯系統中。第二,語言模型容許咱們生成新的文本(我認爲這是一個更酷的應用)。在莎士比亞的做品上訓練一個語言模型,容許咱們生成莎士比亞風格的文本。Andrej Karpathy所寫的 blog 顯示了基於RNN的字符級的語言模型的能力。web
我假設你已經在必定程度上熟悉基本的神經網絡。若是你對基本的神經網絡還不熟悉,你能夠先看這篇blog IMPLEMENTING A NEURAL NETWORK FROM SCRATCH IN PYTHON – AN INTRODUCTION , 它將會讓你理解非循環網絡背後的思想和具體實現。算法
循環神經網絡背後的思想就是使用序列信息。在傳統的神經網絡中,咱們認爲全部的輸入(和輸出)彼此之間是互相獨立的。可是對於不少任務而言,這個觀點並不合適。若是你想預測句子中的下一個詞,你最好須要知道它以前的詞。循環神經網絡之因此稱之爲循環,就是由於它們對於序列中每一個元素都執行相同的任務,輸出依賴於以前的計算。另外一種思考循環神經網絡的方法是,它們有一個記憶,記憶能夠捕獲迄今爲止已經計算過的信息。理論上,循環神經網絡能夠利用任意長度序列的信息,可是,在實際中,它們僅能利用有限長步(具體緣由會在後續解釋)。下面就是一個典型的循環神經網絡。網絡
上圖展現了一個循環神經網絡展開爲全網絡。經過展開,咱們簡單的認爲咱們寫出了所有的序列。例如,若是咱們關心的序列是一個有5個詞的句子,那麼這個網絡就會展開爲5層的神經網絡,一層對應一個詞。循環神經網絡中管理計算的公式以下所示,架構
這裏有一些注意事項,以下:函數
循環神經網絡在不少NLP任務中顯示出巨大的成功。在這裏,我須要提醒一下,大部分循環神經網絡是 LSTM ,它比普通的循環神經網絡能夠更好的捕獲長期依賴。不用擔憂,LSTM本質上依然是循環神經網絡,它僅僅是在計算隱層狀態時採用一種不一樣的方式,咱們將會在後續的文章中詳細介紹它。下面是一些循環神經網絡應用到NLP的例子。post
給定一個詞序列,咱們想要預測每一個詞在給定前面的詞的條件機率。語言模型容許咱們度量一個句子的可能性,這是機器翻譯的重要輸入(高几率的句子一般是正確的)。預測下一個詞的副產品就是咱們能夠獲得一個生成模型,這容許咱們經過在輸出機率中採樣來生成下一個文本。依賴於咱們的訓練數據,咱們能夠生成 各類類型的文本 。在語言模型中,咱們的輸入一般是一個詞序列(例如,編碼爲one-hot向量),輸出就是待預測的詞序列。當訓練網絡時,咱們設置 \(o_{t} = x_{t+1}\) ,由於,咱們想要時刻t的輸出爲正確的下一個詞。學習
下面是一些關於語言模型和文本生成的文獻,
Recurrent neural network based language model
Extensions of Recurrent neural network based language model
Generating Text with Recurrent Neural Networks
機器翻譯相似於語言模型,輸入是一個源語言的詞序列(例如,德語)。咱們想輸出一個目標語言的詞序列(例如,英語)。關鍵的區別就是咱們的輸出只能在咱們已經看見整個輸入以後開始,由於,咱們翻譯句子的第一個詞可能須要從整個輸入句子獲取信息。
下面是一些關於機器翻譯的文獻,
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
結合卷積神經網絡,循環神經網絡也做爲模型的一部分,用於對無標註圖像 生成描述。讓人驚訝的是它是如何工做的。組合模型甚至能夠將生成的文字與圖像上的特徵進行對齊。
針對生成圖像描述的深度圖像-語義對齊,來源:http://cs.stanford.edu/people/karpathy/deepimagesent/
循環神經網絡的訓練相似於傳統神經網絡的訓練。咱們也使用反向傳播算法,可是有所變化。由於循環神經網絡在全部時刻的參數是共享的,可是每一個輸出的梯度不只依賴當前時刻的計算,還依賴以前時刻的計算。例如,爲了計算時刻 t = 4 的梯度,咱們還須要反向傳播3步,而後將梯度相加。這個被稱爲Backpropagation Through Time(BPTT)。若是你不能徹底理解這個,不要擔憂,咱們會在後面的文章詳細地介紹它。如今,咱們僅僅須要瞭解到利用BPTT算法訓練出來的普通循環神經網絡很難學習長期依賴(例如,距離很遠的兩步之間的依賴),緣由就在於梯度消失/發散問題。目前已經有一些機制來解決這些問題,特定類型的循環神經網絡(如LSTM)專門用於規避這些問題。
近年來,研究者已經提出了更加複雜的循環神經網絡,用以解決普通循環神經網絡的缺陷。咱們將會在後續的文章中詳細介紹,可是,我想在這部分大體介紹一些,以便大家能夠熟悉這些模型。
Bidirectional RNNs(雙向循環神經網絡)基於這樣一種思想,時刻t的輸出不只依賴序列中以前的元素,也依賴於後續的元素。例如,要預測序列中缺失的詞,你會看一下左邊和右邊的上下文。雙向循環神經網絡很是簡單。它們僅僅是兩個循環神經網絡堆在一塊兒。輸出是基於兩個循環神經網絡的隱層狀態進行計算的。
雙向循環神經網絡的結構以下所示。
Deep (Bidirectional) RNNs(深度(雙向)循環神經網絡)很是相似於雙向循環神經網絡,區別在於,每一時刻,網絡有多層。實際上,這個可讓網絡具有更強的學習能力(固然,也須要更多的訓練數據)。
深度循環神經網絡的結構以下所示。
最近,LSTM網絡很是流行,咱們以前已經簡單提到。LSTM在架構上與循環神經網絡並無本質的不一樣,可是它們計算隱層狀態的函數會有所不一樣。LSTM中的記憶稱爲cell,你能夠將它視爲以以前的狀態 \(h_{t-1}\) 和當前的輸入 \(x_{t}\) 做爲輸入的一個黑盒。在內部,cell決定記憶中哪些保留(哪些刪除)。而後,以前的狀態,當前的記憶和輸入進行組合。這類單元在捕獲長期依賴上被證實是很是有效的。剛開始,LSTM會使人感到困惑,可是,若是你感興趣,你能夠看這篇博客 Understanding LSTM Networks 。
到目前爲止,我但願你已經對什麼是循環神經網絡以及它們可以作什麼有一個基本的瞭解。在下一篇文章中,咱們將會使用Python和Theano實現循環神經網絡語言模型的第一個版本。
RECURRENT NEURAL NETWORKS TUTORIAL, PART 1 – INTRODUCTION TO RNNS