RNN循環神經網絡(Recurrent Neural Network)
- RNN的基本介紹以及一些常見的RNN(本文內容);
2. 詳細介紹RNN中一些經常使用的訓練算法,如Back Propagation Through Time(BPTT)、Real-time Recurrent Learning(RTRL)、Extended Kalman Filter(EKF)等學習算法,以及梯度消失問題(vanishing gradient problem)
3. 詳細介紹Long Short-Term Memory(LSTM,長短時記憶網絡);
4. 詳細介紹Clockwork RNN(CW-RNN,時鍾頻率驅動循環神經網絡);
5. 基於Python和Theano對RNN進行實現,包括一些常見的RNN模型。
什么是RNN?
RNN的目的是用來處理序列數據。RNN之所以稱為循環神經網絡,即隱藏層之間的節點不再無連接而是有連接的,並且隱藏層的輸入不僅包括輸入層的輸出還包括上一時刻隱藏層的輸出。理論上,RNN能夠對任何長度的序列數據進行處理。但是在實踐中,為了降低復雜性往往假設當前的狀態只與前面的幾個狀態相關,下圖便是一個典型的RNN:
xt表示第t步的輸入。詞向量模式,如word2vec,該模式是通過神經網絡或者深度學習對詞進行訓練,輸出一個指定維度的向量,該向量便是輸入詞的表達。
st為隱藏層的第t步的狀態,它是網絡的記憶單元。st根據當前輸入層的輸出與上一步隱藏層的狀態進行計算。
st=f(Uxt + Wst),其中f一般是非線性的激活函數,如tanh或RELU,在計算s0時,即第一個單詞的隱藏層狀態,需要用到s-1,但是並不存在,在實現中一般置為0向量;
ot是第t步的輸出,如下過個單詞的向量表示,ot=softmax(Vst)
需要注意的是:
你可以認為隱藏層狀態st是網絡的記憶單元。st包含了前面所有步的隱藏層狀態。而輸出層的輸出ot只與當前步的st有關,在實踐中,為了降低網絡的復雜度,往往st只包含前面若干步而不是所有步的隱藏層狀態;
在傳統神經網絡中,每一個網絡層的參數是不共享的。而在RNN中,每輸入一步,每一層各自都共享參數U,V,W。其反應着RNN中的每一步都在做相同的事,只是輸入不同,因此大大地降低了網絡中需要學習的參數;這里並沒有說清楚,解釋一下,傳統神經網絡的參數是不共享的,並不是表示對於每個輸入有不同的參數,而是將RNN是進行展開,這樣變成了多層的網絡,如果這是一個多層的傳統神經網絡,那么xt到st之間的U矩陣與xt+1到st+1之間的U是不同的,而RNN中的卻是一樣的,同理對於s與s層之間的W、s層與o層之間的V也是一樣的。
上圖中每一步都會有輸出,但是每一步都要有輸出並不是必須的。比如,我們需要預測一條語句所表達的情緒,我們僅僅需要關系最后一個單詞輸入后的輸出,而不需要知道每個單詞輸入后的輸出。同理,每步都需要輸入也不是必須的。RNN的關鍵之處在於隱藏層,隱藏層能夠捕捉序列的信息。
RNN能干什么?
RNN已經被在實踐中證明對NLP是非常成功的。如詞向量表達、語句合法性檢查、詞性標注等。在RNN中,目前使用最廣泛最成功的模型便是LSTMs(Long Short-Term Memory,長短時記憶模型)模型,該模型通常比vanilla RNN能夠更好地對長短時依賴進行表達,該模型相對於一般的RNN,只是在隱藏層做了手腳。
語言模型與文本生成(Language Modeling and Generating Text)
應用一:給你一個單詞序列,我們需要根據前面的單詞預測每一個單詞的可能性。
應用二:便是使用生成模型預測下一個單詞的概率,從而生成新的文本根據輸出概率的采樣。
下面是RNNs中的語言模型和文本生成研究的三篇文章:
Recurrent neural network based language model
Extensions of Recurrent neural network based language model
Generating Text with Recurrent Neural Networks
機器翻譯(Machine Translation)
機器翻譯是將一種源語言語句變成意思相同的另一種源語言語句,如將英語語句變成同樣意思的中文語句。與語言模型關鍵的區別在於,需要將源語言語句序列輸入后,才進行輸出,即輸出第一個單詞時,便需要從完整的輸入序列中進行獲取。機器翻譯如下圖所示:
下面是關於RNNs中機器翻譯研究的三篇文章:
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
語音識別(Speech Recognition)
語音識別是指給一段聲波的聲音信號,預測該聲波對應的某種指定源語言的語句以及該語句的概率值。RNN中的語音識別研究論文:
Towards End-to-End Speech Recognition with Recurrent Neural Networks
圖像描述生成(Generating Image Descriptions)
和卷積神經網絡(convolutional Neural Networks, CNNs)一樣,RNNs已經在對無標圖像描述自動生成中得到應用。將CNNs與RNNs結合進行圖像描述自動生成。這是一個非常神奇的研究與應用。該組合模型能夠根據圖像的特征生成描述。
如何訓練RNN?
對於RNN是的訓練和對傳統的ANN訓練一樣。同樣使用BP誤差反向傳播算法,不過有一點區別。如果將RNN進行網絡展開,那么參數W,U,V是共享的,而傳統神經網絡卻不是的。並且在使用梯度下降算法中,每一步的輸出不僅依賴當前步的網絡,並且還以來前面若干步網絡的狀態。比如,在t=4t=4時,我們還需要向后傳遞三步,已經后面的三步都需要加上各種的梯度。該學習算法稱為Backpropagation Through Time (BPTT)。后面會對BPTT進行詳細的介紹。需要意識到的是,在vanilla RNN訓練中,BPTT無法解決長時依賴問題(即當前的輸出與前面很長的一段序列有關,一般超過十步就無能為力了),因為BPTT會帶來所謂的梯度消失或梯度爆炸問題(the vanishing/exploding gradient problem)。當然,有很多方法去解決這個問題,如LSTM便是專門應對這種問題的。
RNN擴展和改進模型
Simple RNNs(SRNs)[2]
Bidirectional RNNs[3]
Deep(Bidirectional)RNNs[4]
Echo State Networks[5]
Gated Recurrent Unit Recurrent Neural Networks[6]
LSTM Netwoorks[7]
Clockwork RNNs(CW-RNNs)[9]