Dieses Repo ist eine Implementierung eines aufmerksamen RNN -Modells für die Aufgabe der Sprachmodellierung.
Die Sprachmodellierung erfolgt sowohl auf den Datensätzen Penntreebank als auch auf Wikitext-02. Die Dateien werden so analysiert, dass jedes Trainingsbeispiel aus einem Satz aus dem Korpus besteht, das auf eine Max -Stapel -Länge von 35 gepolstert ist. Längere Sätze werden abgeschnitten. Dies geschieht, um die Aufmerksamkeit zu verwalten und sich nur um Wörter im Satz zu kümmern (vor dem Zeitschritt, wenn es bei TimeStep t) ist.
Das A-RNN-LM (aufmerksamkeitsbasierte wiederkehrende neuronale Netzwerk für die Sprachmodellierung) wurde ursprünglich im kohärenten Dialog mit aufmerksamkeitsbasierten Sprachmodellen (Hongyuan Mei et al. 2016, Link) und in aufmerksamen Sprachmodellen (Salton et al. 2017, Link) vorgeschlagen.
Das Modell besteht darin, einen traditionellen Aufmerksamkeitsmechanismus auf den vorherigen verborgenen Zuständen der Encoder -RNN -Schicht (en) auszuführen, um einen Kontextvektor zu codieren, der dann mit dem zuletzt codierten versteckten Zustand kombiniert wird, um das nächste Wort in der Sequenz vorherzusagen.
Abhängigkeiten:
python=3.7torch>=1.0.0nltkmatplotlibtensorboardX Installieren Sie alle Depedenzen und führen Sie python main.py aus.
Die Datensätze werden automatisch heruntergeladen und vorverarbeitet.
Mehrere Optionen für das Laufen sind möglich. python main.py --help für die vollständige Liste.
usage: main.py [-h] [--batch-size N] [--epochs N] [--lr LR] [--patience P]
[--seed S] [--log-interval N] [--dataset [{wiki-02,ptb}]]
[--embedding-size N] [--n-layers N] [--hidden-size N]
[--positioning-embedding N] [--input-dropout D]
[--rnn-dropout D] [--decoder-dropout D] [--clip N]
[--optim [{sgd,adam,asgd}]] [--salton-lr-schedule]
[--early-stopping-patience P] [--attention]
[--no-positional-attention] [--tie-weights]
[--file-name FILE_NAME] [--parallel]
PyTorch Attentive RNN Language Modeling
optional arguments:
-h, --help show this help message and exit
--batch-size N input batch size for training (default: 64)
--epochs N number of epochs to train (default: 40)
--lr LR learning rate (default: 30.0)
--patience P patience for lr decrease (default: 5)
--seed S random seed (default: 123)
--log-interval N how many batches to wait before logging training
status (default 10)
--dataset [{wiki-02,ptb}]
Select which dataset (default: ptb)
--embedding-size N embedding size for embedding layer (default: 20)
--n-layers N layer size for RNN encoder (default: 1)
--hidden-size N hidden size for RNN encoder (default: 20)
--positioning-embedding N
hidden size for positioning generator (default: 20)
--input-dropout D input dropout (default: 0.5)
--rnn-dropout D rnn dropout (default: 0.0)
--decoder-dropout D decoder dropout (default: 0.5)
--clip N value at which to clip the norm of gradients (default:
0.25)
--optim [{sgd,adam,asgd}]
Select which optimizer (default: sgd)
--salton-lr-schedule Enables same training schedule as Salton et al. 2017
(default: False)
--early-stopping-patience P
early stopping patience (default: 25)
--attention Enable standard attention (default: False)
--no-positional-attention
Disable positional attention (default: False)
--tie-weights Tie embedding and decoder weights (default: False)
--file-name FILE_NAME
Specific filename to save under (default: uses params
to generate)
--parallel Enable using GPUs in parallel (default: False)
| Modell | Anzahl der Parameter | Validierung Verwirrung | Verwirrung testen |
|---|---|---|---|
| LSTM -Grundlinie (Merity et al., 2017) | 7,86 m | 66,77 | 64,96 |
| Aufmerksame LM (Salton et al. 2017) | 7,06 m | 79.09 | 76,56 |
| Positional aufmerksam lm | 6,9 m | 72.69 | 70,92 |
| Modell | Anzahl der Parameter | Validierung Verwirrung | Verwirrung testen |
|---|---|---|---|
| LSTM -Grundlinie (Merity et al., 2017) | 7,86 m | 72.43 | 68,50 |
| Aufmerksame LM (Salton et al. 2017) | 7,06 m | 78,43 | 74.37 |
| Positional aufmerksam lm | 6,9 m | 74.39 | 70.73 |
Sie können alle Modelle, die die oben genannten Tabellen erzeugt haben, durch einfaches Ausführen erneut erzeugt werden:
python test.py
Bitte beachten Sie jedoch, dass einige dieser Modelle 8 Stunden lang auf einer einzelnen 1080 GPU konvergieren, sodass die Gesamtlaufzeit des Experiments ungefähr 2 Tage betragen kann.
Die Unterstützung von Multi-GPU wird standardmäßig deaktiviert, da sich gezeigt wurde, dass sie sich negativ auf die Ergebnisse auswirken. Darüber hinaus ist es nicht viel schneller, da die Chargen in der Praxis klein sind, da viel Zeit damit verbracht wird, die Tensoren an den jeweiligen GPUs zu schicken.
Hier werden neben Seitenvergleiche der beiden Aufmerksamkeitsverteilungen auf einem Beispiel angezeigt:
Die Wörter in der x-Achse sind die Eingänge bei jedem Zeitschritt und die Wörter in der y-Achse sind die Ziele. Beide Modelle wurden bis zum Konvergenz im Wikitext-02-Datensatz trainiert.