基於Andrej Karpathy的代碼https://github.com/karpathy/char-rnn和Samy Bengio的紙張http://arxiv.org/abs/1506.03099
製作代碼可以處理英語和漢字。這是我對lua的第一個觸摸,所以弦樂過程似乎很愚蠢,但是效果很好。
我還添加了一個稱為“ min_freq”的選項,因為中文的詞彙大小很大,這使參數數字增加了很多。因此,刪除一些罕見的角色可能會有所幫助。
Samy Bengio的紙張計劃對NIPS15中復發性神經網絡進行序列預測進行了抽樣,提出了一種簡單但功率的方法來暗示RNN。
在我的實驗中,我發現它有很大幫助避免過度擬合併使測試損失更深。我只使用線性衰減。
使用-use_ss以打開或關閉計劃的採樣,默認為ON。 -start_ss是真實數據的開始,我建議使用1,因為我們的模型應該在一開始就學習數據而不會噪聲。 -min_ss也非常重要,因為太多的噪聲會損害性能。最後, -decay_ss是線性衰減率。
我添加了一個腳本來將由GPU訓練的模型文件轉換為CPU模型。您可以嘗試以下操作:
$ th convert.lua gpu_model cpu_model根據Redis的子/酒吧,添加了Web演示,以便其他人輕鬆測試模型。我之所以使用Redis,是因為我找不到與Torch充分整合的好RPC或Web服務器的工作。您應該注意到演示是Ajax的異步。在Ubuntu上設置演示:安裝Redis並啟動它
$ wget http://download.redis.io/releases/redis-3.0.3.tar.gz
$ tar xzf redis-3.0.3.tar.gz
$ cd redis-3.0.3
$ make
$ sudo make install
$ redis-server &然後安裝燒瓶和redis插件:
$ sudo pip install flask
$ sudo pip install redis
$ luarocks install redis-lua將您的模型放在在線_model中,將其重命名為“ Model.t7”,“啟動後端”和“ Fontend腳本:”
$ nohup th web_backend.lua &
$ nohup python web_server.py & 請關注此設置您的實驗。
該代碼實現了多層復發性神經網絡(RNN,LSTM和GRU),用於從字符級語言模型中進行培訓/採樣。該模型學會在序列中預測下一個字符的概率。換句話說,輸入是一個文本文件,該模型學會了生成類似的文本。
該代碼基礎的上下文在我的博客文章中詳細描述。項目頁面上有一些數據集。
該代碼最初是基於牛津大學機器學習類實用6的,而該課程又基於學習從Wojciech Zaremba執行代碼的基礎。它的大塊也與我的Labmate Justin Johnson合作開發。
該代碼用LUA編寫,需要火炬。此外,您需要使用Luarocks安裝nngraph和optim軟件包,然後在安裝火炬後可以執行這些操作:
$ luarocks install nngraph
$ luarocks install optim如果您想使用CUDA GPU計算,則首先需要安裝CUDA工具包,然後是cutorch和cunn軟件包:
$ luarocks install cutorch
$ luarocks install cunn如果您想使用OpenCL GPU計算,首先需要安裝cltorch和clnn軟件包,然後在培訓過程中使用選項-opencl 1 :
$ luarocks install cltorch
$ luarocks install clnn所有輸入數據都存儲在data/目錄中。您會注意到,在存儲庫中包含一個示例數據集(在文件夾data/tinyshakespeare中),該數據集由莎士比亞的一部分組成。我在項目頁面上提供了更多數據集。
您自己的數據:如果您想使用自己的數據,請創建一個文件input.txt並將其放入data/中的文件夾中。例如, data/some_folder/input.txt 。您第一次運行培訓腳本時,它將在data/some_folder中寫兩個便利性文件。
請注意,如果您的數據太小(1MB已被認為很小),則RNN不會有效地學習。請記住,它必須從頭開始學習所有內容。
相反,如果您的數據大(大於2MB),請有信心增加rnn_size並訓練更大的模型(請參見下面的培訓詳細信息)。它將工作得更好。例如,使用6MB,您可以輕鬆提高rnn_size 300甚至更多。適合我的GPU的最大的,並且我已經使用此代碼訓練的是rnn_size 700,使用num_layers 3(默認為2)。
例如,使用train.lua開始訓練模型:例如:
$ th train.lua -data_dir data/some_folder -gpuid -1
-data_dir標誌最重要,因為它指定了要使用的數據集。請注意,在此示例中,我們還將gpuid設置為-1,該gpuid告訴代碼使用CPU訓練,否則默認為GPU 0。對於各種選項,還有許多其他標誌。請諮詢$ th train.lua -help以獲取全面的環境。這是另一個例子:
$ th train.lua -data_dir data/some_folder -rnn_size 512 -num_layers 2 -dropout 0.5
在訓練模型時,它將定期將檢查點文件寫入cv文件夾。按照eval_val_every選項指定的數量迭代控制這些檢查點的頻率(例如,如果是1,則每次迭代都寫了一個檢查點)。這些檢查點的文件名包含一個非常重要的數字:損失。例如,帶有文件名的檢查點lm_lstm_epoch0.95_2.0681.t7指出,此時,該模型在Epoch 0.95上(即它已經對培訓數據進行了完整的通行證),並且驗證數據的損失為2.0681。這個數字非常重要,因為它越低,檢查點的工作越好。一旦開始生成數據(下面討論),您將需要使用具有最低驗證損失的模型檢查點。請注意,這可能不一定是培訓結束時的最後一個檢查站(由於可能過度擬合)。
要注意的另一個重要數量是batch_size (稱其為b), seq_length (稱為s)以及train_frac和val_frac設置。批處理大小指定一次並行處理多少個數據流。序列長度指定每個塊的長度,這也是梯度剪輯的極限。例如,如果seq_length為20,則梯度信號將永遠不會反向傳播超過20個時間步,並且該模型可能不會發現依賴關係長於該字符數量的長度。在運行時,您的輸入文本文件具有n個字符,首先將它們分為大小BX的塊。然後將這些塊分配給三個拆分:根據frac設置,火車/閥/測試。如果您的數據很小,則可能只有默認設置,您總共只有很少的塊(例如100)。這是不好的:在這些情況下,您可能需要降低批處理大小或序列長度。
您還可以使用init_from從先前保存的檢查點進行INET參數。
我們可以使用這些檢查點生成文本(下一步討論)。
給定一個檢查點文件(例如寫給cv文件),我們可以生成新文本。例如:
$ th sample.lua cv/some_checkpoint.t7 -gpuid -1
確保如果您的檢查站已經接受了GPU的培訓,它也可以用GPU取樣,反之亦然。否則,代碼將(當前)抱怨。與火車腳本一樣,有關完整選項,請參見$ th sample.lua -help 。一個重要的是(例如) -length 10000 ,它將生成10,000個字符(默認值= 2000)。
溫度。您可能想使用很多很多內容的一個重要參數是-temperature ,它在範圍[0,1]中的數字(不包括在內),默認值= 1。溫度將預測的對數概率劃分為軟磁體之前,因此較低的溫度會導致模型更可能產生更大的可能性,但也更有填充和保守的預測。較高的溫度會導致模型有更多的機會並增加結果的多樣性,但要付出更多錯誤。
啟動。也可以使用-primetext使用一些啟動文本來啟動模型。這是從RNN開始使用一些硬編碼字符的RNN,可以在開始生成文本之前在某些上下文中加熱它。
愉快的抽樣!
如果您對機器學習或神經網絡有些陌生,則可能需要一些專業知識才能獲得良好的模型。跟踪最重要的數量是您的訓練損失(在培訓期間打印)和驗證損失(偶爾在驗證數據上運行RNN時偶爾打印(默認每1000次迭代))。尤其:
控制模型的兩個最重要的參數是rnn_size和num_layers 。我建議您始終使用2/3的num_layers 。 rnn_size可以根據您擁有的數據進行調整。跟踪此處的兩個重要數量是:
這兩個應大約相同的數量級。這有點棘手。這裡有一些例子:
rnn_size更大。獲得非常好的模型的獲勝策略(如果您有計算時間)是要始終錯誤地使網絡更大(您願意等待它計算的大小),然後嘗試不同的輟學值(在0,1之間)。無論哪種型號具有最佳的驗證性能(在檢查點文件名中編寫的損失,低為好),都是您最終應使用的損失。
在深度學習中運行許多不同的模型非常常見,最終以任何檢查點獲得最佳的驗證性能。
順便說一句,培訓和驗證拆分的大小也是參數。確保您在驗證集中有大量數據,或者否則驗證性能將是嘈雜的,並且不太有用。
麻省理工學院