يحتوي هذا المستودع على الكود المستخدم في ورقتين بحثيتين في Salesforce:
يأتي النموذج مع تعليمات للتدريب:
نماذج اللغة على مستوى الكلمة عبر مجموعات بيانات Penn Treebank (PTB) وWikiText-2 (WT2) وWikiText-103 (WT103)
نماذج اللغة على مستوى الشخصية عبر مجموعة بيانات Penn Treebank (PTBC) وHutter Award (enwik8)
يمكن أن يتكون النموذج من LSTM أو شبكة عصبية شبه متكررة (QRNN) وهي أسرع مرتين أو أكثر من cuDNN LSTM في هذا الإعداد مع تحقيق دقة مكافئة أو أفضل.
getdata.sh
للحصول على مجموعات بيانات Penn Treebank وWikiText-2main.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 لمعظم حالات الاستخدام (تحية كبيرة لـ https://github.com/shawntan للحصول على PR #43 شامل إلى حد ما). قد تكون التعديلات البسيطة على المعلمات الفائقة ضرورية للحصول على الأداء المقتبس. إذا كنت ترغب في إمكانية تكرار نتائج دقيقة (أو ترغب في التشغيل على PyTorch 0.3 أو أقل)، فإننا نقترح استخدام الالتزام الأقدم لهذا المستودع. ما زلنا نعمل على وظائف pointer
finetune
generate
.
Python 3 وPyTorch 0.4 مطلوبان لقاعدة التعليمات البرمجية الحالية.
يوجد أدناه معلمات مفرطة للحصول على نتائج مساوية أو أفضل لتلك المدرجة في الورقة الأصلية.
إذا كنت بحاجة إلى استخدام إصدار سابق من قاعدة التعليمات البرمجية، فإن التعليمات البرمجية الأصلية والمعلمات الفائقة التي يمكن الوصول إليها في إصدار PyTorch==0.1.12، مع Python 3 وPyTorch 0.1.12 مطلوبة. إذا كنت تستخدم Anaconda، فيمكن تثبيت PyTorch 0.1.12 عبر: conda install pytorch=0.1.12 -c soumith
.
تم تعديل قاعدة التعليمات البرمجية أثناء كتابة الورقة، مما يمنع التكاثر الدقيق بسبب الاختلافات الطفيفة في البذور العشوائية أو ما شابه ذلك. لقد رأينا أيضًا أن أرقام الإنتاج الدقيقة تتغير عند تغيير وحدة معالجة الرسومات الأساسية. وينتج الدليل أدناه نتائج مشابهة إلى حد كبير للأرقام المذكورة.
لإعداد البيانات، قم بتشغيل ./getdata.sh
. يجمع هذا البرنامج النصي مجموعات بيانات Penn Treebank وWikiText-2 التي تمت معالجتها مسبقًا من Mikolov ويضعها في دليل data
.
بعد ذلك، قرر ما إذا كنت تريد استخدام QRNN أو LSTM كنموذج أساسي للشبكة العصبية المتكررة. يعد QRNN أسرع بعدة مرات من LSTM المُحسّن لـ cuDNN من Nvidia (وأسرع بعشرات المرات من تطبيق LSTM الساذج) ولكنه يحقق نتائج مماثلة أو أفضل من LSTM للعديد من مجموعات البيانات على مستوى الكلمات. في وقت كتابة هذا التقرير، تستخدم نماذج QRNN نفس عدد المعلمات وهي شبكات أعمق قليلاً ولكنها أسرع مرتين إلى أربع مرات لكل فترة وتتطلب فترات أقل للتقارب.
يستخدم نموذج QRNN QRNN بحجم تلافيفي 2 للطبقة الأولى، مما يسمح للنموذج بعرض مدخلات اللغة الطبيعية المنفصلة (أي "نيويورك")، بينما تستخدم جميع الطبقات الأخرى حجمًا تلافيفيًا يبلغ 1.
ملاحظة الضبط الدقيق: يؤدي الضبط الدقيق إلى تعديل ملف النموذج الأصلي المحفوظ model.pt
- إذا كنت ترغب في الاحتفاظ بالأوزان الأصلية، فيجب عليك نسخ الملف.
ملاحظة المؤشر: يقوم BPTT فقط بتغيير طول التسلسل المدفوع على وحدة معالجة الرسومات ولكنه لن يؤثر على النتيجة النهائية.
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
تدرب التعليمات أدناه نموذج PTB الذي بدون ضبط دقيق يحقق تعقيدات تبلغ حوالي 61.2
/ 58.8
(التحقق من الصحة / الاختبار)، مع ضبط دقيق يحقق تعقيدات تبلغ حوالي 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
التعليمات أدناه تدرب نموذج QRNN الذي بدون ضبط دقيق يحقق تعقيدات تبلغ حوالي 60.6
/ 58.3
(التحقق من الصحة / الاختبار)، مع ضبط دقيق يحقق تعقيدات تبلغ حوالي 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
التعليمات أدناه تدرب نموذج PTB الذي بدون ضبط دقيق يحقق تعقيدات تبلغ حوالي 68.7
/ 65.6
(التحقق من الصحة / الاختبار)، مع ضبط دقيق يحقق تعقيدات تبلغ حوالي 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
التعليمات أدناه هي نموذج QRNN الذي بدون ضبط دقيق يحقق تعقيدات تبلغ حوالي 69.3
/ 66.8
(التحقق من الصحة / الاختبار)، مع ضبط دقيق يحقق تعقيدات تبلغ حوالي 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. يتم الآن قضاء معظم وقت النموذج أعلاه في softmax أو الحمل التحسيني (راجع مناقشة PyTorch QRNN حول السرعة).
تكون السرعات أبطأ بثلاث مرات تقريبًا في K80. في K80 أو بطاقات الذاكرة الأخرى ذات الذاكرة الأقل، قد ترغب في تمكين الحد الأقصى لطول تسلسل العينة لمنع أخطاء نفاد الذاكرة (OOM)، خاصة بالنسبة لـ WikiText-2.
إذا كانت السرعة مشكلة رئيسية، فإن SGD يتقارب بسرعة أكبر من البديل غير الرتيب لـ ASGD على الرغم من أنه يحقق حيرة عامة أسوأ.
للحصول على التفاصيل الكاملة، راجع مستودع PyTorch QRNN.
جميع التعزيزات على LSTM، بما في ذلك البديل الخاص بنا من DropConnect (Wan et al. 2013) الذي يطلق عليه انخفاض الوزن والذي يضيف التسرب المتكرر، تسمح باستخدام تطبيق cuDNN LSTM من NVIDIA. سوف يستخدم PyTorch تلقائيًا الواجهة الخلفية لـ cuDNN إذا تم تشغيله على CUDA مع تثبيت cuDNN. وهذا يضمن سرعة تدريب النموذج حتى عندما يستغرق التقارب عدة مئات من العصور.