Внимание, Само-Внимание, Многоголовое Внимание и Трансформеры

Это длинная статья, в которой рассказывается почти обо всем, что нужно знать о механизме внимания, включая самостоятельный поиск, запрос, ключи, значения, внимание с несколькими головками, внимание с несколькими головками в маске и преобразователи, включая некоторые подробности о BERT и GPT. Поэтому я разделил статью на две части. В этой статье я расскажу обо всех блоках Attention, а в следующей истории я углублюсь в архитектуру Transformer Network.

Содержание:

  1. Проблемы с RNN и как модели Transformer могут помочь преодолеть эти проблемы
  2. Механизм внимания

2.1 Самостоятельное внимание

2.2 Запрос, ключ и значения

2.3 Нейросетевое представление внимания

2.4 Мультиголовное внимание

3. Трансформеры (продолжение в следующей истории)

Введение

Механизм внимания был впервые использован в 2014 году в компьютерном зрении, чтобы попытаться понять, на что смотрит нейронная сеть, делая прогноз. Это был один из первых шагов, чтобы попытаться понять результаты сверточных нейронных сетей (CNN). В 2015 году внимание было впервые использовано в обработке естественного языка (NLP) в выравниваемом машинном переводе. Наконец, в 2017 году механизм внимания был использован в сетях Transformer для языкового моделирования. С тех пор трансформеры превзошли по точности предсказания рекуррентные нейронные сети (RNN) и стали самыми современными задачами НЛП.

1. Проблемы с RNN и как модели Transformer могут помочь преодолеть эти проблемы

1.1Проблема RNN 1. — возникают проблемы с зависимостями большого радиуса действия. RNN плохо работают с длинными текстовыми документами.

Решение-трансформер. В сетях-трансформерах почти исключительно используются блоки внимания. Внимание помогает установить связь между любыми частями последовательности, поэтому дальние зависимости больше не проблема. С трансформаторами долгосрочные зависимости имеют такую ​​же вероятность быть принятыми во внимание, как и любые другие краткосрочные зависимости.

1.2. Проблема RNN 2. – градиент исчезает и взрывается.

Решение-трансформер. Практически отсутствует проблема с исчезновением или взрывом градиента. В сетях Transformer вся последовательность обучается одновременно, и для ее построения добавляется всего несколько слоев. Таким образом, исчезновение градиента или взрыв редко являются проблемой.

1.3.Проблема RNN 3. RNN требуют больших шагов обучения, чтобы достичь локального/глобального минимума. RNN можно представить как развёрнутую очень глубокую сеть. Размер сети зависит от длины последовательности. Это порождает множество параметров, и большинство из этих параметров взаимосвязаны друг с другом. В результате оптимизация требует более длительного обучения и большого количества шагов.

Решение-трансформер — требует меньше шагов для обучения, чем RNN.

1.4. Проблема RNN 4. RNN не допускают параллельных вычислений. Графические процессоры помогают добиться параллельных вычислений. Но RNN работают как модели последовательности, то есть все вычисления в сети происходят последовательно и не могут быть распараллелены.

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

2. Механизм внимания

2.1 Самостоятельное внимание

Рассмотрим предложение — «Барк очень милый, и он — собака». В этом предложении 9 слов или токенов. Если мы просто рассмотрим слово «он» в предложении, мы увидим, что «и» и «есть» — это два слова, которые находятся в непосредственной близости от него. Но эти слова не придают слову «он» никакого контекста. Скорее слова «лай» и «собака» гораздо больше связаны с «он» в предложении. Из этого мы понимаем, что близость не всегда имеет значение, но контекст в предложении более важен.

Когда это предложение передается на компьютер, он рассматривает каждое слово как токен t, и каждый токен имеет вложение словаV. Но эти вложения слов не имеют контекста. Таким образом, идея состоит в том, чтобы применить какое-то взвешивание или сходство, чтобы получить окончательное вложение слова Y, которое имеет больше контекста, чем исходное вложение V.

В пространстве вложения похожие слова кажутся ближе друг к другу или имеют аналогичные вложения. Например, слово король будет больше связано со словом королева и королевская власть, чем со словом зебра. Точно так же зебра будет больше связана с лошадью и полосами, чем со словом эмоция. Чтобы узнать больше о встраивании пространства, посмотрите это видео Эндрю Нг (НЛП и встраивание слов).

Таким образом, интуитивно, если слово «король» появляется в начале предложения, а слово «королева» — в конце предложения, они должны предоставлять друг другу лучший контекст. Мы используем эту идею для нахождения весовых векторов W путем умножения (точечного произведения) вложений слов вместе, чтобы получить больше контекста. Итак, в предложении Барк очень милый, и он — собака, вместо того, чтобы использовать вложения слов как таковые, мы умножаем вложения каждого слова друг на друга. Рисунок 3 должен лучше это проиллюстрировать.

Как мы видим на рисунке 3, мы сначала находим веса путем умножения (скалярного произведения) начального вложения первого слова на вложение всех остальных слов в предложении. Эти веса (от W11 до W19) также нормированы, чтобы иметь сумму 1. Затем эти веса умножаются на начальные вложения всех слов в предложении.

W11 V1 + W12 V2 + …. W19 V9 = Y1

От W11 до W19 — все веса, имеющие контекст первого слова V1. Поэтому, когда мы умножаем эти веса на каждое слово, мы, по сути, перевешиваем все остальные слова по отношению к первому слову. Таким образом, в некотором смысле слово «лает» теперь больше похоже на слова «собака» и «милый», а не на слово что приходит сразу после него. И это, в некотором смысле, дает некоторый контекст.

Это повторяется для всех слов, так что каждое слово получает некоторый контекст от каждого другого слова в предложении.

Рисунок 4 дает лучшее представление о вышеуказанных шагах для получения Y1 с использованием графической диаграммы.

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

2.2 Запрос, ключ и значения

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

Давайте снова рассмотрим предыдущее предложение — «Барк очень милый, и он — собака». На Рисунке 4, обращая внимание на себя, мы видим, что начальные вложения слов (V) используются 3 раза. 1-й как скалярное произведение между первым вложением слова и всеми другими словами (включая само себя, 2-е) в предложении, чтобы получить веса, а затем умножить их снова (3-й раз) на веса, чтобы получить окончательное вложение с контекстом. Эти 3 вхождения буквы V можно заменить тремя терминами: Запрос, Ключи и Значения.

Допустим, мы хотим сделать все слова похожими относительно первого слова V1. Затем мы отправляем V1 в качестве слова запроса. Это слово запроса затем сделает скалярное произведение со всеми словами в предложении (от V1 до V9) — и это ключи. Таким образом, комбинация Запроса и Ключей дает нам веса. Затем эти веса снова умножаются на все слова (от V1 до V9), которые действуют как значения. Там у нас есть запрос, ключи и значения. Если у вас все еще есть какие-то сомнения, рисунок 5 должен развеять их.

Но подождите, мы еще не добавили матрицу, которую можно обучить. Это довольно просто. Мы знаем, что если вектор в форме 1 x k умножить на матрицу в форме k x k, мы получим вектор в форме 1 x k на выходе. Имея это в виду, давайте просто умножим каждую клавишу от V1 до V10 (каждая из форм 1 x k) на матрицу Mk (матрица клавиш) формы k x k. Точно так же вектор запроса умножается на матрицу Mq (матрица запроса), а векторы значений умножаются на матрицу значений Mv. Все значения в этих матрицах Mk, Mq и Mv теперь могут быть обучены нейронной сетью и дают гораздо лучший контекст, чем просто использование собственного внимания. Опять же, для лучшего понимания, на рис. 6 показано графическое представление того, что я только что объяснил.

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

Давайте попробуем понять механизм Attention, рассмотрев пример базы данных. Итак, в базе данных, если мы хотим получить некоторое значение vi на основе запроса q и ключа ki могут быть выполнены некоторые операции, в которых мы можем использовать запрос для определения ключа, соответствующего определенному значению. Внимание можно рассматривать как процесс, аналогичный этой технике базы данных, но в более вероятностной манере. Это показано на рисунке ниже.

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

Механизм внимания представляет собой нейронную архитектуру, которая имитирует этот процесс поиска.

  1. Механизм внимания измеряет сходство между запросом q и каждым ключом-значением ki.
  2. Это сходство возвращает вес для каждого значения ключа.
  3. Наконец, он выдает результат, представляющий собой взвешенную комбинацию всех значений в нашей базе данных.

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

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

(Ключевые значения k являются векторами, значения сходстваS являются скалярами, значения веса (softmax) a являются скалярами, а значения V — это векторы)

Шаг 1.

Шаг 1 содержит ключи, запрос и соответствующие меры сходства. Запрос q влияет на сходство. У нас есть запрос и ключи, и мы вычисляем сходство. Сходство есть некоторая функция запроса q и ключей k. И запрос, и ключи являются некоторыми векторами встраивания. Сходство S можно рассчитать с помощью различных методов, как показано на рисунке 9.

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

Часто запрос проецируется в новое пространство с помощью весовой матрицы W, а затем производится скалярное произведение с ключом k. Методы ядра также могут использоваться в качестве подобия.

Шаг 2.

Шаг 2 – нахождение весов a. Это делается с помощью «SoftMax». Формула показана ниже. (exp является экспоненциальным)

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

Шаг 3.

Шаг 3 представляет собой взвешенную комбинацию результатов softmax (a) с соответствующими значениями (V). Первое значение a умножается на первое значение V, а затем суммируется с произведением второго значения a на второе значение Values ​​V и так далее. Конечным результатом, который мы получаем, является желаемое значение внимания.

Обзор трех шагов:

С помощью запроса q и ключей k мы получаем значение внимания, которое представляет собой взвешенную сумму/линейную комбинацию значений V , а веса зависят от некоторого сходства между запросом и ключами.

2.3 Нейросетевое представление внимания

На рис. 10 показано представление нейронной сети блока внимания. Вложения слов сначала передаются в некоторые линейные слои. Эти линейные слои не имеют термина «смещение» и, следовательно, представляют собой не что иное, как умножение матриц. Один из этих слоев обозначается как «ключи», другой — как «запросы», а последний — как «значения». Если матричное умножение выполняется между ключами и запросами, а затем нормализуется, мы получаем веса. Затем эти веса умножаются на значения и суммируются, чтобы получить окончательный вектор внимания. Этот блок теперь можно использовать в нейронной сети, он известен как блок «Внимание». Можно добавить несколько таких блоков внимания, чтобы обеспечить больше контекста. И самое приятное то, что мы можем получить обратное распространение градиента для обновления блока внимания (веса ключей, запросов, значений).

2.4 Мультиголовное внимание

Чтобы преодолеть некоторые ловушки, связанные с использованием одного внимания, используется многоголовое внимание. Вернемся к предложению — «Барк очень милый, и он — собака». Здесь, если мы возьмем слово «собака», грамматически мы понимаем, что слова «лай», «милый» и «он» должны иметь какое-то значение или отношение к слову «собака». Эти слова говорят о том, что собаку зовут Барк, это кобель, и что он милый пес. Только один механизм внимания может быть не в состоянии правильно идентифицировать эти три слова как релевантные слову «собака», и мы можем сказать, что здесь лучше использовать три внимания, чтобы обозначить три слова со словом «собака». Это снижает нагрузку на одно внимание при поиске всех значимых слов, а также увеличивает шансы легко найти более релевантные слова.

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

Но 3 — это просто случайное число, которое мы выбрали. В реальном сценарии это может быть любое количество линейных слоев, и они называются головками (h). То есть может быть h количество линейных слоев, дающих h выходные данные внимания, которые затем объединяются вместе. И именно поэтому это называется многоголовым вниманием (множественными головками). Более простая версия рисунка 11, но с количеством головок h, показана на рисунке 12.

Теперь, когда мы понимаем механизм и идею, лежащие в основе «Внимания», «Запроса», «Ключей», «Ценностей» и «Многоголового внимания», мы охватили все важные строительные блоки сети Transformer. В следующем рассказе я расскажу о том, как все эти блоки складываются вместе, чтобы сформировать Transformer Network, а также расскажу о некоторых сетях на основе Transformers, таких как BERT и GPT.

Использованная литература:

Ашиш Васвани, Ноам Шазир, Ники Пармар, Якоб Ушкорейт, Ллион Джонс, Эйдан Н. Гомес, Лукаш Кайзер и Илья Полосухин. 2017. Внимание — это все, что вам нужно. В материалах 31-й Международной конференции по системам обработки нейронной информации (NIPS’17). Curran Associates Inc., Ред-Хук, Нью-Йорк, США, 6000–6010.