Ce repo est une implémentation d'un modèle RNN attentif pour la tâche de modélisation du langage.
La modélisation du langage se fait sur les ensembles de données PenntreeBank et WikiteXT-02. Les fichiers sont analysés de telle sorte que chaque exemple de formation se compose d'une phrase du corpus, rembourré à une longueur de lot maximale de 35. Des phrases plus longues sont coupées. Cela se fait afin de gérer l'attention et de s'occuper uniquement des mots de la phrase (avant le temps si à l'heure).
L'A-RNN-LM (réseau neuronal récurrent basé sur l'attention pour la modélisation du langage) a été initialement proposé dans un dialogue cohérent avec des modèles de langage basés sur l'attention (Hongyuan Mei et al. 2016, Link), et dans des modèles de langage attentifs (Salton et al. 2017, Link).
Le modèle consiste à exécuter un mécanisme d'attention traditionnel sur les états cachés précédents de la couche RNN du codeur pour coder un vecteur de contexte qui est ensuite combiné avec le dernier état caché codé afin de prédire le mot suivant dans la séquence.
Dépendances:
python=3.7torch>=1.0.0nltkmatplotlibtensorboardX Installez toutes les dépréances et exécutez python main.py
Les ensembles de données seront téléchargés et prétraités automatiquement.
Plusieurs options pour l'exécution sont possibles d'exécuter python main.py --help pour la liste complète.
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)
| Modèle | Nombre de paramètres | Perplexité de validation | Tester la perplexité |
|---|---|---|---|
| LSTM BASELINE (MERITY et al., 2017) | 7,86 m | 66.77 | 64.96 |
| LM attentif (Salton et al. 2017) | 7,06 m | 79.09 | 76.56 |
| Positionner LM | 6,9 m | 72.69 | 70,92 |
| Modèle | Nombre de paramètres | Perplexité de validation | Tester la perplexité |
|---|---|---|---|
| LSTM BASELINE (MERITY et al., 2017) | 7,86 m | 72.43 | 68.50 |
| LM attentif (Salton et al. 2017) | 7,06 m | 78.43 | 74.37 |
| Positionner LM | 6,9 m | 74.39 | 70,73 |
Vous pouvez relancer tous les modèles qui ont généré les tables ci-dessus en fonctionnant simplement:
python test.py
Cependant, veuillez noter que certains de ces modèles prennent plus de 8 heures pour converger sur un seul GPU de 1080, de sorte que le temps d'exécution total de l'expérience pourrait être d'environ 2 jours.
Le support multi-GPU est désactivé par défaut car il a été démontré qu'il a eu un impact négatif sur les résultats. En plus de cela, puisque les lots sont petits en pratique, il n'est pas beaucoup plus rapide car beaucoup de temps est passé à envoyer les tenseurs aux GPU respectifs.
Voici des comparaisons côte à côte des deux distributions d'attention sur un exemple:
Les mots de l'axe x sont les entrées à chaque pas de temps et les mots de l'axe y sont les cibles. Les deux modèles ont été formés sur l'ensemble de données Wikitext-02 jusqu'à la convergence.