Моделювання послідовності в послідовність за допомогою nn.Transformer та TorchText¶

Це навчальний посібник з підготовки моделі послідовності до послідовності, яка використовує модуль nn.Transformer.

Випуск PyTorch 1.2 включає стандартний трансформаторний модуль на основі паперу Увага - все, що вам потрібно. Доведено, що модель трансформатора перевершує якість для багатьох проблем послідовності до послідовності, хоча є більш паралельною. Модуль nn.Transformer повністю покладається на механізм уваги (ще один модуль, нещодавно реалізований як nn.MultiheadAttention) для отримання глобальних залежностей між входом і виходом. Модуль nn.Transformer тепер високомодульований, так що один компонент (як nn.TransformerEncoder у цьому посібнику) може бути легко адаптований/складений.

послідовно-послідовне

Визначте модель¶

У цьому навчальному посібнику ми навчаємо модель nn.TransformerEncoder щодо завдання моделювання мови. Завдання моделювання мови полягає у призначенні ймовірності того, що дане слово (або послідовність слів) слідує за послідовністю слів. Послідовність лексем передається спочатку шару вбудовування, а потім позиційному шару кодування для обліку порядку слова (докладніше див. У наступному абзаці). Nn.TransformerEncoder складається з декількох шарів nn.TransformerEncoderLayer. Поряд із вхідною послідовністю потрібна квадратна маска уваги, оскільки шари самоорієнтації в nn.TransformerEncoder мають право відвідувати лише попередні позиції в послідовності. Для завдання моделювання мови будь-які маркери на майбутніх позиціях повинні маскуватися. Щоб мати фактичні слова, вихідні дані моделі nn.TransformerEncoder надсилаються на кінцевий лінійний рівень, за яким слідує функція log-Softmax.

Модуль PositionalEncoding вводить деяку інформацію про відносне або абсолютне положення токенів у послідовності. Позиційне кодування має той самий розмір, що і вбудовування, щоб їх можна було підсумувати. Тут ми використовуємо синусоїду та косинус функції різних частот.

Завантаження та пакетні дані¶

Цей підручник використовує torchtext для створення набору даних Wikitext-2. Об'єкт vocab будується на основі набору даних про поїзд і використовується для нумерації маркерів на тензори. Починаючи з послідовних даних, функція batchify () впорядковує набір даних по стовпцях, обрізаючи всі маркери, що залишилися після поділу даних на партії розміром batch_size. Наприклад, маючи алфавіт як послідовність (загальна довжина 26) та розмір партії 4, ми розділимо алфавіт на 4 послідовності довжиною 6:

Ці стовпці розглядаються моделлю як незалежні, а це означає, що залежність G і F неможливо вивчити, але дозволяє більш ефективно обробляти партію.

Функції для створення вхідної та цільової послідовностей¶

Функція get_batch () генерує вхідну та цільову послідовності для моделі трансформатора. Він поділяє вихідні дані на шматки довжиною bptt. Для завдання моделювання мови модель потребує наступних слів як Target. Наприклад, зі значенням bptt 2 ми отримаємо наступні дві змінні для i = 0:

Слід зазначити, що шматки знаходяться вздовж розмірності 0, що відповідає розміру S у моделі Трансформатор. Розмір партії N знаходиться вздовж розміру 1.

Ініціювати екземпляр¶

Модель налаштована за допомогою гіперпараметра нижче. Розмір vocab дорівнює довжині об'єкта vocab.

Запустити модель¶

CrossEntropyLoss застосовується для відстеження втрат, а SGD реалізує метод стохастичного градієнтного спуску як оптимізатор. Початкова швидкість навчання встановлена ​​на 5,0. StepLR застосовується для регулювання швидкості навчання через епохи. Під час тренування ми використовуємо функцію nn.utils.clip_grad_norm_, щоб масштабувати весь градієнт, щоб запобігти вибуху.

Петля над епохами. Збережіть модель, якщо втрата під час перевірки є найкращою з усіх, що ми бачили на сьогодні. Налаштуйте швидкість навчання після кожної епохи.