標籤:
遞迴神經網路(recurrent neural networks,RNNs)
RNNs的應用主要有兩個方面:(1)根據真實世界中發生的相似度對任意的句子進行評分,從而提供一種對文法和語義的正確性進行測量方法,這種模型可以用於機器翻譯系統中。(2)預測下一個將要出現的文本,這個應用的價值相對較低。
一、RNNs介紹
在傳統的神經網路中,常常假設輸入(與輸出)之間是互相獨立的,然而這在很多應用中是不切實際的,比如要想預測下一個將要出現的文本,那麼內容相關的作用就不容忽視。RNNs的設計思想就是想要利用這種上下文之間連續的資訊,RNNs中的recurrent的含義就是指它對序列中的每個元素都執行相同的任務,一個典型的RNNs和它的展開形式如所示。
其中,右邊是左邊的展開形式,這裡假設x是輸入的句子,Xt是第t個時刻的輸入,假設句子採用的是one-hot vector編碼形式。
【註:one-hot vector是NLP(自然語言編碼)在單詞的表示方法中最簡單的一種編碼形式,每個單詞表示為一個向量,只有它本身對應的位置為1,其他位置均為0,這個表示方法的缺點很明顯,向量的長度與要表示的所有單詞的種類相同,如果新的單詞來了向量還有調整,並且整個矩陣非常龐大,更重要的是,它沒有辦法建立起單詞之間的關係。當然還有其他的表示方法,如word2Vec等,當然使用好的表示方法也可以提高RNNs的效率。】
St是隱含層第t個時刻的狀態,計算公式為
其中f是一個非線性函數,如tanh、ReLU等。
Ot是第t個時刻的輸出,如果要用RNNs預測下一個單詞,可以使用softmax分類器,則此時的函數為
二、RNNs的運行流程
(1)採用一種編碼形式對訓練樣本集進行編碼錶示,例如one-hot vector,得到輸入輸出的矩陣。如果此時演算法的目的是預測下一個單詞,那麼對每一個樣本word,它所對應的輸出就是在這個句子中它緊鄰的下一個單詞。(這時有個問題,就是句子的第一個單詞和最後一個單詞分別沒有輸入與輸出對應,此時可以採用的方式是專門設定兩個值來表示句子開始和句子結束,例如,可以認為句子的第一個單詞所對應的輸入為0,句子的最後一個單詞的輸出為1。)
【註:在對收集的文本樣本集進行處理是一個非常複雜的過程,包括對樣本進行分詞、將詞語與編號進行對應、去掉稀有詞彙等,這裡不再贅述。】
(2)初始化U、W、V,對RNNs進行前向傳播訓練,公式如下。
(3)根據預測值和真實值得到損失函數loss。一種常用的損失函數是cross-entropyloss,假設真實輸出為y,預測為o,一共含有N個訓練樣本,則損失函數為
(4)根據損失函數,使用SGD和Backpropagation Through Time (BPTT)對網路進行訓練,注意這裡不是簡單地使用BP演算法,因為每一步輸出的梯度不僅與當前的計算有關,還與之前的步驟有關。BPTT在RNNs中起到了非常重要的作用,介紹可以點擊這裡)
三、RNNs的特點
從以上分析可以看出:
(1)RNNs在前向傳播的每個步驟中進行的是完全相同的計算步驟,只是輸入改變了而已,因此這大大減少了需要學習的參數。
(2)RNNs在計算當前步驟的輸出時,和以前的計算也有關,因此RNNs依賴於過去抓取的特徵,因此它能學習到單詞前後之間的序列的關聯性。
(3)RNNs只能關聯之前的步驟,而對於幾個步驟之前的單詞就無法學習到它們之間的聯絡,因此RNNs並不能綜合概況產生特別有意義的文本,這也就限制了它的發展。
(4)BPTT具有消失梯度(vanishing gradient problem)的問題,W矩陣恰當的初始化可以減輕消失梯度的影響,還有一個較好的方法是用ReLU來代替tanh或者sigmoid函數。
【註:消失梯度問題在2013年的文章《On the difficulty of training recurrent neural networks》中有詳細介紹,裡面也談到演算法中也有膨脹梯度(exploding gradient problem)的問題,不過可以採用預定義的門檻剪輯梯度的方法來解決膨脹梯度問題,因此不再以此為重點。文章的下載的網址點擊這裡】
在RNNs的改進演算法中,LSTM和GRU演算法可以很好的解決消失梯度的問題,並能有效地學習到更長範圍的關聯性,這兩種演算法目前的發展較為關注。
四、RNNs的改進演算法
1、Bidirectional RNNs (雙向RNNs網路)
文章:《Bidirectional Recurrent Neural Networks》
BRNNs的設計思想是在時間t的輸出不僅僅與序列中之前的元素的有關,還與後面的元素有關。例如在預測一個句子中缺失的值時,要綜合考慮前面和後面的文本。BRNNs的結果非常簡單,如所示,它就像是兩個RNNs疊加在一起組成的。它的輸出是由兩個RNNs的隱含層共同決定的。BRNN的結構使得它能夠同時在兩個時間方向上對網路進行訓練,BRNNs的訓練時間與其他RNNs的改進演算法不相上下,BRNNs不需要對資料分布進行明確的假設,就可以有效預測整個符合序列的條件後驗機率。
2、Deep (Bidirectional)RNNs
文章:《SPEECH RECOGNITION WITH DEEP RECURRENT NEURAL NETWORKS》
Deep RNNs與BRNNs的結構相似,只是在每個步驟中含有多個層,在實踐中,這提供了一個更高的學習能力,但同時也需要大量的訓練資料。它的結構如所示。
3、LSTM Networks(Long Short Term Memory networks)
文章:《LONG SHORT-TERM MEMORY》
介紹比較詳細的一個網址:點擊開啟連結
LSTMs在結構上與RNNs沒有特別的不同,但它使用了不同的函數來計算隱層的狀態,它比RNNs出色的地方在於它具有學習到“long-term dependencies”的能力。
簡單地來說,傳統的RNNs的結構是這樣的:
LSTMs的結構是這樣的:
圖中的標記含義為:
從中可以看出,LSTMs只是將其中的計算函數進行了改進,若對於應用程式層面來講,只需要將整個計算過程視為是一個黑盒,只關心其輸入輸出和需要設定的參數就可以,若對於研究內部機理的層面來講,可以參考上面提供的網址。
LSTMs的黑盒內的計算公式如下所示。
LSTM中的門檻設定:
4、GRU(Gated Recurrent Unit Recurrent Neural Networks)
文章:《Learning Phrase Representations using RNN Encoder–Decoder forStatistical Machine Translation》
GRU的設計思想與LSTM的很像,只是計算公式不同:
GRU含有兩個門檻,一個重設門檻r和一個更新門檻z,r決定了如何將新到來的輸入與之前的相結合,z定義了之前的計算如何保持。如果將r設定為全1而z甚至為全0,那GRU就變成了最普通的RNNs。
GRU中的門檻設定:
對於LSTMs和GRU的區別可以參考文章:《Empirical Evaluation of GatedRecurrent Neural Networks on Sequence Modeling》
五、RNNs的應用領域
RNNs被廣泛應用於NLP任務中,其中應用最為廣泛的是LSTMs演算法。RNNs在NLP中的應用主要有以下幾個方面:
(1)LanguageModeling and Generating Text
下面是相關的三篇文章:
《Recurrent neuralnetwork based language model》
《Extensions ofRecurrent neural network based language model》
《Generating Textwith Recurrent Neural Networks》
(2)MachineTranslation
機器翻譯就是將一種語言的語句翻譯為另外一種語言的語句。與語言建模不同的是,它是在句子完全輸入之後才開始進行。
下面是相關的文章:
《A RecursiveRecurrent Neural Network for Statistical Machine Translation》
《Sequence toSequence Learning with Neural Networks》
《Joint Languageand Translation Modeling with Recurrent Neural Networks》
(3)SpeechRecognition
語音辨識是指當輸入一個聲波的聲音訊號序列,可以預測出一系列的語音片段和它們對應的機率值。
下面是相關的文章:
《TowardsEnd-to-End Speech Recognition with Recurrent Neural Networks》
(4)GeneratingImage Descriptions
RNNs已經和CNN一起被用來對無標籤的圖片添加描述,可以查看網站:點擊開啟連結
【參考文獻】 [1] http://www.wildml.com/2015/09/recurrent-neural-networks-tutorial-part-1-introduction-to-rnns/
[2] 文中提到的相關論文
RNNs學習總結