Este repositorio es una implementación de un modelo RNN atento para la tarea del modelado de idiomas.
El modelado de idiomas se realiza en los conjuntos de datos Penntreebank y Wikitext-02. Los archivos se analizan de tal manera que cada ejemplo de entrenamiento consta de una oración del corpus, acolchada a una longitud máxima de lote de 35. Se recortan oraciones más largas. Esto se hace para administrar la atención y atender solo palabras en la oración (antes de tiempo de tiempo si está en TimeStep t).
El A-RNN-LM (red neuronal recurrente basada en la atención para el modelado de idiomas) se propuso originalmente en un diálogo coherente con modelos de idiomas basados en la atención (Hongyuan Mei et al. 2016, Link), y en modelos de idiomas atentos (Salton et al. 2017, Link).
El modelo consiste en ejecutar un mecanismo de atención tradicional en los estados ocultos anteriores de las capa (s) RNN del codificador para codificar un vector de contexto que luego se combina con el último estado oculto codificado para predecir la siguiente palabra en la secuencia.
Dependencias:
python=3.7torch>=1.0.0nltkmatplotlibtensorboardX Instale todas las depedencias y ejecute python main.py
Los conjuntos de datos se descargarán y preprocesarán automáticamente.
Múltiples opciones para ejecutar son posibles ejecutar python main.py --help para la lista completa.
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)
| Modelo | Número de parámetros | Perplejidad de validación | Examen de la prueba |
|---|---|---|---|
| LSTM BASED (Merity et al., 2017) | 7.86m | 66.77 | 64.96 |
| Attentive LM (Salton et al. 2017) | 7.06m | 79.09 | 76.56 |
| Posicional atento LM | 6.9m | 72.69 | 70.92 |
| Modelo | Número de parámetros | Perplejidad de validación | Examen de la prueba |
|---|---|---|---|
| LSTM BASED (Merity et al., 2017) | 7.86m | 72.43 | 68.50 |
| Attentive LM (Salton et al. 2017) | 7.06m | 78.43 | 74.37 |
| Posicional atento LM | 6.9m | 74.39 | 70.73 |
Puede volver a ejecutar todos los modelos que generaron las tablas de arriba simplemente ejecutando:
python test.py
Sin embargo, tenga en cuenta que algunos de estos modelos toman más de 8 horas para converger en un solo 1080 GPU, por lo que el tiempo de ejecución total del experimento podría ser de aproximadamente 2 días.
El soporte multi-GPU está deshabilitado de forma predeterminada, ya que se demostró que tiene un impacto negativo en los resultados. Además de eso, ya que los lotes son pequeños en la práctica, en realidad no es mucho más rápido, ya que se dedica mucho tiempo enviando los tensores a las GPU respectivas.
Aquí se muestran a la lado de las comparaciones laterales de las dos distribuciones de atención en un ejemplo:
Las palabras en el eje x son las entradas en cada paso de tiempo y las palabras en el eje y son los objetivos. Ambos modelos fueron entrenados en el conjunto de datos Wikitext-02 hasta la convergencia.