Repositori ini berisi kode yang digunakan untuk dua makalah Salesforce Research:
Model ini dilengkapi dengan instruksi untuk melatih:
model bahasa tingkat kata pada kumpulan data Penn Treebank (PTB), WikiText-2 (WT2), dan WikiText-103 (WT103)
model bahasa tingkat karakter pada dataset Penn Treebank (PTBC) dan Hutter Prize (enwik8)
Model dapat terdiri dari LSTM atau Quasi-Recurrent Neural Network (QRNN) yang dua kali atau lebih cepat daripada cuDNN LSTM dalam penyiapan ini sekaligus mencapai akurasi yang setara atau lebih baik.
getdata.sh
untuk memperoleh kumpulan data Penn Treebank dan WikiText-2main.py
finetune.py
pointer.py
Jika Anda menggunakan kode ini atau hasil kami dalam penelitian Anda, harap kutip sebagaimana mestinya:
@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}
}
Basis kode sekarang kompatibel dengan PyTorch 0.4 untuk sebagian besar kasus penggunaan (sapaan keras ke https://github.com/shawntan untuk PR #43 yang cukup komprehensif). Penyesuaian ringan pada hyperparameter mungkin diperlukan untuk mendapatkan performa yang dikutip. Jika Anda menginginkan reproduktifitas yang tepat (atau ingin berjalan di PyTorch 0.3 atau lebih rendah), kami sarankan untuk menggunakan penerapan yang lebih lama dari repositori ini. Kami masih mengerjakan fungsi pointer
, finetune
dan generate
.
Python 3 dan PyTorch 0.4 diperlukan untuk basis kode saat ini.
Di bawah ini disertakan parameter hiper untuk mendapatkan hasil yang setara atau lebih baik dengan yang disertakan dalam makalah asli.
Jika Anda perlu menggunakan basis kode versi sebelumnya, diperlukan kode asli dan parameter hyper yang dapat diakses pada rilis PyTorch==0.1.12, dengan Python 3 dan PyTorch 0.1.12. Jika Anda menggunakan Anaconda, instalasi PyTorch 0.1.12 dapat dilakukan melalui: conda install pytorch=0.1.12 -c soumith
.
Basis kode telah dimodifikasi selama penulisan makalah, mencegah reproduksi yang tepat karena perbedaan kecil dalam benih acak atau sejenisnya. Kami juga melihat angka reproduksi persisnya berubah ketika GPU yang mendasarinya diubah. Panduan di bawah ini memberikan hasil yang sebagian besar serupa dengan angka yang dilaporkan.
Untuk pengaturan data, jalankan ./getdata.sh
. Skrip ini mengumpulkan kumpulan data Penn Treebank dan WikiText-2 Mikolov yang telah diproses sebelumnya dan menempatkannya di direktori data
.
Selanjutnya, putuskan apakah akan menggunakan QRNN atau LSTM sebagai model jaringan saraf berulang yang mendasarinya. QRNN jauh lebih cepat daripada LSTM yang dioptimalkan cuDNN Nvidia (dan puluhan kali lebih cepat daripada implementasi LSTM yang naif) namun mencapai hasil yang serupa atau lebih baik daripada LSTM untuk banyak kumpulan data tingkat kata. Pada saat penulisan, model QRNN menggunakan jumlah parameter yang sama dan merupakan jaringan yang sedikit lebih dalam tetapi dua hingga empat kali lebih cepat per epoch dan memerlukan lebih sedikit epoch untuk konvergen.
Model QRNN menggunakan QRNN dengan ukuran konvolusional 2 untuk lapisan pertama, sehingga model dapat melihat masukan bahasa alami yang terpisah (yaitu "New York"), sementara semua lapisan lainnya menggunakan ukuran konvolusional 1.
Penyempurnaan Catatan: Penyempurnaan mengubah file model.pt
asli yang disimpan - jika Anda ingin mempertahankan bobot asli, Anda harus menyalin file tersebut.
Catatan petunjuk: BPTT hanya mengubah panjang urutan yang dimasukkan ke GPU tetapi tidak akan memengaruhi hasil akhir.
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
Instruksi di bawah ini melatih model PTB yang tanpa penyetelan mencapai kebingungan sekitar 61.2
/ 58.8
(validasi / pengujian), dengan penyetelan mencapai kebingungan sekitar 58.8
/ 56.5
, dan dengan augmentasi penunjuk cache berkelanjutan mencapai kebingungan sekitar 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
Instruksi di bawah ini melatih model QRNN yang tanpa penyetelan mencapai kebingungan sekitar 60.6
/ 58.3
(validasi / pengujian), dengan penyetelan mencapai kebingungan sekitar 59.1
/ 56.7
, dan dengan augmentasi penunjuk cache berkelanjutan mencapai kebingungan sekitar 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
Instruksi di bawah ini melatih model PTB yang tanpa penyetelan mencapai kebingungan sekitar 68.7
/ 65.6
(validasi / pengujian), dengan penyempurnaan mencapai kebingungan sekitar 67.4
/ 64.7
, dan dengan augmentasi penunjuk cache berkelanjutan mencapai kebingungan sekitar 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
Instruksi di bawah ini akan membuat model QRNN yang tanpa penyempurnaan mencapai kebingungan sekitar 69.3
/ 66.8
(validasi / pengujian), dengan penyempurnaan mencapai kebingungan sekitar 68.5
/ 65.9
, dan dengan augmentasi penunjuk cache berkelanjutan mencapai kebingungan sekitar 53.6
/ 52.1
. Angka yang lebih baik kemungkinan besar dapat dicapai tetapi parameter hiper belum dicari secara ekstensif. Namun, parameter hiper ini harus menjadi titik awal yang baik.
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
Untuk kecepatan mengenai PTB tingkat karakter dan enwik8 atau WikiText-103 tingkat kata, rujuk ke makalah yang relevan.
Kecepatan default untuk model selama pelatihan pada NVIDIA Quadro GP100:
Model QRNN default bisa jauh lebih cepat daripada model cuDNN LSTM, dengan peningkatan kecepatan bergantung pada seberapa besar hambatan yang dialami RNN. Mayoritas waktu model di atas sekarang dihabiskan dalam softmax atau overhead optimasi (lihat diskusi PyTorch QRNN tentang kecepatan).
Kecepatannya kira-kira tiga kali lebih lambat pada K80. Pada K80 atau kartu memori lain dengan memori lebih sedikit, Anda mungkin ingin mengaktifkan batas panjang urutan sampel maksimum untuk mencegah kesalahan kehabisan memori (OOM), khususnya untuk WikiText-2.
Jika kecepatan adalah masalah utama, SGD akan menyatu lebih cepat dibandingkan varian ASGD yang dipicu secara non-monoton, namun menghasilkan kebingungan yang lebih buruk secara keseluruhan.
Untuk detail selengkapnya, lihat repositori PyTorch QRNN.
Semua penambahan pada LSTM, termasuk varian DropConnect kami (Wan et al. 2013) yang disebut penurunan bobot yang menambahkan dropout berulang, memungkinkan penggunaan implementasi cuDNN LSTM NVIDIA. PyTorch akan secara otomatis menggunakan backend cuDNN jika dijalankan di CUDA dengan cuDNN diinstal. Hal ini memastikan model dapat dilatih dengan cepat meskipun konvergensi mungkin memerlukan ratusan epoch.