Главная » Хабрахабр » [Перевод] Модели Sequence-to-Sequence Ч.1

[Перевод] Модели Sequence-to-Sequence Ч.1

Всем добрый день!

Ну и как обычно интересные открытые уроки и подборки интересных материалов. И у нас снова открыт новый поток на доработанный курс «Data scientist»: ещё один отличный преподаватель, чуть доработанная исходя из обновлений программа. Сегодня мы начнём разбор seq2seq моделей от Tensor Flow.

Поехали.

И возникает интересный вопрос: возможно ли обучение сети на определенных данных для генерации осмысленного ответа? Как уже обсуждалось в туториале RNN (рекомендуем ознакомиться с ним перед чтением этой статьи), рекуррентные нейронные сети можно научить моделировать язык. Оказывается, что можем. Например, можем ли мы научить нейронную сеть переводить с английского языка на французский?

Скопируйте основной репозиторий Tensor Flow и репозиторий моделей TensorFlow с GitHub. Это руководство покажет вам, как создать и обучить такую систему end-to-end. Затем, можно начать с запуска программы перевода:

cd models/tutorials/rnn/translate
python translate.py --data_dir [your_data_directory]

Для этого потребуется около 20гб на жестком диске и довольно много времени на загрузку и подготовку, поэтому вы можете запустить процесс уже сейчас и продолжить читать этот туториал. Она загрузит данные для перевода с английского на французский с сайта WMT’15, подготовит их для обучения и обучит.

Руководство будет обращаться к следующим файлам:

Файл

Что в нем находится?

tensorflow/tensorflow/python/ops/seq2seq.py

Библиотека для создания sequence-to-sequence моделей

models/tutorials/rnn/translate/seq2seq_model.py

Sequence-to-sequence модели нейронного перевода

models/tutorials/rnn/translate/data_utils.py

Вспомогательные функции для подготовки данных перевода

models/tutorials/rnn/translate/translate.py

Бинарник, который обучает и запускает модель перевода

Основы sequence-to-sequence

Базовая архитектура изображена ниже: Базовая sequence-to-sequence модель, как было представлено Cho et al., 2014 (pdf), состоит из двух рекуррентных нейронных сетей (RNN): encoder (кодер), которая обрабатывает входные данные, и decoder (декодер), которая генерирует данные вывода.

Кодеры и декодеры могут иметь общие веса или же, чаще, использовать разные наборы параметров. Каждый прямоугольник на картинке выше представляет собой клетку в RNN, обычно клетку GRU — управляемого рекуррентного блока, или клетку LSTM — долгой краткосрочной памяти, (прочтите туториал RNN, чтобы узнать о них подробнее). Многослойные клетки успешно используются в sequence-to-sequence моделях, например, для перевода Sutskever et al., 2014 (pdf).

Чтобы дать декодеру более прямой доступ к данным ввода, в Bahdanau et al., 2014 (pdf) был представлен механизм внимания. В базовой модели, описанной выше, каждый ввод должен быть закодирован в вектор состояния фиксированного размера, так как это единственное, что передается декодеру. Многослойная sequence-to-sequence сеть с LSTM клетками и механизмом внимания в декодере выглядит следующим образом: Мы не будем вдаваться в подробности механизма внимания (для этого можно ознакомиться с работой по ссылке); достаточно сказать, что он позволяет декодеру заглядывать в данные ввода на каждом шаге декодирования.

Библиотека TensorFlow seq2seq

Все они могут использовать разные клетки RNN, но все они принимают данные ввода кодера и данные ввода декодера. Как можно увидеть выше, существуют разные модели sequence-to-sequence. Эта базовая, RNN, кодер-декодер, sequence-to-sequence модель работает следующим образом. Это лежит в основе интерфейса библиотеки TensorFlow seq2seq (tensorflow/tensorflow/python/ops/seq2seq.py).

outputs, states = basic_rnn_seq2seq(encoder_inputs, decoder_inputs, cell)

В вызове, указанном выше, encoder_inputs является списком тензоров, представляющих данные ввода кодера, соответствуя буквам A, B, C с картинки выше. Аналогично, decoder_inputs — тензоры, представляющие данные ввода декодера. GO, W, X, Y, Z с первой картинки.

RNNCell, который определяет, какая клетка будет использоваться в модели. Аргумент cell — инстанс класса tf.contrib.rnn. Кроме того, tf.contrib.rnn предоставляет оболочки для создания многослойных клеток, добавления исключений данным ввода и вывода клетки, или иных трансформаций. Можно использовать существующие клетки, например, GRUCell или LSTMCell, а можно написать свою. Почитайте RNN Tutorial, для ознакомления с примерами.

Они оба представляют собой список тензоров той же длины, что и decoder_inputs. Вызов basic_rnn_seq2seq возвращает два аргумента: outputs и states. Возвращаемый states представляет внутреннее состояние декодера на каждом временном шаге. outputs соответствует данным вывода декодера на каждом временном шаге, на первой картинке это W, X, Y, Z, EOS.

При тестировании, во время декодирования последовательности, именно так конструируется новая. Во многих приложениях, использующих sequence-to-sequence модели, вывод декодера в момент t передается обратно на ввод декодеру в момент t+1. Функции в seq2seq.py поддерживают оба режима с помощью аргумента feed_previous. С другой стороны, при обучении принято передавать декодеру правильные данные ввода в каждый временной шаг, даже если декодер ранее ошибся. Например, проанализируем следующее использование вложенной RNN модели.

outputs, states = embedding_rnn_seq2seq( encoder_inputs, decoder_inputs, cell, num_encoder_symbols, num_decoder_symbols, embedding_size, output_projection=None, feed_previous=False)

В модели embedding_rnn_seq2seq все данные ввода (как encoder_inputs, так и decoder_inputs) являются целочисленными тензорами, отражающими дискретные значения. Они будут вложены в плотное представление (за подробностями по вложению обратитесь к Руководству по Векторным Представлениям), но для создания этих вложений нужно уточнить максимальное количество дискретных символов: num_encoder_symbols на стороне кодера и num_decoder_symbols на стороне декодера.

Это значит, что декодер будет использовать тензоры decoder_inputs в том виде, в котором они предоставляются. В вызове выше мы задаем feed_previous значение False. Все прочие тензоры из списка будут проигнорированы, и взамен будет использоваться предыдущее значение вывода декодера. Если мы зададим feed_previous значение True, декодер будет использовать только первый элемент decoder_inputs. Примерно как у Bengio et al., 2015 (pdf). Это применяется для декодирования переводов в нашей модели перевода, но также может использоваться во время обучения, для улучшения устойчивости модели к своим ошибкам.

Без уточнений выводы вложенной модели будут тензорами формы количество обучающих образцов на num_decoder_symbols, так как они представляют логиты каждого сгенерированного символа. Еще один важный аргумент, использованный выше, — output_projection. Вместо этого, лучше возвращать тензоры меньших размеров, которые впоследствии будут спроецированы на большой тензор с помощью output_projection. При тренировке моделей с большими словарями на выходе, например с большим num_decoder_symbols, хранить эти крупные тензоры становится непрактичным. al., 2014 (pdf). Это позволяет использовать наши seq2seq модели c сэмплированными softmax потерями, как описано у Jean et.

Обратите на них внимание. В дополнении к basic_rnn_seq2seq и embedding_rnn_seq2seq в seq2seq.py существует еще несколько sequence-to-sequence моделей. Для нашей модели перевода ниже используем embedding_attention_seq2seq. Все они обладают схожим интерфейсом, поэтому не будем углубляться в их детали.

Продолжение последует.


Оставить комментарий

Ваш email нигде не будет показан
Обязательные для заполнения поля помечены *

*

x

Ещё Hi-Tech Интересное!

[Перевод] CG-моделинг 80 уровня: фотореалистичные персонажи real-time в Unreal

На днях тестировали новую графику в War Robots и получили уйму положительного фидбека от игроков. И хотя речь о мобильной графике, места для роста там очень много. С десктопом еще интереснее. Если раньше на рендер качественной сцены с фотореалистичными моделями ...

[Перевод] IntelliCode теперь и в TypeScript/JavaScript

На Build 2018 мы анонсировали Visual Studio IntelliCode: набор AI-инструментов, которые способствуют более качественной разработке. В сотрудничестве с командой IntelliCode мы рады сообщить, что теперь IntelliCode доступен пользователям TypeScript/JavaScript через расширение IntelliCode для VS Code. Что такое IntelliCode? IntelliCode дополняет ...