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