單雙層RNN API對比介紹
導語
PaddlePaddle 高度支持靈活和高效的循環神經網路配置。本周進階篇推文將圍繞RNN模型展開,指導你如何在 PaddlePaddle 中配置和使用循環神經網路。本周推文目錄如下:
2.11:【進階篇】RNN配置
2.12:【進階篇】Recurrent Group教程
2.13:【進階篇】支持雙層序列作為輸入的Layer
2.14:【進階篇】單雙層RNN API對比介紹
編寫|PaddlePaddle
排版|wangp
本文以PaddlePaddle的雙層RNN單元測試為示例,用多對效果完全相同的、分別使用單雙層RNN作為網路配置的模型,來講解如何使用雙層RNN。本文中所有的例子,都只是介紹雙層RNN的API介面,並不是使用雙層RNN解決實際的問題。如果想要了解雙層RNN在具體問題中的使用,請參考algo_hrnn_demo。本文中示例所使用的單元測試文件是test_RecurrentGradientMachine.cpp。(鏈接:https://github.com/reyoung/Paddle/blob/develop/paddle/gserver/tests/test_RecurrentGradientMachine.cpp)
1
示例1:雙層RNN,子序列間無Memory
在雙層RNN中的經典情況是將內層的每一個時間序列數據,分別進行序列操作;並且內層的序列操作之間獨立無依賴,即不需要使用Memory。
在本示例中,單層RNN和雙層RNN的網路配置,都是將每一句分好詞後的句子,使用LSTM作為encoder,壓縮成一個向量。區別是RNN使用兩層序列模型,將多句話看成一個整體同時使用encoder壓縮。二者語意上完全一致。這組語義相同的示例配置如下:
(1)讀取雙層序列數據
首先,本示例中使用的原始數據如下:
其次,對於兩種不同的輸入數據類型,不同DataProvider對比如下(sequenceGen.py,鏈接:https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/gserver/tests/
sequenceGen.py)):
這是普通的單層時間序列的DataProvider代碼,其說明如下:
對於同樣的數據,雙層時間序列的DataProvider的代碼。其說明如下:
(2)模型配置的模型配置
首先,我們看一下單層RNN的配置。代碼中9-15行(高亮部分)即為單層RNN序列的使用代碼。這裡使用了PaddlePaddle預定義好的RNN處理函數。在這個函數中,RNN對於每一個時間步通過了一個LSTM網路。
其次,我們看一下語義相同的雙層RNN的網路配置:
2
示例2:雙層RNN,子序列間有Memory
本示例意圖使用單層RNN和雙層RNN實現兩個完全等價的全連接RNN。
模型配置
我們選取單雙層序列配置中的不同部分,來對比分析兩者語義相同的原因。
警告
PaddlePaddle目前只支持在每個時間步中,Memory的時間序列長度一致的情況
3
示例3:雙層RNN,輸入不等長
輸入不等長是指recurrent_group的多個輸入序列,在每個時間步的子序列長度可以不相等。但序列輸出時,需要指定與某一個輸入的序列信息是一致的。使用targetInlink可以指定哪一個輸入和輸出序列信息一致,默認指定第一個輸入。
示例3的配置分別為單層不等長RNN和雙層不等長RNN。示例3對於單層RNN和雙層RNN數據完全相同。
和示例2中的配置類似,示例3的配置使用了單層RNN和雙層RNN,實現兩個完全等價的全連接RNN。
在上面代碼中,單層和雙層序列的使用和示例2中的示例類似,區別是同時處理了兩個輸入。而對於雙層序列,兩個輸入的子序列長度也並不相同。但是,我們使用了targetInlink參數設置了外層recurrent_group的輸出格式。所以外層輸出的序列形狀,和emb2的序列形狀一致。
4
辭彙表
Memory
Memory是PaddlePaddle實現RNN時候使用的一個概念。RNN即時間遞歸神經網路,通常要求時間步之間具有一些依賴性,即當前時間步下的神經網路依賴前一個時間步神經網路中某一個神經元輸出。如下圖所示:
Memory是PaddlePaddle實現RNN時候使用的一個概念。RNN即時間遞歸神經網路,通常要求時間步之間具有一些依賴性,即當前時間步下的神經網路依賴前一個時間步神經網路中某一個神經元輸出。如下圖所示:
使用這種方式,PaddlePaddle可以比較簡單的判斷哪些輸出是應該跨越時間步的,哪些不是。
時間步
參考時間序列。
時間序列
時間序列(time series)是指一系列的特徵數據。這些特徵數據之間的順序是有意義的。即特徵的數組,而不是特徵的集合。而這每一個數組元素,或者每一個系列裡的特徵數據,即為一個時間步(time step)。值得注意的是,時間序列、時間步的概念,並不真正的和『時間』有關。只要一系列特徵數據中的『順序』是有意義的,即為時間序列的輸入。
舉例說明,例如文本分類中,我們通常將一句話理解成一個時間序列。比如一句話中的每一個單詞,會變成詞表中的位置。而這一句話就可以表示成這些位置的數組。例如 [9, 2, 3, 5, 3] 。
關於時間序列(time series)的更詳細準確的定義,可以參考維基百科中文頁面 時間序列(鏈接:https://zh.wikipedia.org/wiki/%E6%99%82%E9%96%93%E5%BA%8F%E5%88%97)
另外,Paddle中經常會將時間序列成為 Sequence 。他們在Paddle的文檔和API中是一個概念。
RNN
RNN 在PaddlePaddle的文檔中,一般表示Recurrent neural network,即時間遞歸神經網路。詳細介紹可以參考 維基百科頁面 Recurrent neural network 或者 中文維基百科頁面(鏈接:https://zh.wikipedia.org/wiki/%E9%80%92%E5%BD%92%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C)中關於時間遞歸神經網路的介紹。
RNN 一般在PaddlePaddle中,指對於一個時間序列輸入數據,每一個時間步之間的神經網路具有一定的相關性。例如,某一個神經元的一個輸入為上一個時間步網路中某一個神經元的輸出。或者,從每一個時間步來看,神經網路的網路結構中具有有向環結構。
雙層RNN
雙層RNN顧名思義,即RNN之間有一次嵌套關係。輸入數據整體上是一個時間序列,而對於每一個內層特徵數據而言,也是一個時間序列。即二維數組,或者數組的數組這個概念。 而雙層RNN是可以處理這種輸入數據的網路結構。
例如,對於段落的文本分類,即將一段話進行分類。我們將一段話看成句子的數組,每個句子又是單詞的數組。這便是一種雙層RNN的輸入數據。而將這個段落的每一句話用lstm編碼成一個向量,再對每一句話的編碼向量用lstm編碼成一個段落的向量。再對這個段落向量進行分類,即為這個雙層RNN的網路結構。
*原創貼,版權所有,未經許可,禁止轉載
*值班小Paddle:wangp
*歡迎在留言區分享您的觀點


TAG:PaddlePaddle |