このリポジトリには、Salesforce Research の 2 つの論文で使用されるコードが含まれています。
モデルには次のトレーニング手順が付属しています。
Penn Treebank (PTB)、WikiText-2 (WT2)、および WikiText-103 (WT103) データセットのワード レベル言語モデル
Penn Treebank (PTBC) および Hutter賞金データセット (enwik8) に基づいた文字レベル言語モデル
モデルは、LSTM または準リカレント ニューラル ネットワーク (QRNN) で構成できます。QRNN は、この設定では cuDNN LSTM よりも 2 倍以上高速でありながら、同等以上の精度を実現します。
getdata.sh
実行して Penn Treebank および WikiText-2 データセットを取得しますmain.py
を使用して基本モデルをトレーニングするfinetune.py
を使用してモデルを微調整します。pointer.py
を使用して、微調整されたモデルに連続キャッシュ ポインターを適用します。このコードまたは研究結果を使用する場合は、適切に引用してください。
@article{merityRegOpt,
title={{Regularizing and Optimizing LSTM Language Models}},
author={Merity, Stephen and Keskar, Nitish Shirish and Socher, Richard},
journal={arXiv preprint arXiv:1708.02182},
year={2017}
}
@article{merityAnalysis,
title={{An Analysis of Neural Language Modeling at Multiple Scales}},
author={Merity, Stephen and Keskar, Nitish Shirish and Socher, Richard},
journal={arXiv preprint arXiv:1803.08240},
year={2018}
}
コードベースは、ほとんどのユースケースに対して PyTorch 0.4 と互換性があります (かなり包括的な PR #43 については https://github.com/shawntan への大きな声援です)。見積もられたパフォーマンスを得るには、ハイパーパラメータの軽度の再調整が必要になる場合があります。正確な再現性が必要な場合 (または PyTorch 0.3 以下で実行したい場合)、このリポジトリの古いコミットを使用することをお勧めします。私たちはまだpointer
、 finetune
、 generate
機能に取り組んでいます。
現在のコードベースには Python 3 と PyTorch 0.4 が必要です。
以下に含まれるのは、元の論文に含まれているものと同等以上の結果を得るハイパー パラメーターです。
以前のバージョンのコードベースを使用する必要がある場合は、Python 3 および PyTorch 0.1.12 を使用して、PyTorch==0.1.12 リリースでアクセス可能な元のコードとハイパー パラメーターが必要です。 Anaconda を使用している場合は、 conda install pytorch=0.1.12 -c soumith
によって PyTorch 0.1.12 をインストールできます。
コードベースは論文の執筆中に変更されており、ランダム シードなどのわずかな違いにより正確な再現が妨げられています。また、基盤となる GPU を変更すると、正確な再生産数が変化することも確認されています。以下のガイドでは、報告された数値とほぼ同様の結果が得られます。
データをセットアップするには、 ./getdata.sh
を実行します。このスクリプトは、Mikolov で前処理された Penn Treebank と WikiText-2 データセットを収集し、 data
ディレクトリに配置します。
次に、基礎となるリカレント ニューラル ネットワーク モデルとして QRNN と LSTM のどちらを使用するかを決定します。 QRNN は、Nvidia の cuDNN に最適化された LSTM よりも何倍も高速 (そして単純な LSTM 実装よりも数十倍高速) でありながら、多くのワード レベルのデータセットに対して LSTM と同等以上の結果を達成します。執筆時点では、QRNN モデルは同じ数のパラメータを使用し、わずかに深いネットワークですが、エポックあたり 2 ~ 4 倍高速で、収束に必要なエポックが少なくなります。
QRNN モデルは、最初の層に畳み込みサイズ 2 の QRNN を使用し、モデルが離散自然言語入力 (つまり、「ニューヨーク」) を表示できるようにしますが、他のすべての層は畳み込みサイズ 1 を使用します。
微調整 注:微調整では、保存された元のモデルのmodel.pt
ファイルが変更されます。元の重みを保持したい場合は、ファイルをコピーする必要があります。
注: BPTT は GPU にプッシュされるシーケンスの長さを変更するだけで、最終結果には影響しません。
python -u main.py --epochs 50 --nlayers 3 --emsize 400 --nhid 1840 --alpha 0 --beta 0 --dropoute 0 --dropouth 0.1 --dropouti 0.1 --dropout 0.4 --wdrop 0.2 --wdecay 1.2e-6 --bptt 200 --batch_size 128 --optimizer adam --lr 1e-3 --data data/enwik8 --save ENWIK8.pt --when 25 35
python -u main.py --epochs 500 --nlayers 3 --emsize 200 --nhid 1000 --alpha 0 --beta 0 --dropoute 0 --dropouth 0.25 --dropouti 0.1 --dropout 0.1 --wdrop 0.5 --wdecay 1.2e-6 --bptt 150 --batch_size 128 --optimizer adam --lr 2e-3 --data data/pennchar --save PTBC.pt --when 300 400
python -u main.py --epochs 14 --nlayers 4 --emsize 400 --nhid 2500 --alpha 0 --beta 0 --dropoute 0 --dropouth 0.1 --dropouti 0.1 --dropout 0.1 --wdrop 0 --wdecay 0 --bptt 140 --batch_size 60 --optimizer adam --lr 1e-3 --data data/wikitext-103 --save WT103.12hr.QRNN.pt --when 12 --model QRNN
以下の命令は、微調整なしで約61.2
/ 58.8
のパープレキシティ (検証/テスト) を達成する PTB モデルをトレーニングします。微調整を使用すると約58.8
/ 56.5
のパープレキシティを達成し、継続的なキャッシュ ポインター拡張を使用すると約53.2
/ 52.5
のパープレキシティを達成します。
python main.py --batch_size 20 --data data/penn --dropouti 0.4 --dropouth 0.25 --seed 141 --epoch 500 --save PTB.pt
python finetune.py --batch_size 20 --data data/penn --dropouti 0.4 --dropouth 0.25 --seed 141 --epoch 500 --save PTB.pt
python pointer.py --data data/penn --save PTB.pt --lambdasm 0.1 --theta 1.0 --window 500 --bptt 5000
以下の命令は、微調整なしで約60.6
/ 58.3
のパープレキシティ (検証/テスト) を達成する QRNN モデルをトレーニングします。微調整を使用すると約59.1
/ 56.7
のパープレキシティを達成し、継続的なキャッシュ ポインター拡張を使用すると約53.4
/ 52.6
のパープレキシティを達成します。
python -u main.py --model QRNN --batch_size 20 --clip 0.2 --wdrop 0.1 --nhid 1550 --nlayers 4 --emsize 400 --dropouth 0.3 --seed 9001 --dropouti 0.4 --epochs 550 --save PTB.pt
python -u finetune.py --model QRNN --batch_size 20 --clip 0.2 --wdrop 0.1 --nhid 1550 --nlayers 4 --emsize 400 --dropouth 0.3 --seed 404 --dropouti 0.4 --epochs 300 --save PTB.pt
python pointer.py --model QRNN --lambdasm 0.1 --theta 1.0 --window 500 --bptt 5000 --save PTB.pt
以下の命令は、微調整なしで約68.7
/ 65.6
のパープレキシティ (検証/テスト) を達成する PTB モデルをトレーニングします。微調整を使用すると約67.4
/ 64.7
のパープレキシティを達成し、継続的なキャッシュ ポインター拡張を使用すると約52.2
/ 50.6
のパープレキシティを達成します。
python main.py --epochs 750 --data data/wikitext-2 --save WT2.pt --dropouth 0.2 --seed 1882
python finetune.py --epochs 750 --data data/wikitext-2 --save WT2.pt --dropouth 0.2 --seed 1882
python pointer.py --save WT2.pt --lambdasm 0.1279 --theta 0.662 --window 3785 --bptt 2000 --data data/wikitext-2
以下の命令は、微調整なしで約69.3
/ 66.8
のパープレキシティ (検証/テスト) を達成する QRNN モデルを作成します。微調整を使用すると約68.5
/ 65.9
のパープレキシティを達成し、継続的なキャッシュ ポインター拡張を使用すると約53.6
/ 52.1
のパープレキシティを達成します。より良い数値は達成可能である可能性がありますが、ハイパー パラメーターは広範囲に調査されていません。ただし、これらのハイパー パラメータは良い出発点として機能するはずです。
python -u main.py --epochs 500 --data data/wikitext-2 --clip 0.25 --dropouti 0.4 --dropouth 0.2 --nhid 1550 --nlayers 4 --seed 4002 --model QRNN --wdrop 0.1 --batch_size 40 --save WT2.pt
python finetune.py --epochs 500 --data data/wikitext-2 --clip 0.25 --dropouti 0.4 --dropouth 0.2 --nhid 1550 --nlayers 4 --seed 4002 --model QRNN --wdrop 0.1 --batch_size 40 --save WT2.pt
python -u pointer.py --save WT2.pt --model QRNN --lambdasm 0.1279 --theta 0.662 --window 3785 --bptt 2000 --data data/wikitext-2
文字レベルの PTB および enwik8 または単語レベルの WikiText-103 に関する速度については、関連する論文を参照してください。
NVIDIA Quadro GP100 でのトレーニング中のモデルのデフォルト速度:
デフォルトの QRNN モデルは cuDNN LSTM モデルよりもはるかに高速になる可能性がありますが、高速化の度合いは RNN のボトルネックの程度に応じて異なります。上記のモデル時間の大部分は現在、ソフトマックスまたは最適化オーバーヘッドに費やされています (速度に関する PyTorch QRNN の説明を参照)。
K80 では速度が約 3 倍遅くなります。 K80 またはその他のメモリの少ないメモリ カードでは、特に WikiText-2 の場合、メモリ不足 (OOM) エラーを防ぐために、サンプリングされたシーケンスの最大長の上限を有効にすることができます。
速度が大きな問題である場合、SGD は非単調にトリガーされる ASGD のバリアントよりも速く収束しますが、全体的な複雑さは低下します。
詳細については、PyTorch QRNN リポジトリを参照してください。
反復ドロップアウトを追加するウェイト ドロップと呼ばれる DropConnect のバリアント (Wan et al. 2013) を含む LSTM へのすべての拡張により、NVIDIA の cuDNN LSTM 実装の使用が可能になります。 PyTorch は、cuDNN がインストールされた CUDA 上で実行される場合、自動的に cuDNN バックエンドを使用します。これにより、収束に何百エポックもかかる場合でも、モデルを高速にトレーニングできるようになります。