Объяснение внимания в трансформерах [С точки зрения энкодера]

Объяснение внимания в трансформерах

Фото от Devin Avery на Unsplash

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

  • Что такое машинный перевод?
  • Потребность в внимании.
  • Как вычисляется внимание с использованием рекуррентных нейронных сетей (RNN)?
  • Что такое самовнимание и как оно вычисляется с использованием энкодера Трансформера?
  • Многоголовое внимание в энкодере.

Машинный перевод

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

Рисунок 1: Изображение предоставлено https://jalammar.github.io/visualizing-neural-machine-translation-mechanics-of-seq2seq-models-with-attention/

На рисунке 1 показан пример перевода с французского на английский. Модель состоит из двух частей: энкодера и декодера. Энкодер обрабатывает предложение по словам (технически – по токенам с точки зрения обработки естественного языка (NLP)). Энкодер создает контекст, который передается декодеру. Декодер затем постепенно создает выходные данные по одному слову за раз.

Рисунок 2: Изображение предоставлено https://jalammar.github.io/visualizing-neural-machine-translation-mechanics-of-seq2seq-models-with-attention/

Для дальнейшего пояснения на рисунке 2 энкодер создает скрытое состояние на каждом временном шаге, и последнее скрытое состояние (скрытое состояние #3) передается в качестве входных данных декодера.

Обработка предложения по словам может иметь негативные последствия, особенно при большой длине предложения. Последнее скрытое состояние предложения может не быть способным закодировать всю необходимую информацию, что может привести к забыванию начала предложения. Эта проблема хорошо известна для RNN. Были предложены различные способы преодоления этой проблемы (например, долгая краткосрочная память (LSTM)). Однако каждый из этих методов имеет свои плюсы и минусы. Внимание было предложено как способ решения этой проблемы (Бахданау и др.).

Что такое внимание?

Рисунок 3: Изображение предоставлено https://jalammar.github.io/visualizing-neural-machine-translation-mechanics-of-seq2seq-models-with-attention/

На рисунке 3 рассмотрим все три скрытых состояния, созданных энкодером. Вместо того, чтобы полагаться только на последнее скрытое состояние, декодер теперь имеет доступ ко всем скрытым состояниям, созданным энкодером. Декодер генерирует выходные данные по одному слову за раз, поэтому нам нужен механизм, который сообщает декодеру, какое скрытое состояние приоритетно использовать для создания выходных данных на каждом временном шаге. Например, для генерации первого слова “Je” наиболее важно скрытое состояние #1, для второго слова “suis” – скрытое состояние #2 и так далее.

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

Вышеуказанное предложение “Je suis etudiant” довольно простое с однозначным соответствием слов для входного и выходного предложений. В предложении ниже (рисунок 4) мы видим, что для слов “European Economic Area” соответствие слов из французского на английский язык обратно. В таких случаях внимание оказывается важным для изучения правильного соответствия слов из одного языка на другой.

Рисунок 4: Изображение предоставлено https://jalammar.github.io/visualizing-neural-machine-translation-mechanics-of-seq2seq-models-with-attention/

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

Примечание: веса внимания изменяются на каждом временном шаге.

Рисунок 5: Изображение предоставлено https://jalammar.github.io/visualizing-neural-machine-translation-mechanics-of-seq2seq-models-with-attention/

Самовнимание

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

Рисунок 6: Изображение предоставлено https://ai.googleblog.com/2017/08/transformer-novel-neural-network.html

Нам нужно знать, на что ссылается “it”. Это улица или животное? Это важно, особенно при переводе с английского на язык с грамматическим родом, например французский.

Самовнимание – это способ кодирования отношений между словами во входном предложении. В первом предложении в приведенном выше примере мы рассматриваем все слова в предложении и кодируем “it” таким образом, чтобы больший вес придавался либо животному, либо улице, чем другим словам.

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

Архитектура Transformer

Первый трансформатор был представлен в статье в 2017 году.

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

Рисунок 7: Архитектура Transformer (https://arxiv.org/abs/1706.03762)

Мы собираемся сосредоточиться на блоке Multi-Head Attention в Энкодере.

Для начала мы генерируем векторы для каждого слова (токена) в предложении с использованием модели word2vec. Модель принимает слово на вход и производит вектор, который представляет смысл слова. Векторы, сгенерированные моделью word2vec, обычно помещают похожие по смыслу слова ближе друг к другу в векторном пространстве, то есть слова “стул” и “стол” будут ближе друг к другу по сравнению, допустим, с “стулом” и “тигром”. Затем эти векторы подаются на вход модулю внимания.

Как вычисляется самовнимание? (Запрос, Ключ, Значение)

Ранее мы вычисляли внимание как простую взвешенную сумму скрытых состояний в РНС. Здесь мы собираемся вычислить самовнимание по-другому, с использованием Запроса, Ключа и Значения.

Это основано на концепции баз данных, где у вас есть таблица поиска, состоящая из ключа и соответствующего значения. Когда кто-то запрашивает базу данных, вы сопоставляете запрос с ключом и получаете некоторое значение на основе совпадения. Рассмотрим небольшую базу данных (см. Таблицу 1 ниже) с тремя ключами: Apple, banana, chair, и значением, связанным с каждым ключом (10, 5, 2).

Таблица 1: https://jaykmody.com/blog/attention-intuition/

Если у нас есть запрос = apple, то мы получаем выходное значение 10. Но если у нас есть запрос = fruit, что мы делаем? Если мы посмотрим на таблицу, ключ “fruit” не существует. Мы либо выбрасываем ошибку, либо делаем что-то умнее. Можем ли мы связать фрукт с другими ключами в наборе данных? Слово “фрукт” связано каким-то образом с яблоком и бананом и не связано с стулом. Допустим, фрукт связан (0,6) раза с яблоком, (0,4) раза с бананом и (0,0) раза с стулом. Это в основном ваши значения внимания. Таким образом, если у нас сейчас запрос = fruit, мы получаем выходное значение 0,6 * 10 + 0,4 * 5 + 0,0 * 2 = 8.

Но как мы вычисляем значения внимания? Давайте начнем с представления нашего запроса в виде 4D-вектора.

Аналогично, мы также представляем ключи (яблоко, банан, стул) с помощью матрицы, используя соответствующие векторные значения.

Оценки внимания могут быть вычислены следующим образом

Теперь давайте немного глубже рассмотрим, как это реализовано в энкодере.

Давайте начнем с простого предложения, “Думающие машины”. Сначала мы генерируем векторы фиксированной длины для каждого из этих слов;

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

Мы также можем представить входные данные в виде матрицы, в нашем случае,

а соответствующие матрицы запроса, ключа и значения,

Теперь мы можем вычислить значения внимания следующим образом,

Многоголовое внимание

Теперь вернемся к нашему предложению, “Животное не перешло дорогу, потому что оно было слишком уставшим”. Здесь видно, что прилагательное “уставшим” также связано с животным. На рисунке ниже видно две головы внимания; первая (оранжевая) связывает запрос “оно” с “животным”, а вторая (зеленая) связывает запрос “оно” с “уставшим”. Таким образом, вместе эти две головы образуют более точное представление, связывающее слова “оно”, “животное” и “уставшим”.

Рисунок 8: Изображение предоставлено https://jalammar.github.io/illustrated-transformer/

Таким образом, с двумя головами внимания у нас имеется

Они формируют 2 разные оценки;

Окончательная оценка вычисляется путем конкатенации оценок от обеих голов внимания и проецирования обратно на D-размерности исходного ввода.

По умолчанию модель трансформера использует 8 голов внимания.

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