Этот репозиторий содержит код, использованный в двух статьях Salesforce Research:
К модели прилагается инструкция по обучению:
языковые модели уровня слов на основе наборов данных Penn Treebank (PTB), WikiText-2 (WT2) и WikiText-103 (WT103).
языковые модели на уровне символов на основе набора данных Penn Treebank (PTBC) и Hutter Prize (enwik8)
Модель может состоять из LSTM или квазирекуррентной нейронной сети (QRNN), которая в этой настройке работает в два или более раз быстрее, чем cuDNN LSTM, обеспечивая при этом эквивалентную или лучшую точность.
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 для большинства случаев использования (большая благодарность 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
. Этот скрипт собирает предварительно обработанные Mikolov наборы данных Penn Treebank и WikiText-2 и помещает их в каталог data
.
Затем решите, использовать ли QRNN или LSTM в качестве базовой модели рекуррентной нейронной сети. QRNN во много раз быстрее, чем даже оптимизированный LSTM от Nvidia cuDNN (и в десятки раз быстрее, чем наивная реализация 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 (Ван и др., 2013), называемый сбросом веса, который добавляет периодический отсев, позволяют использовать реализацию NVIDIA cuDNN LSTM. PyTorch будет автоматически использовать бэкэнд cuDNN, если он запускается на CUDA с установленным cuDNN. Это обеспечивает быстрое обучение модели, даже если сходимость может занять многие сотни эпох.