Нейронный машинный перевод с применением GPU. Вводный курс. Часть 3

Автор оригинальной публикации: Киунхьюн Чо (Kyunghyun Cho)

В предыдущей статье мы рассмотрели простую модель для машинного перевода типа кодер-декодер (encoder-decoder model). Эта модель превосходно переводит с английского на французский. В то же время она имеет свой недостаток, о котором мы поговорим в этой статье. Также я расскажу вам, как с помощью механизма внимания (attention mechanism) можно преодолеть этот недостаток и значительно повысить качество перевода.

Затем я познакомлю вас с некоторыми недавно опубликованными работами, в которых нейронный машинный перевод (НМП, neural machine translation, NMT) выходит за границы перевода текста и применяется для создания описаний к изображениям и видеоматериалам. 

Недостаток простой архитектуры кодер-декодер

В рамках архитектуры кодер-декодер кодер формирует из исходного предложения вектор фиксированного размера, на основе которого декодер должен сгенерировать перевод. Другими словами, этот вектор фиксированного размера, называемый контекстным вектором (context vector), должен содержать каждую деталь исходного предложения. Интуитивно мы понимаем, что реальная функция, аппроксимированная кодером, должна быть очень нелинейной и сложной. Кроме того, размерность контекстного вектора должна быть достаточно большой, чтобы вместить предложение произвольной длины.

В работе под названием «О свойствах нейронного машинного перевода. Архитектура кодер-декодер и соответствующие подходы» («On the Properties of Neural Machine Translation: EncoderDecoder Approaches»), представленной на семинаре SSST-8 [ссылка], мной и моими соавторами эмпирически было подтверждено, что при увеличении длины исходного предложения качество перевода существенно снижается, если модель кодер-декодер имеет малый размер. Учитывая значительно лучшие результаты, полученные в работе [Sutskever et al., 2014] при использовании той же архитектуры кодер-декодер, можно сделать вывод о том, что для успешной обработки длинных предложений репрезентативная сила кодера должна быть большой, а это, как правило, означает, что и модель также должна быть большой (см. рис. 1).

Рисунок 1. Значительное снижение эффективности с увеличением длины предложения при малом размере модели кодер-декодер.

Рисунок 1. Значительное снижение эффективности с увеличением длины предложения при малом размере модели кодер-декодер.

Безусловно, более крупная модель предполагает более высокие требования к вычислительным ресурсам. Применение передовых графических процессоров (GPU), таких как NVIDIA Titan X, позволяет решить проблему относительно вычислений, но не относительно памяти (как минимум, пока). Объем оперативной памяти обычно составляет несколько гигабайтов, и это накладывает серьезные ограничения на размер модели. (Эту проблему можно решить, распределенно выполняя модель на нескольких GPU, как показано в работе [Sutskever et al., 2014]. Но в нашем случае давайте предположим, что мы имеем доступ только к одной машине с одни GPU по причине ограничений относительно пространства, электропитания и т.д.)

В итоге перед нами стоит следующий вопрос: «Можем ли мы повысить эффективность простой модели кодер-декодер?»

Механизм внимания для НМП

Самый серьезный недостаток простой архитектуры кодер-декодер заключается в том, что предложение произвольной длины должно быть сжато в вектор фиксированного размера. Этот подход кажется довольно странным, учитывая то, как компьютеры обычно решают задачу сжатия. Когда вы сжимаете файл с помощью архиватора, размер результирующего файла примерно пропорционален размеру исходного файла. (Это не совсем верно: размер сжатого файла пропорционален количеству информации в исходном файле, а не его размеру. Тем не менее давайте предположим, что размер исходного файла достаточно точно соответствует количеству информации в нем.)

Продолжая аналогию с компьютерами, давайте хранить все предложение не в форме вектора фиксированного размера, а в форме памяти, содержащей количество банков равное количеству исходных слов. Это реализуется с помощью двунаправленной рекуррентной нейронной сети (ДРНС, bidirectional recurrent neural network, BiRNN), состоящей из прямой РНС (forward RNN) и обратной РНС (backward RNN). Как и следует из их названий, прямая и обратная РНС считывают исходное предложение в прямом и обратном направлении соответственно.

Теперь давайте обозначим скрытые состояния прямой и обратной РНС, как и соответственно. Как уже было отмечено в первой статье, РНС обобщает последовательность, считывая по одному элементу за раз. Это означает, что прямой РНС обобщает исходное предложение до j-го слова, начиная с первого слова, а обратной РНС – до j-го слова, начиная с последнего слова. То есть и вместе обобщают все входное предложение (см. рис. 2).

Рисунок 2. Применение двунаправленной рекуррентной нейронной сети для кодирования исходного предложения.

Рисунок 2. Применение двунаправленной рекуррентной нейронной сети для кодирования исходного предложения.

Однако обобщение на позиции каждого слова не является идеальным обобщением всего входного предложения. Из-за своей последовательной природы РНС лучше помнит последние слова. То есть, чем дальше входное слово находится от j, тем менее вероятно, что скрытое состояние РНС ( или ) хорошо его помнит. Аннотационный вектор (annotation vector), являющийся объединением (concatenation) и , наилучшим образом представляет текущее слово wj.

Безусловно, это не общепринятое соглашение, но лично я по этой причине рассматриваю аннотационный вектор, как контекстно-зависимое представление слова (context-dependent word representation). Более того, мы можем трактовать набор контекстно-зависимых представлений, как механизм, с помощью которого мы сохраняем исходное предложение в виде представления переменной длины, в отличие от обобщения фиксированной длины в простой модели кодер-декодер.

При наличии представления переменной длины исходного предложения декодер должен иметь возможность избирательно фокусироваться на одном или нескольких контекстно-зависимых представлениях слов (аннотационных векторах) для каждого целевого слова. Так на каком же аннотационном векторе должен фокусироваться декодер в каждый момент времени?

Представьте, что вы переводите некоторое исходное предложение, уже написали i-1 первых целевых слов (y1, y2, …, yi-1) и собираетесь написать iе целевое слово. В таком случае, как вы определите, какое исходное слово (слова) следует сейчас перевести?

Обычно переводчик смотрит на каждое исходное слово xj (в случае алгоритма – это контекстно-зависимое представление hj), рассматривает его совместно с уже переведенными словами (y1, y2, …, yi-1) и решает, было ли исходное слово xj уже переведено (это эквивалентно тому, насколько релевантно или нерелевантно исходное слово xj каждому целевому слову). Этот процесс повторяется для каждого слова в исходном предложении.

Рисунок 3. Механизм внимания сопоставляет уже переведенные слова и одно из исходных слов.

Рисунок 3. Механизм внимания сопоставляет уже переведенные слова и одно из исходных слов.

Дмитрий Багданов (Dzmitry Bahdanau), Йошуа Бенджио (Yoshua Bengio) и я летом 2014 года предложили включить в декодер небольшую нейронную сеть, реализующую процесс аналогичный описанному выше. Эта небольшая нейронная сеть, которую мы называем механизмом внимания (обозначена фиолетовым цветом на рисунке 3), принимает на входе предыдущее скрытое состояние декодера zi-1 (то есть то, что уже было переведено) и одно из контекстно-зависимых представлений исходных слов hj. Механизм внимания реализован в виде нейронной сети с одним скрытым слоем и одним скалярным выходом , как показано на рисунке 4. Процесс повторяется для каждого исходного слова.

Рисунок 4. Механизм внимания возвращает одно скалярное значение, являющееся оценкой релевантности j-го исходного слова.

Рисунок 4. Механизм внимания возвращает одно скалярное значение, являющееся оценкой релевантности j-го исходного слова.

После того, как мы рассчитали оценки релевантности для каждого исходного слова, необходимо произвести такое преобразование, чтобы сумма оценок равнялась единице (см. рис. 5). Это легко можно сделать с помощью софтмакс-нормализации (softmax normalization) следующим образом:

latex

Почему нам необходим подобный тип нормализации? Можно назвать массу причин, но самая важная из них заключается в том, что это дает нам возможность интерпретировать оценки, присвоенные механизмом внимания, как вероятности. С точки зрения вероятности, мы можем рассматривать вес внимания (attention weight) αj, как вероятность того, что декодер выберет j контекстно-зависимое представление исходного слова из всех T исходных слов. Затем мы можем вычислить ожидаемое контекстно-зависимое представление слова в рамках данного распределения (заданного весами внимания αj) следующим образом:

latex (1)

Ожидаемый вектор ci обобщает информацию обо всем исходном предложении, но с разным акцентом на разных позициях/словах исходного предложения. Любой аннотационный вектор (контекстно-зависимый вектор), который механизм внимания «считает» релевантным (то есть вектор с большим весом внимания), будет иметь лучшее представление, чем векторы с малыми весами внимания.

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

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

Когда вектор ci вычислен, далее все происходит так же, как описано в разделе «Декодер» предыдущей статьи, за исключением того, что на каждом шаге i вместо hT мы используем ci.

Какие преимущества дает нам механизм внимания?

Механизм внимание недавно стал одной из самых «горячих» тем в области глубокого обучения (deep learning) [Cho et al., 2015]. Было бы очень интересно поговорить о преимуществах механизма внимания, а также о том, как эта технология может помочь нам добиться новых успехов в глубоком обучении, но для такой цели не хватит обычной статьи. Вместо этого посмотрите на рисунок 6, где проиллюстрирован пример внимания (соответствия), которому модель обучается без учителя. (Замечание. Хотя под термином «обучение с незначительным привлечением учителя» (weakly supervised learning) часто понимают обучение с подкреплением (reinforcement learning), я отношу нашу модель также к обучению с незначительным привлечением учителя. За исключением итогового целевого перевода, здесь не было ни малейшего участия учителя относительно внутреннего соответствия/внимания). 

Рисунок 6. Примеры переводов, выполненных НМП-моделью с механизмом внимания. Толщина линии соответствует весу внимания, вычисленному механизмом внимания.

Рисунок 6. Примеры переводов, выполненных НМП-моделью с механизмом внимания. Толщина линии соответствует весу внимания, вычисленному механизмом внимания.

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

Да, и при том очень существенно! В частности, мы выяснили [Bahdanau et al., 2015], что при использовании механизма внимания качество перевода не снижается при увеличении длины предложения, даже если размер модели не изменяется (см. рис. 7).

Рисунок 7. RNNsearch-50 (РНС-поиск-50) – НМП-модель с механизмом внимания, обученная на парах предложений длиной до 50 слов.

Рисунок 7. RNNsearch-50 (РНС-поиск-50) – НМП-модель с механизмом внимания, обученная на парах предложений длиной до 50 слов.

Описанная концепция может показаться достаточно сложной в реализации. Но здесь нам снова поможет Theano! Просто реализуйте проход в прямом направлении (см. пример кода здесь), а затем используйте theano.tensor.grad.

Нейронные машины Тьюринга и сети с памятью

Читатель Zzzz написал такой комментарий к моей предыдущей статье:

Пробовали ли вы использовать для подобных целей нейронную машину Тьюринга (НМТ, neural Turing machine, NTM) или сети с памятью (memory network)? Или для таких моделей требуются намного более крупные обучающие наборы данных?

Я собирался ответить раньше, но решил подождать публикации этой статьи. Почему? Потому что нейронную машину Тьюринга и сети с памятью можно рассматривать как варианты или расширения описанной выше НМП-модели с механизмом внимания. Можно считать, что набор контекстно-зависимых представлений слов hj – это содержимое в памяти, механизм внимания – головка считывания-записи (head) НМТ, а декодер – контроллер (controller) НМТ. Эти элементы очень похожи!

На самом деле, если прочитать последнюю публикацию по теме сетей с памятью [Sukhbaatar et al., 2015], становится очевидно, что нейронный машинный перевод с механизмом внимания, нейронная машина Тьюринга и сети с памятью примерно эквивалентны за исключением некоторых деталей и своего назначения. Мне, как, вероятно, и вам, очень интересно, каким будет итоговое обобщение всех этих подходов, и каких успехов в будущем позволит нам добиться результирующая модель.

За пределами перевода. Создание описаний для изображений и видеоматериалов

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

В недавно опубликованной работе ученые из Монреальского и Торонтского университетов показали, что путем замены кодера на сверточную нейронную сеть (convolutional neural network) можно создать модель типа кодер-декодер с механизмом внимания, которая способна генерировать описания к изображениям (см. рис. 8). Аналогичные подходы были предложены также и в других работах [Donahue et al., 2014; Fang et al., 2014; Karpathy and Li, 2014; Kiros et al., 2014; Mao et al., 2014].

Рисунок 8. Генерация описания к изображению с помощью механизма внимания.

Рисунок 8. Генерация описания к изображению с помощью механизма внимания.

В одной из недавних работ [Li et al., 2015] был сделан шаг еще дальше: подход на основе механизма внимания был применен для создания описаний к видеоматериалам (см. рис. 9). Чтобы решить эту задачу, декодеру была дана возможность использовать временные структуры (temporal structure) видеоряда. Подобные подходы были недавно предложены также и в других работах [Venugopalan et al., 2015].

Рисунок 9. Применение механизма временного внимания (temporal attention) для генерации описания к видеоряду. Источник: [Li et al., 2015].

Рисунок 9. Применение механизма временного внимания (temporal attention) для генерации описания к видеоряду. Источник: [Li et al., 2015].

Более того, подход, основанный на внедрении механизм внимания для получения отображения структурированного входа на структурированный выход, в настоящее время находит очень широкое применение. Одним из самых интересных, на мой взгляд, является приложение в области дискретного программирования (discrete optimization) [Vinyals et al., 2015], в рамках которого нейронная сеть с механизмом внимания была использована для (приближенного) решения задачи коммивояжера (travelling salesperson problem)! 

Что же дальше?

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

  • За пределами моделирования предложений. Предложения, представленные в виде последовательности слов, являются очень короткими. Выполнение алгоритма обратного распространения ошибки (backpropagation) для РНС требует количество времени пропорциональное длине последовательности. Возможно ли создать другой алгоритм, более подходящий для обработки последовательностей значительно большей длины, таких как абзацы и документы? Обучение, вероятно, должно быть локальным, а веса должны обновляться онлайн в процессе обработки последовательности.

  • За пределами естественного языка. НМП работает в сфере лингвистики, но где еще может быть задействован этот подход? Вероятно, он может быть применен для прогнозирования структуры белка, для работы с последовательностями экспрессии генов, графами, социальными сетями или данными о погоде.

  • Мультимодальное обучение (multimodal learning). Можем ли мы использовать другие источники информации для перевода? Каким является естественный способ объединения нескольких источников информации?

Где можно найти код?

До настоящего момента мы не обсуждали практическую реализацию. Тем не менее? наша группа из Монреальского университета активно открывает публичный доступ к своему коду, так как мы верим, что открытый исходный код ускоряет научно-технический прогресс, благодаря тому, что каждый может легко его модифицировать и применять.

Нашим наиболее важным проектом за последнее время является Theano. Theano – это инструмент, позволяющий в символьном виде создавать произвольные нейронные сети с помощью Python. Theano абстрагирует вычислительную архитектуру, благодаря чему один и тот же код может быть выполнен как на CPU, так и на GPU. Кроме того, данная библиотека реализует символьное дифференцирование, играющее ключевую роль при обучении нейронных сетей. Благодаря этому появляется возможность быстро создавать прототипы сложных нейронных сетей (таких как НМП-модель с механизмом внимания, описанная в этой статье). Тем не менее Theano предоставляет только базовые примитивы, и пользователь должен самостоятельно собрать из них нейронную сеть, что является достаточно нетривиальной задачей.

Также мы [Razvan Pascanu, Caglar Gulcehre, Kyunghyun Cho, Dzmitry Bahdanau, Bart van Merrienboer] презентовали фреймворк GroundHog, реализующий все необходимые компоненты для создания НМП-модели. К сожалению, этот проект был разработан довольно поспешно, в результате чего код плохо читается. Затем был подготовлен [Orhan Firat, Dzmitry Bahdanau, Bart van Merrienboer] демонстрационный скрипт для создания, обучения и применения НМП-моделей на основе недавно представленного фреймворка под названием Blocks. Однако пока он должен рассматриваться только в качестве примера.

В октябре 2015 года в Городском университете Дублина я буду читать лекцию по нейронному машинному переводу в рамках семинара DL4MT Winter School. Чтобы сделать семинар более практически полезным, сейчас я готовлю сокращенную реализации НМП на основе Theano. Код опубликован под названием dl4mt-material и по-прежнему находится в стадии активной разработки. Вы можете найти его здесь.

В настоящий момент, код размещен в трех подкаталогах: session0, session1 и session2. Подкаталог session0 содержит реализацию языковой модели на основе РНС с применением управляемых рекуррентных нейронов (gated recurrent unit). Подкаталог session1 содержит реализацию простой НМП-модели. А в подкаталоге session2 вы можете найти реализацию НМП-модели с механизмом внимания, которую мы рассмотрели в этой статье. 

Хочу сказать вам еще одну вещь, прежде чем я завершу этот раздел и всю серию статей. Позвольте мне еще раз напомнить: всегда обучайте рассмотренные нами модели на GPU! Чтобы хорошо обучить модель, необходимо от 3-х до 12-ти суток при использовании GPU GeForce GTX Titan X. А при использовании CPU я даже не могу представить, сколько может потребоваться времени. Безусловно, вы можете создать кластер такого масштаба, как у Google, и применять распределенный алгоритм оптимизации, но это, наверное, не самый экономичный вариант (если вы не Microsoft, Facebook или IBM).

По материалам: Nvidia

Перевод Станислава Петренко

Добавить комментарий

Ваш e-mail не будет опубликован.

закрыть

Поделиться

Отправить на почту
закрыть

Вход

закрыть

Регистрация

+ =