Это репо является реализацией внимательной модели RNN для задачи языкового моделирования.
Языковое моделирование выполняется как на наборах данных Penntreebank и Wikitext-02. Файлы проанализированы так, что каждый пример обучения состоит из одного предложения от корпуса, приготовленного до максимальной пакетной длины 35. Более длинные предложения обрезаны. Это делается для того, чтобы управлять вниманием и принять участие только к словам в предложении (до Timeestep T, если в TimeStep T).
A-RNN-LM (рецидивирующая нейронная сеть для языкового моделирования) была первоначально предложена в последовательном диалоге с языковыми моделями, основанными на внимании (Hongyuan Mei et al. 2016, Link) и в внимательных языковых моделях (Salton et al. 2017, Link).
Модель состоит из запуска традиционного механизма внимания на предыдущих скрытых состояниях слоя (ы) кодера RNN, чтобы кодировать контекстный вектор, который затем объединяется с последним закодированным скрытым состоянием, чтобы предсказать следующее слово в последовательности.
Зависимости:
python=3.7torch>=1.0.0nltkmatplotlibtensorboardX Установите все DepedEntes и запустите python main.py
Наборы данных будут загружены и предварительно обработаны автоматически.
Несколько вариантов для запуска возможны запустить python main.py --help для полного списка.
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)
| Модель | Количество параметров | Валидация недоумения | Тест недоумения |
|---|---|---|---|
| LSTM Baseline (Territy et al., 2017) | 7,86 м | 66.77 | 64,96 |
| Внимательный LM (Salton et al. 2017) | 7,06 м | 79,09 | 76.56 |
| Позиционная внимательная LM | 6,9 м | 72,69 | 70.92 |
| Модель | Количество параметров | Валидация недоумения | Тест недоумения |
|---|---|---|---|
| LSTM Baseline (Territy et al., 2017) | 7,86 м | 72.43 | 68.50 |
| Внимательный LM (Salton et al. 2017) | 7,06 м | 78.43 | 74.37 |
| Позиционная внимательная LM | 6,9 м | 74,39 | 70.73 |
Вы можете повторить все модели, которые сгенерировали таблицы выше, просто запустив:
python test.py
Однако, пожалуйста, обратите внимание, что некоторые из этих моделей занимают более 8 часов, чтобы сходиться на одном 1080 графическом процессоре, поэтому общее время выполнения эксперимента может составлять приблизительно 2 дня.
Поддержка с несколькими GPU отключена по умолчанию, так как было показано, что она оказывает негативное влияние на результаты. Кроме того, поскольку партия на практике невелики, на самом деле это не намного быстрее, так как много времени тратится на отправку тензоров в соответствующие графические процессоры.
Здесь показаны сравнительные сравнения двух распределений внимания на примере:
Слова в оси X-это входные данные на каждом шаге, а слова в оси Y являются целями. Обе модели были обучены набору данных Wikitext-02 до конвергенции.