這是用於快速輕鬆地從地面上進行語言建模實驗的樣板代碼。該代碼寫在Dynet框架的Python版本中,可以使用這些說明安裝。
如果您在Word級別使用默認閱讀器,則它還具有模式作為令牌化的依賴性。
有關RNN語言模型的介紹,它們的工作方式以及一些很酷的演示,請查看Andrej Karpathy的出色博客文章:經常性神經網絡的不合理有效性。
訓練賓夕法尼亞州培養基的基線RNN模型:
char-level: python train.py
文字級別: python train.py --word_level
在任何文件上訓練基線RNN模型:
char-level: python train.py --train=<filename> --reader=generic_char --split_train
字級: python train.py --train=<filename> --reader=generic_word --split_train
從那裡開始,您可以設置一堆標誌來調整模型的大小,輟學,體系結構和許多其他東西。旗幟應該是非常自我解釋的。您可以使用python train.py -h列出旗幟
如果您想保存訓練有素的型號並稍後再介紹,只需使用--save=FILELOC標誌即可。然後,您稍後可以加載load=FILELOC標誌。注意:如果加載模型,也會加載其參數設置,因此--load load標誌覆蓋了--size , --gen_layers , --gen_hidden_dim ,等等。
默認情況下,該代碼設置為訓練Penn Treebank數據,該數據包含在ptb/文件夾中的存儲庫中。
要添加新的數據源,只需在util.py中實現一個新的coldusreader。確保將“ names屬性”設置為一個至少包含一個唯一ID的列表。然後,設置--reader=ID ,並使用--train , --valid和--test標誌指向您的數據集。如果您沒有預分離的數據,則只需設置--train ,並包括--split_train標誌以將您的數據自動分為火車,有效和測試拆分即可。
要實現一個新模型,只需進入rnnlm.py,創建一個新的SaveAblernnLM子類,該子類實現功能add_params , BuildLMGraph和BuildLMGraph_batch 。包括一個示例。確保將新類的name屬性設置為唯一ID,然後使用--arch=ID標誌告訴代碼使用新模型。
要查看您的模型如何隨著時間的推移進行訓練的清晰圖表,請致電python visualize_log.py <filename> <filename>...繪製多達20次培訓。為了生成用作可視化器輸入的日誌文件,只需在訓練時包含--output=<filename> flag。
--size參數有四個設置:小(1層,每個嵌入的參數128個參數,復發性隱藏層中的128個節點),中等(2層,256個輸入昏暗,256個隱藏dim),大(2,512,512)和巨大(2,1024,1024,1024)。您還可以使用標誌--gen_layers , --gen_input_dim和--gen_hidden_dim單獨設置參數。
假設我們想測試[單詞嵌入的重複使用如何影響語言模型的性能](https://openreview.net/pdf?id=r1apbsfle)。我們將使用PTB語料庫,因此我們不必擔心設置新的語料庫讀取器 - 只需使用默認值即可。
首先,讓我們訓練10個時期的基線模型:
python train.py --dynet-mem 3000 --word_level --size=small --minibatch_size=24 --save=small_reuseemb.model --output=small_baseline.log
(等待大約2-3個小時)
python train.py --dynet-mem 3000 --word_level --minibatch_size=24 --load=small_baseline.model --evaluate
[Test TEST] Loss: 5.0651960628 Perplexity: 158.411497631 Time: 20.4854779243
這比論文中報導的基線困惑差得多,但這是因為我們只是使用通用LSTM模型作為基線,而不是更複雜的VD-LSTM模型,並且參數較少。
接下來,讓我們修改基線語言模型以結合單詞嵌入的重複使用。例如,我已經在rnnlm.py中完成了此操作,創建了一個名為ReuseEmbeddingsRNNLM的類name = "reuse_emb" 。該代碼幾乎只是上面基線模型的副本和貼合,更改了大約10行,以將單詞嵌入的重新使用納入輸出的預測中。現在,讓我們也要進行這些測試:
python train.py --dynet-mem 3000 --arch=reuse_emb --word_level --size=small --minibatch_size=24 --save=small_reuseemb.model --output=small_reuseemb.log
(等待大約2-3個小時)
python train.py --dynet-mem 3000 --arch=reuse_emb --word_level --minibatch_size=24 --load=small_reuseemb.model --evaluate
[Test TEST] Loss: 4.88281608367 Perplexity: 132.001869276 Time: 20.2611508369
在那裡我們有 - 重複使用嵌入使我們的困惑下降了26分。好的!
由於我們打開了輸出日誌的標誌, --output=small_baseline.log and --output=small_reuseemb.log ,我們可以通過使用隨附的visualize_log.py腳本在訓練過程中可視化我們的驗證錯誤。
python visualize_log.py small_baseline.log small_baseline.log --output=compare_baseline_reuseemb.png
生產:

如果您有任何疑問,請隨時打我:[email protected]