Часть 1 из двух статей, посвященных механизму внимания в системах нейронного машинного перевода.

Это первая публикация в серии из двух сообщений в блоге, посвященных механизму внимания в системах перевода нейронных машин.

Часть 1: Базовый механизм внимания (этот пост)

Часть 2: Глобальное и местное внимание

NMT (нейронный машинный перевод) приобрел большую популярность в последние несколько лет. В большинстве систем NMT используется архитектура кодировщика-декодера с механизмом внимания. Давайте начнем с краткого руководства по архитектуре кодер-декодер.

Кодер-декодер

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

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

Что касается NMT, сети кодировщика и декодера обычно состоят из некоторых блоков стробированных RNN. Использование RNN интуитивно понятно, потому что и вход, и целевой выход являются текстовыми данными. (Это не всегда так. В третьей части этой серии статей мы увидим, что NMT можно выполнять даже без RNN.)

В типичной архитектуре кодера-декодера NMT кодер кодирует входную последовательность переменной длины в векторное представление фиксированной длины. Декодер декодирует этот вектор для генерации вывода. См. Рисунок выше.

Вот как это будет выглядеть с точки зрения псевдокода. Предположим, что x1, x2, x3,…, xN - это входные данные, а h - представление вектора фиксированной длины (красный прямоугольник на рисунке выше), закодированное кодировщиком. Потом,

h = Кодировщик (x1, x2, x3,…, xN)

final_output = Декодер (h, decoder_input, decoder_output_from_prev_states)

Если вы хотите вникнуть в подробности этого, обратитесь к Руководству по Tensorflow seq2seq.

Внимание

В 2016, Bahdanau et al. заметил, что

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

- https://arxiv.org/pdf/1409.0473.pdf

Чтобы обойти эту проблему, они придумали идею механизма внимания. Проще говоря, этот механизм помогает нейронной сети уделять больше внимания определенным частям входных данных (а не всему входу) при генерации выходных данных.

Возьмем пример. Допустим, мы хотим перевести предложение Hoy es un día realmente maravilloso с испанского на английский. Как люди, мы не всегда обращаем внимание на каждое слово во вводе. Мы обрабатываем его фраза за фразой, чтобы получить результат. * Вот как мы можем перевести это предложение как люди. Мы знаем, что Hoy = today, es = is, un día = a day, realmente = really, maravilloso = wonderful. Таким образом, мы сделали перевод Today is a wonderful day. По сути, мы уделяли больше внимания определенным словам в исходном предложении, генерируя разные слова на выходе.

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

В статье Bahdanau и др. Нейронный машинный перевод путем совместного обучения выравниванию и трансляции рассказывается о том, как мы можем сделать что-то подобное с NN. Давайте углубимся в эту статью.

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

Давайте модифицируем псевдокод, который мы написали выше. Для простоты мы ограничимся тремя входными словами: x1, x2, x3. И давайте представим скрытые состояния каждой единицы RNN кодировщика как h1, h2, h3. Потом,

h1, h2, h3 = Кодировщик (x1, x2, x3)

Чтобы узнать, сколько внимания следует уделять каждому входному слову, авторы предлагают использовать нейронную сеть прямого распространения (FNN). Входом в эту FNN будут скрытые состояния кодировщика, а также выходы декодера. Опять же, для упрощения, пусть H будет вектором всех скрытых состояний (‹h1, h2, h3›), а S представляет вывод из декодер. Итак, первый слой FNN будет

функция_активации (W1 * H + W2 * S)

где W1 и W2 - весовые матрицы, которые будут изучены. Предлагаемая функция активации - tanh. Таким образом, приведенная выше строка кода становится

tanh (W1 * H + W2 * S)

Теперь мы можем применить softmax к этому, чтобы определить веса внимания для каждого слова.

Внимание_вес = softmax (V * tanh (W1 * H + W2 * S))

Это так просто.

Использование весов внимания

Теперь, когда мы знаем, как определять веса внимания, давайте посмотрим, как их использовать.

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

Код

Если вы хотите реализовать это самостоятельно, у Tensorflow есть хороший учебник здесь.

Вывод

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

В заключение хочу дословно процитировать авторов.

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

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

Ссылки:

  1. Https://arxiv.org/pdf/1409.0473.pdf
  2. Https://machinelearningmaster.com/how-does-attention-work-in-encoder-decoder-recurrent-neural-networks/
  3. Https://github.com/tensorflow/tensorflow/blob/r1.11/tensorflow/contrib/eager/python/examples/nmt_with_attention/nmt_with_attention.ipynb