RNNLM——A Toolkit For Language Modeling rnnlm基本功能命令詳細介紹

參考文獻:RNNLM - Recurrent Neural Network Language Modeling Toolkit(點此打開
參考文獻:STATISTICAL LANGUAGE MODELS BASED ON NEURAL NETWORKS(點此打開

      由Mikolov用rnn對語言進行建模所獲得的效果已經超過傳統的N-GRAM了,具體的實驗結果在他的系列論文中都有解釋,不過現在可以看看 他的PHD論文(點此打開),裏面有各種對比實驗。隨即之後,他將rnnlm toolkit開源,可供其他人作爲一個baseline,點此進入rnnlm toolkit的下載地址
     這一篇文章是簡要介紹rnnlm tookit的使用的,下面的內容我會把下載好的開源包裏面的example.sh的shell腳本命令分開執行,並且詳細說明每條命令所帶參數的含義,更高級的用處在下載地址那個網頁裏面有專門的例子。由於可供選擇的命令參數確實很多,不會全部都寫,更詳細的可以看一看相關文檔,以及源代碼。本文旨在把rnnlm最基本的功能介紹清楚,好了,下面是正文,初次寫博客不久,如果有哪裏錯誤的地方,還請大家多多指正哈。

1.編譯
我的軟件包版本是0.4b的,首先在在終端中進入到rnnlm-0.4b的目錄(我的版本是0.4b的),然後編譯,執行下面的命令:
make
有可能會出現如下錯誤:
make: x86_64-linux-g++-4.6: Command not found
make: *** [rnnlmlib.o] Error 127
這個時候可以將makefile文件的內容改一下:
CC = x86_64-linux-g++-4.6 
更改爲==>
CC = g++
重新執行即可,這裏的錯誤處理參考了(http://blog.csdn.net/wangxinginnlp/article/details/17754173 )

2.用rnnlm訓練模型

我們先將訓練數據放上來,內容大概如下:

也就是train文件裏面的訓練數據都是一個一個的句子,注意無論是訓練數據還是測試數據,或是驗證數據最後一行都最好換行。然後執行下列命令:
./rnnlm -train train -valid valid -rnnlm model -hidden 15 -rand-seed 1 -debug 2 -class 100 -bptt 4 -bptt-block 10 -direct-order 3 -direct 2 -binary


現在我們來解釋一下各項命令的具體含義:
-train train:
這個命令是指定訓練文件的名字,注意文件名不能超過100個字符

-valid valid:
這個命令是指定驗證數據的名字,也是不能超過100個字符,這個文件的作用是用來early stopping的,誒,抱歉,我不太知道如何翻譯這個詞,就是當你的訓練文件訓練一遍完畢時,會馬上將訓練後的模型在valid文件上面試一下,看一下效果如何,如果這一遍訓練的效果還不錯的話,那麼繼續同樣打學習率來訓練train這個文件,如果效果沒太多打提升,就將學習率降低爲一半,繼續學習,直到沒太大的提升就不再訓練了。至於這個效果怎麼看,是指訓練打模型在valid上面的困惑度。這個valid文件作用可以防止過擬合,因爲我們是一邊訓練一邊看效果的嘛。

-rnnlm model 
這個命令是指定訓練好後的語言模型的參數所存放打文件,也就是這個文件裏面存放了一大堆浮點數和一些基本可讀信息

-hidden 15 
這個命令是用來指定網絡隱層神經元的個數的,這裏爲15,也就是隱層神經元的大小是15。hidden所指定的數大的話網絡可容納的信息就多,但運算量也會增大。

-rand-seed 1
 這個是指定隨機種子,用來初始化網絡的權值的,比如指定爲1,那麼內部會執行srand(1),網絡的權值會初始化爲一堆隨機小數,如果你指定爲2,那麼網絡會被初始化爲另一堆不同於值爲1的隨機小數。

-debug 2 
這個是一個控制開關,控制訓練網絡所輸出的信息,默認爲1,訓練時會輸出一些基本的信息,如果爲debug > 2則會輸出更詳細的信息

-class 100 
這個是指定單詞的分類,100表示將訓練文件中的詞語分爲100類,這個作用是用來加速網絡計算的,但會喪失一些準確性,論文中指出,一般可以取值爲sqrt(|V|),其中|V|是訓練數據中不重複的單詞數量

-bptt 4 
這個命令參數如果爲1,表示網絡的一個常規的BPTT算法,即隱層只會往到前一個狀態層,這麼說比較抽象,見我的另一篇文章,介紹BPTT的。如果該參數值大於1,那麼算法會學習向前到bptt+bptt_block-2那個時刻的狀態

-bptt-block 10 
這個參數是來控制BPTT學習算法的,表示每學習10個詞,就進行一次BPTT算法。如果不控制的話,每訓練一個詞語時,都進行深度的學習,會使訓練一個詞語的時間比較長

-direct-order 3 
這個參數是指定rnn中me(最大熵模型)部分特徵的階數。最大是不會超過20的,超過20也會自動指定爲20

-direct 2 
這個參數的含義就比較技術細節了,它來指定網絡輸入層到輸出層所存放權值的一維數組的大小,並且單位是一百萬,比如現在指定的值爲2,其內部大小是2000000。

-binary 
這個參數如果沒有,則默認爲text方式,區別在於binary是用二進制方式存儲數據,text是以ascii方式,對於大量的浮點數來說,binary能更省文件大小,但是缺點是用文件打開,裏面都是亂碼。

下面是命令的執行結果:
debug mode: 2
train file: train
valid file: valid
class size: 100
Hidden layer size: 15
Direct connections: 2M
Order of direct connections: 3
BPTT: 4
BPTT block: 10
Rand seed: 1
Model will be saved in binary format
rnnlm file: model
Starting training using file train
Restoring network from file to continue training...
Iter:   9 Alpha: 0.006250    TRAIN entropy: 8.9646    Progress: 12.29%   W
Iter:   9 53238.Alpha: 0.006250    TRAIN entropy: 6.8535    Progress: 24.59%   W
Iter:   9 60260.Alpha: 0.006250    TRAIN entropy: 6.1981    Progress: 36.88%   W
ter:   9 63232.Alpha: 0.006250    TRAIN entropy: 5.8457    Progress: 49.17%   W
Iter:   9 65056.Alpha: 0.006250    TRAIN entropy: 5.6123    Progress: 61.46%   W
Iter:   9 66436.Alpha: 0.006250    TRAIN entropy: 5.4747    Progress: 73.76%   W
Iter:   9 67084.Alpha: 0.006250    TRAIN entropy: 5.3561    Progress: 86.05%   W
Iter:   9 67802.Alpha: 0.006250    TRAIN entropy: 5.2776    Progress: 98.34%   W
Iter:   9 68190.Alpha: 0.006250    TRAIN entropy: 5.2688    Words/sec: 68239.9   VALID entropy: 6.1285

real 0m1.509s
user 0m1.420s
sys 0m0.064s


看一下輸出信息裏面關鍵字的含義:
Iter :所指的數字是對訓練數據的第幾次訓練
Alpha:所指的數字是網絡此刻的學習率
TRAIN entropy:所指的是熵,這個是在驗證數據上的
Progress:表示在此刻處理的詞語在訓練數據中的位置的,也即進度
Words/sec:表示每秒訓練的詞語數


3.用srilm訓練模型

執行如下命令:
ngram-count -text train -order 5 -lm templm -kndiscount -interpolate -gt3min 1 -gt4min 1
ngram -lm templm -order 5 -ppl test -debug 2 > temp.ppl

第一條命令就是用srlim建立了一個語言模型,第二條命令是用上面訓練好的模型來測試,並且相關信息存放到temp.ppl,關於這個不細寫啦,因爲這完全是另一個工具的使用啦,可以看看我的另一篇博客,srilm的使用記錄


4.將temp.ppl轉格式

命令如下:
gcc convert.c -O2 -o convert
./convert <temp.ppl >srilm.txt
這個命令是將上面生成的temp.ppl轉成rnnlm能讀取的數據格式。


5.插值兩個模型並測試

命令如下:
./rnnlm -rnnlm model -test test -lm-prob srilm.txt -lambda 0.5
我們看一下各個參數的含義:
-rnnlm model
這個是指定訓練好的模型文件,文件名不能超過100字符
-test test 
這個命令是指測試文件,文件名不能超過100字符
-lm-prob srilm.txt 
指明要使用其他的語言模型,並且文件所在爲srilm.txt
-lambda 0.5 
這個是指兩個模型的插值係數,目前爲0.5就表明,兩個模型各佔一半
我們看一下執行的結果:
rnnlm file: model
test log probability: -15398.941513
test log probability given by other lm: -15498.214844
test log probability 0.500000*rnn + 0.500000*other_lm: -15218.938477
PPL net: 72.331327
PPL other: 74.355495
PPL combine: 68.800594


test log probability 是指在test文件上,對數累加概率和,即logp = log10pw1+log10pw2...
test log probability given by other lm和上面的計算方式是一樣的,只不過它是用srilm訓練的模型
test log probability 0.500000*rnn + 0.500000*other_lm:這個是指插值後的模型的對數累加概率
後面三個PPL net, PPL other, PPL combine,分別指三個模型在測試集上面的困惑度

好啦,rnnlm的基本功能就介紹到此,本文結束,有任何錯誤的地方歡迎指出,更詳細的好請看相關代碼和文檔


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章