В предыдущей статье я писал о переводе английских слов в катакану с использованием последовательного обучения в Tensorflow (Keras). В этой статье я опишу, как реализовать ту же модель в PyTorch.

Примечание. Этот пример написан на Python 3.7 и PyTorch 1.1.

Все данные и код доступны на Github.

Подготовка данных

Мы будем использовать набор данных японско-английских пар имен, аналогичный предыдущей статье о последовательности в TensorFlow. Подробнее о японской катакане и наборе данных можно прочитать здесь.

Нам также нужно будет применить такое же преобразование данных:

  • Создать словарь кодировки (символы для идентификаторов)
  • Кодировать или преобразовывать имена в последовательности идентификаторов
  • Кроме того, добавьте в конце символы PADDING (0), чтобы получились последовательности одинаковой длины.

Они уже реализованы как функции build_characters_encoding и transform в katakana/encoding.py

Последовательность-последовательность в PyTorch

Кодировщик

Мы реализуем кодировщик как модуль PyTorch. Кодировщик состоит из embedding (Встраивание) и lstm (LSTM). Модуль внедряет ввод с помощью внедрения, передает встроенный ввод в LSTM, затем вывод модуля является последним временным шагом вывода LSTM.

Примечание. Мы установили batch_first=True, чтобы LSTM Pytorch принимал входные данные с размерами (batch_size, sequnece_size, vector_size), аналогичными LSTM TensorFlow.

Декодер

Здесь мы также реализуем декодер как модуль PyTorch. Модуль состоит из embedding lstm и linear (Linear или Dense). Требуется два входа: decoder_input_sequence и encoder_output.

Подобно кодеру, декодер встраивает входную последовательность и передает внедренную последовательность в LSTM. Однако на этот раз мы инициализируем состояние LSTM с помощью выходных данных кодировщика. Затем вывод LSTM передается на линейный уровень для получения окончательного вывода.

Примечание. В отличие от версии TensorFlow, мы не применяем активацию Softmax к окончательному результату, чтобы упростить применение CrossEntropyLoss (см. «Обучение модели »). Применение Softmax также не изменит результат, если мы используем декодер для жадной генерации вывода (см. «Тестирование модели»).

Собираем их вместе

Наконец, мы объединяем кодировщик и декодер в модуль PyTorch для последовательного обучения.

Нам также необходимо подготовить обучающие данные, добавив к выводу символ START, чтобы сделать вход декодера.

Обучение модели

PyTorch не предоставляет готовых функций, подобных TensorFlow или Model.fit() Кераса.

Нам нужно реализовать обучающую функцию, которая перетасовывает обучающий набор данных и разбивает данные на пакеты.

Для каждой партии:

  • Инициализируйте оптимизатор, вызвав optimizer.zero_grad(), чтобы очистить весь градиент от предыдущей итерации.
  • Запустите модель для генерации выходных данных и вычислите loss путем сравнения ожидаемых и сгенерированных выходных данных с использованием определенных критериев (в данном случае CrossEntropyLoss)
  • Запустите loss.backward(), чтобы сгенерировать градиент в соответствии с потерями, и optimizer.step(), чтобы оптимизатор обновил модель.

Я обнаружил, что мы можем получить достаточно хорошую модель с оптимизатором Adam по умолчанию после 20–30 периодов обучения (около часа на CPU или нескольких минут на GPU).

Тестирование модели

Применение обученной модели PyTorch Sequence-to-Sequence для написания катаканы очень похоже на модель TensorFlow. Более подробное объяснение можно найти в статье.

Начиная с ввода кодера и ввода декодера только с одним символом START, мы продолжим заставлять модель генерировать следующий выходной символ, обновлять ввод декодера и использовать обновленный ввод декодера.

После тестирования модели с некоторыми английскими словами я смог воспроизвести результаты, аналогичные версии TensorFlow.

  • Джеймс: ジ ェ ー ム ズ
  • Джон: ジ ョ ン
  • Роберт: ロ ベ ル ト
  • Компьютер: コ ン プ タ ー (правильно, コ ン ピ ュ ー タ ー)
  • Такси: タ ク シ (правильно, タ ク シ ー)