AWD-LSTM語言模型是如何實現的
圖:pixabay
原文來源:github、arxiv
作者:Stephen Merity
「機器人圈」編譯:嗯~阿童木呀、多啦A亮
具有權重下降LSTM的平均隨機梯度下降
該存儲庫包含用於Salesforce Research的論文《正規化和優化LSTM語言模型》(https://arxiv.org/abs/1708.02182)的代碼,最初派生於PyTorch詞級語言建模樣本(https://github.com/pytorch/examples/tree/master/word_language_model)。同時,該模型還附帶了在Penn Treebank(PTB)和WikiText-2(WT2)數據集上訓練詞級語言模型的指令,儘管該模型可能擴展到許多其他數據集上。
?安裝PyTorch 0.1.12_2;
?運行getdata.sh以便獲取Penn Treebank和WikiText-2數據集;
?使用main.py訓練基本模型;
?使用finetune.py 微調模型;
?使用pointer.py將連續緩存指針應用於finetuned模型。
如果你在研究中使用此代碼或我們的研究成果,請引用:
@article}, author=, journal=, year= }
軟體要求
該代碼庫需要Python 3和PyTorch 0.1.12_2。
注意:舊版本的PyTorch升級到更高版本將需要做一些微小的更新,並將阻止下面結果的精準複製。歡迎更新到稍後PyTorch版本中,特別是如果他們已有基準數據報告。
實驗
在撰寫本文時,代碼庫已被修改,阻止了由於隨機種子或類似的微小差異而導致的精確複製。下面的指南產生的結果大體上與所報告的數字相類似。
對於數據設置,運行./getdata.sh。該腳本收集了Mikolov預處理的Penn Treebank和WikiText-2數據集,並將它們放在data目錄中。
重要提示:如果你想要在基本實驗基礎之上繼續實驗,請注釋測試代碼並使用驗證指標,直到報告出你的最終結果。這是正確的實驗實踐,並且在調整超參數(如指針使用的參數)時尤為重要。
Penn Treebank(PTB)
下面的指令是在PTB上訓練模型,即在沒有微調的情況下達到了61.2 / 58.9(驗證/測試)的複雜度,而在微調的情況下達到了58.8 / 56.6的複雜度,在配置連續緩存指針後達到了53.5 / 53.0的複雜度。
首先,訓練模型:
python main.py --batch_size 20 --data data/penn --dropouti 0.4 --seed 28 --epoch 300 --save PTB.pt
第一輪訓練應該會產生一個結果為308.03的驗證複雜度。
然後微調模型:
python finetune.py --batch_size 20 --data data/penn --dropouti 0.4 --seed 28 --epoch 300 --save PTB.pt
第一輪訓練後的驗證複雜度應為60.85。
注意:微調修改後以PTB.pt形式保存原始模型—如果你想要保留原始權重,必須複製文件。
最後,運行指針:
python pointer.py --data data/penn --save PTB.pt --lambdasm 0.1 --theta 1.0 --window 500 --bptt 5000
請注意,本文中的模型訓練了500輪次,批量大小為40,而上述模型的這兩個參數值分別為300和20。如本文中所述,該指針的窗口大小選擇為500而不是2000。
注意:BPTT只是改變了推送到GPU上的序列的長度,但不會影響最終的結果。
WikiText-2(WT2)
下面的指令是在WT2上訓練模型,即在沒有微調的情況下達到了69.1 / 66.1(驗證/測試)的複雜度,而在微調的情況下達到了68.7 / 65.8的複雜度,在配置連續緩存指針後達到了53.6 / 52.0(特別情況下還有會51.95)的複雜度。
python main.py --seed 20923 --epochs 750 --data data/wikitext-2 --save WT2.pt
第一輪訓練應該會產生一個結果為629.93的驗證複雜度。
python -u finetune.py --seed 1111 --epochs 750 --data data/wikitext-2 --save WT2.pt
第一輪訓練後的驗證複雜度應該為69.14。
注意:微調修改後以PTB.pt形式保存原始模型,如果要保留原始權重,必須複製文件。
最後,運行指針:
python pointer.py --save WT2.pt --lambdasm 0.1279 --theta 0.662 --window 3785 --bptt 2000 --data data/wikitext-2
注意:BPTT只是改變了推送到GPU上的序列的長度,但不會影響最終的結果。
速度
對LSTM的增強有幾下幾種,包括我們的DropConnect(Wan等人於2013年提出)的變體,我們稱之為權重下降,它能夠增加循環丟失,允許使用NVIDIA的cuDNN LSTM實現。如果在安裝了cuDNN的CUDA上運行,PyTorch將自動使用cuDNN後端。這就保證了模型的快速訓練,即使在融合了可能需要數百個訓練輪次的情況下也是如此。
在NVIDIA Quadro GP100訓練期間,該模型的默認速度為:
?Penn Treebank:批量大小為40的每輪訓練時間約為45秒,批量大小為20的每輪訓練時間約為65秒。
?WikiText-2:批量大小為80的每輪訓練時間約為105秒。
在K80上,速度要慢三倍左右。在K80或其他具有較少內存的存儲卡上,你可能希望啟用最大採樣序列長度的上限以防止內存不足(OOM)錯誤,特別是對於WikiText-2而言。
如果速度是一個主要問題,那麼SGD會比ASGD的非單調觸發變體的收斂速度要快得多,但是整體上的複雜度也要糟糕得多。
在計算機領域內,一般來說,諸如長短期記憶網路(LSTM)這樣的循環神經網路(RNNs)往往充當的是包括機器翻譯、語言建模和問答等許多序列學習任務的基本構建模塊。在本文中,我們考慮了詞級語言建模的具體問題,並研究了正則化和優化基於LSTM模型的策略。我們建議使用權重下降的LSTM,它在hidden-to hidden權重中使用DropConnect作為一種循環正則化的形式。此外,我們還引入NT-ASGD,它是平均隨機梯度法的變體,即使用非單調條件來確定平均觸發器,而不是由用戶進行調整。使用這些和其他正則化策略,我們在兩個數據集上達到了最高水平的詞級複雜度:在Penn Treebank 的57.3和在WikiText-2上的65.8。在探索神經緩存與我們提出的模型相結合的有效性時,我們達到了比當前最高水平的複雜度還要低的結果:在Penn Treebank上的52.8和在WikiText-2上的52.0。
點擊展開全文
※漲姿勢!「手動」調試神經網路,可以這樣做
※從線性回歸到神經網路,機器學習工程師的進階之路
※用Python實現CNN長短期記憶網路!你也行
※詳解徑向基函數神經網路RBNN,它和多層感知器MLP有何區別
TAG:機器人圈 |
※ASP.NET MVC5多語言切換快速實現方案
※圖解當前最強語言模型BERT:NLP是如何攻克遷移學習的?
※跨語言版BERT:Facebook提出跨語言預訓練模型XLM
※進一步改進GPT和BERT:使用Transformer的語言模型
※一個續寫故事達到人類水平的AI,OpenAI大規模無監督語言模型GPT-2
※PHP與C語言的區別
※AWS開源可跨關係型與NoSQL資料庫查詢語言PartiQL
※表現比 BERT 更勝一籌?微軟用於學習通用語言嵌入的 MT-DNN 即將開源
※SKY&MISS採訪-重返WCG帶來的感觸無法用語言形容
※DeepMind提出空間語言集成模型SLIM,有效編碼自然語言的空間關係
※「RNG vs SKT」彈幕的自然語言的初步分析,這就是Python的魅力
※生物學將是下一代計算平台:DNA是代碼,CRISPR是編程語言
※FAIR&NYU開發XNLI語料庫:15種語言
※OpenAI放出逆天語言AI模型,AI一本正經胡說八道
※如何讓語言模型充分利用GPU:針對大規模並行設備的N-gram
※RETADUP蠕蟲病毒現新變種 熱鍵腳本語言AHK再被利用
※支持53種語言預訓練模型,斯坦福發布全新NLP工具包StanfordNLP
※玩轉時裝語言,KIDS WEAR「萌」力不止於此
※OpenAI被諷ClosedAI?語言模型並沒有想像中的強大
※靈活的API查詢語言——GraphQL