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

Введение

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

Цель механизма внимания — предоставить моделям лучший контекст для понимания их входных данных. Например, если модель обрабатывает предложение «Берег на берегу реки», она должна знать, что «банк» относится к берегу реки, а не к финансовому учреждению.

Слова в компьютере представлены в виде векторов, поэтому мы можем умножать эти векторы на матрицы (которые мы узнаем со временем). В механизме внимания используются три основные матрицы:

  1. Матрица запросов
  2. Ключевая матрица
  3. Матрица значений

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

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

Алгоритм

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

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

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

  1. Умножить вектор встраивания «банк» на матрицу запроса; получить вектор запроса. (Как мне представить слово запроса («банк»), пытаясь выяснить, какие ключевые слова (например, «река») важны для получения контекста?)
  2. Умножить вектор встраивания «река» на ключевую матрицу; вернуть ключевой вектор. (Как мы должны представить ключевое слово («река»), пытаясь выяснить, какие слова запроса (например, «банк») важны для придания контекста?)
  3. Вектор запроса скалярного произведения и вектор ключа; скаляр обратного внимания. (Насколько важно ключевое слово («река») для предоставления контекста слову запроса («банк»)? Другими словами, сколько должно платить слово запроса («банк») внимание к ключевому слову ("река")? Помните, что скалярное произведение, по сути, просто вычисляет угол между двумя векторами; чем ближе угол, тем выше будет скаляр внимания и тем больше контекстной информации будет получено. быть добавлено от ключевого слова («река») к ключевому слову («банк»).
  4. (Нормализуйте скаляры внимания — я обсуждаю это ниже.)
  5. Умножить исходный вектор встраивания «река» на матрицу значений; получить вектор обратного значения. (Предполагая, что ключевое слово («река») важно для предоставления контекста слову запроса («банк»), как мы должны представить эту контекстную информацию?)
  6. Умножить вектор значений на (нормализованный) скаляр внимания; вернуть вектор контекста. (Если получение контекста из ключевого слова («река») не так важно, сделайте его влияние на окончательное представление небольшим. Если получение контекста из ключевого слова («река») очень важно, сделайте его влияние на окончательное представление большим.)
  7. Добавьте вектор контекста к исходному вектору встраивания "bank"; получить окончательный контекстуализированный вектор. (Теперь у нас есть контекстуализированный вектор встраивания, который мы можем использовать для остальных наших вычислений вместо исходного вектора запроса («банка»)!)

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

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

Если вы все это поняли, значит, вы понимаете, как работает механизм внимания! Ниже приведены менее важные детали того, как работает алгоритм.

Нормализация

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

Чтобы правильно реализовать механизм внимания, когда вы получили скаляр внимания для каждого ключевого слова (для одного фиксированного слова запроса), вы нормализуете их все так, чтобы сумма скаляров внимания для всех слов равнялась 1. По сути, это преобразует каждый из скаляров внимания в процент «по сравнению с другими словами в этом вводе, насколько важно, чтобы это ключевое слово обеспечивало контекст?» Затем именно этот процент умножается на вектор значений, а не на исходный скаляр.

(Есть еще одна небольшая часть нормализации, упомянутая в разделе «Примечания» внизу.)

Несколько головок

Алгоритм, описанный выше, можно рассматривать как «голову» преобразователя внимания, которая применяется к каждому (запросному) слову в предложении, чтобы получить более контекстуализированное вложение для этого (запросного) слова. Однако мы можем захотеть одновременно изучить несколько различных паттернов контекстуализации.

Для этого мы можем просто повторно запустить тот же самый алгоритм, но с другими матрицами запроса, ключа и значения. Мы случайным образом инициализируем эти матрицы разными значениями, и когда мы тренируемся, они, скорее всего, тоже будут принимать разные значения! Каждый повторный запуск этого алгоритма называется «головой» преобразователя, и они обычно выполняются параллельно (в одно и то же время, а не один за другим).

Затем мы можем объединить (путем объединения) окончательные контекстуализированные вложения всех голов вместе в одно большое окончательное контекстуализированное вложение, которое мы можем использовать для будущих вычислений. Обычно люди выбирают размерности матриц запроса, ключа и значения таким образом, что когда вы объединяете все (небольшие) окончательные контекстуализированные вложения, вы получаете вектор того же размера, что и исходное вложение. То есть вы устанавливаете: (количество головок) * (размер конечного контекстуализированного встраивания из механизма внимания) = (размер исходного вектора). Подробности смотрите в статье по ссылке.

Это чрезвычайно распространенная техника; основные трансформаторы бумаги используют 8 головок, работающих параллельно.

Несколько слоев

Что ж, если после использования механизма внимания у нас теперь есть еще один набор (контекстуализированных) вложений… почему бы не повторить все это снова с этими (контекстуализированными) вложениями? Если вы решите добавить контекст между вашими уже контекстуализированными встраиваниями, используя другой механизм внимания, это называется добавлением слоя преобразования.

Это тоже очень распространенная техника. В основной бумаге-трансформере используется 6 слоев.

Почему трансформаторы работают

Параллельное вычисление. По сути, большая часть этих вычислений может выполняться параллельно, а это означает, что вы можете выполнить больше вычислений за меньшее время, чтобы ваш алгоритм работал лучше.

Дополнительные примечания

Токены

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

Нормализация

Кроме того, на этапе нормализации вы также делите каждый скаляр внимания на квадратный корень из числа измерений в векторе запроса (или ключа, или значения — они все одинаковы) перед выполнением окончательной нормализации. (Подробности см. в связанной статье.) Авторы основной статьи делают это, потому что считают, что значения скалярного произведения становятся настолько большими, что при их нормализации (с использованием функции softmax) нейронная сеть не учится. ну, потому что softmax имеет очень маленький наклон (градиент) для очень больших значений.

Позиционные вложения

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