Dieses Repository enthält den Code, der für zwei Salesforce-Forschungspapiere verwendet wird:
Dem Modell liegt eine Anleitung zum Trainieren bei:
Sprachmodelle auf Wortebene über die Datensätze Penn Treebank (PTB), WikiText-2 (WT2) und WikiText-103 (WT103).
Sprachmodelle auf Zeichenebene über den Datensatz Penn Treebank (PTBC) und Hutter Prize (enwik8)
Das Modell kann aus einem LSTM oder einem Quasi-Recurrent Neural Network (QRNN) bestehen, das in diesem Aufbau zwei- oder mehrmals schneller ist als das cuDNN LSTM und dabei eine gleichwertige oder bessere Genauigkeit erreicht.
getdata.sh
aus, um die Datensätze Penn Treebank und WikiText-2 abzurufenmain.py
finetune.py
pointer.py
auf das feinabgestimmte Modell anWenn Sie diesen Code oder unsere Ergebnisse in Ihrer Forschung verwenden, geben Sie bitte Folgendes an:
@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}
}
Die Codebasis ist jetzt für die meisten Anwendungsfälle mit PyTorch 0.4 kompatibel (ein großes Lob an https://github.com/shawntan für eine ziemlich umfassende PR Nr. 43). Um die angegebene Leistung zu erhalten, können geringfügige Neuanpassungen der Hyperparameter erforderlich sein. Wenn Sie eine exakte Reproduzierbarkeit wünschen (oder auf PyTorch 0.3 oder niedriger laufen möchten), empfehlen wir die Verwendung eines älteren Commits dieses Repositorys. Wir arbeiten immer noch an pointer
, finetune
und generate
.
Für die aktuelle Codebasis sind Python 3 und PyTorch 0.4 erforderlich.
Nachfolgend sind Hyperparameter aufgeführt, um gleichwertige oder bessere Ergebnisse als im Originalpapier zu erzielen.
Wenn Sie eine frühere Version der Codebasis verwenden müssen, sind der Originalcode und die Hyperparameter erforderlich, auf die in der Version PyTorch==0.1.12 mit Python 3 und PyTorch 0.1.12 zugegriffen werden kann. Wenn Sie Anaconda verwenden, kann die Installation von PyTorch 0.1.12 über Folgendes erreicht werden: conda install pytorch=0.1.12 -c soumith
.
Die Codebasis wurde während des Verfassens der Arbeit geändert, wodurch eine exakte Reproduktion aufgrund geringfügiger Unterschiede bei zufälligen Startwerten oder Ähnlichem verhindert wurde. Wir haben auch festgestellt, dass sich die genauen Reproduktionszahlen ändern, wenn die zugrunde liegende GPU ausgetauscht wird. Der nachstehende Leitfaden liefert Ergebnisse, die den angegebenen Zahlen weitgehend ähneln.
Führen Sie zur Dateneinrichtung ./getdata.sh
aus. Dieses Skript sammelt die von Mikolov vorverarbeiteten Penn Treebank- und WikiText-2-Datensätze und platziert sie im data
.
Entscheiden Sie als Nächstes, ob Sie QRNN oder LSTM als zugrunde liegendes rekurrentes neuronales Netzwerkmodell verwenden möchten. Das QRNN ist um ein Vielfaches schneller als sogar das cuDNN-optimierte LSTM von Nvidia (und Dutzende Male schneller als eine naive LSTM-Implementierung), erzielt jedoch für viele Datensätze auf Wortebene ähnliche oder bessere Ergebnisse als das LSTM. Zum Zeitpunkt des Schreibens verwenden die QRNN-Modelle die gleiche Anzahl an Parametern und stellen etwas tiefere Netzwerke dar, sind jedoch pro Epoche zwei- bis viermal schneller und benötigen weniger Epochen zur Konvergenz.
Das QRNN-Modell verwendet ein QRNN mit der Faltungsgröße 2 für die erste Schicht, wodurch das Modell diskrete Eingaben in natürlicher Sprache (z. B. „New York“) anzeigen kann, während alle anderen Schichten eine Faltungsgröße von 1 verwenden.
Hinweis zur Feinabstimmung: Durch die Feinabstimmung wird die ursprünglich gespeicherte Modelldatei model.pt
geändert. Wenn Sie die Originalgewichte beibehalten möchten, müssen Sie die Datei kopieren.
Hinweis: BPTT ändert lediglich die Länge der auf die GPU übertragenen Sequenz, hat jedoch keinen Einfluss auf das Endergebnis.
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
Mit der folgenden Anweisung wird ein PTB-Modell trainiert, das ohne Feinabstimmung Perplexitäten von ungefähr 61.2
/ 58.8
(Validierung / Test) erreicht, mit Feinabstimmung Perplexitäten von ungefähr 58.8
/ 56.5
und mit der kontinuierlichen Cache-Zeiger-Erweiterung Perplexitäten von ungefähr 53.2
/ 52.5
erreicht.
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
Mit der folgenden Anweisung wird ein QRNN-Modell trainiert, das ohne Feinabstimmung Verwirrungen von ungefähr 60.6
/ 58.3
(Validierung/Testen) erreicht, mit Feinabstimmung Verwirrungen von ungefähr 59.1
/ 56.7
und mit der kontinuierlichen Cache-Zeiger-Erweiterung Verwirrungen von ungefähr 53.4
/ 52.6
erreicht.
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
Die folgende Anweisung trainiert ein PTB-Modell, das ohne Feinabstimmung Perplexitäten von ungefähr 68.7
/ 65.6
(Validierung / Test) erreicht, mit Feinabstimmung Perplexitäten von ungefähr 67.4
/ 64.7
erreicht und mit der kontinuierlichen Cache-Zeiger-Erweiterung Perplexitäten von ungefähr 52.2
/ 50.6
erreicht.
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
Die folgende Anleitung erstellt ein QRNN-Modell, das ohne Feinabstimmung Verwirrungen von ungefähr 69.3
/ 66.8
(Validierung/Testen) erreicht, mit Feinabstimmung Verwirrungen von ungefähr 68.5
/ 65.9
und mit der kontinuierlichen Cache-Zeiger-Erweiterung eine Verwirrung von ungefähr 53.6
/ 52.1
erreicht. Bessere Zahlen sind wahrscheinlich erreichbar, aber die Hyperparameter wurden nicht umfassend durchsucht. Diese Hyperparameter sollten jedoch als guter Ausgangspunkt dienen.
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
Informationen zur Geschwindigkeit in Bezug auf PTB auf Zeichenebene und enwik8 oder WikiText-103 auf Wortebene finden Sie im entsprechenden Dokument.
Die Standardgeschwindigkeiten der Modelle beim Training auf einer NVIDIA Quadro GP100:
Die standardmäßigen QRNN-Modelle können weitaus schneller sein als das cuDNN LSTM-Modell, wobei die Beschleunigungen davon abhängen, wie groß der Engpass des RNN ist. Der Großteil der oben genannten Modellzeit wird jetzt für Softmax oder Optimierungsaufwand aufgewendet (siehe PyTorch QRNN-Diskussion zur Geschwindigkeit).
Auf einem K80 sind die Geschwindigkeiten etwa dreimal langsamer. Auf einer K80 oder anderen Speicherkarten mit weniger Speicher möchten Sie möglicherweise die Obergrenze für die maximale Länge der abgetasteten Sequenz aktivieren, um Fehler aufgrund von unzureichendem Speicher (OOM) zu verhindern, insbesondere für WikiText-2.
Wenn Geschwindigkeit ein Hauptproblem ist, konvergiert SGD schneller als unsere nicht monoton ausgelöste ASGD-Variante, erreicht jedoch eine schlechtere Gesamtperplexität.
Ausführliche Informationen finden Sie im PyTorch QRNN-Repository.
Alle Erweiterungen des LSTM, einschließlich unserer Variante von DropConnect (Wan et al. 2013), die als Weight-Drop bezeichnet wird und wiederkehrende Dropouts hinzufügt, ermöglichen die Verwendung der cuDNN-LSTM-Implementierung von NVIDIA. PyTorch verwendet automatisch das cuDNN-Backend, wenn es auf CUDA mit installiertem cuDNN ausgeführt wird. Dadurch wird sichergestellt, dass das Modell schnell trainiert werden kann, selbst wenn die Konvergenz mehrere Hundert Epochen dauern kann.