В посте Jay Alammar есть несколько удивительных визуальных представлений, откуда я взял изображения. В этом посте я попытаюсь дать общее представление о трансформерах, используя самые простые слова, но охватив наиболее важные моменты.

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

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

Кодировщики и декодеры

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

Ввод

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

Кодировка

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

  1. Создайте три вектора для каждого входного вектора, передаваемого кодировщику. Векторы:
    - вектор запроса
    - вектор ключа
    - вектор значения
    Эти векторы создаются путем умножения вложений на три матрицы, которые мы обучили в процессе обучения. Мы можем представить эти три вектора как веса, которые мы пытаемся найти в процессе обучения наших моделей.
  2. Подсчет внимания к себе (в виде баллов). Оценка будет определять, сколько внимания следует уделить другим частям заданных входных данных.
    Она рассчитывается путем скалярного произведения вектора запроса и ключевого вектора соответствующего слова, которое мы оцениваем
  3. Разделите оценку на квадратный корень размерности используемых ключевых векторов. Это приводит к более стабильным градиентам.
  4. Затем передайте результат через операцию softmax, которая нормализует оценку, чтобы все они были положительными и в сумме давали 1.
  5. Умножьте каждый вектор значений на показатель softmax. Интуиция состоит в том, чтобы сохранить ценность слов, на которых мы хотим сосредоточиться, и уменьшить ценность нерелевантных слов, умножая их на маленькие значения.
  6. Суммируйте взвешенные векторы значений, которые производят выходные данные уровня само-внимания для этого конкретного слова.

3 вектора вычисляются, как показано (X — матрица 2x4, так как в этом примере есть 2 входа, каждый из которых имеет длину вектора 4)

Весь этот процесс можно визуально резюмировать ниже

Результат слоя само-внимания может быть математически записан как

Внимание с несколькими головками:

Часть внимания на этом не заканчивается, реализуется еще одна концепция многоголового внимания, в которой мы используем несколько головок внимания и отдельные весовые матрицы Q/K/V для каждой головы, что приводит к различным матрицам Q/k/V.

Таким образом, теперь у нас будет несколько Z-матриц. Но мы не можем передавать отдельные матрицы в сеть прямой связи. Поэтому мы объединим их в одну матрицу, а затем умножим на дополнительную матрицу весов W0

Весь процесс можно визуализировать ниже

Еще один важный аспект, который мы упустили, — это приоритетность порядка передаваемых входных данных (пример: в НЛП порядок слов в предложении имеет значение). Для этого преобразователь добавляет вектор к каждому входному встраиванию. Этот вектор помогает определить расстояние каждого слова друг от друга, поскольку содержит определенные значения, которые показывают положение входного токена (слова) во всем входном пространстве (предложении), когда они проецируются в векторы Q/K/V и во время кумулятивное внимание

Наконец, энкодер в целом выглядит так

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

Это касается и подуровней декодеров. Кодировщик и декодер с двумя стеками будет выглядеть примерно так:

Декодер

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

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

Слои внутреннего внимания в декодере работают немного иначе, чем в кодировщике:

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

Слой «Encoder-Decoder Attention» работает так же, как многоголовое само-внимание, за исключением того, что он создает свою матрицу запросов из слоя, расположенного ниже, и берет матрицу ключей и значений из выходных данных стека кодировщика.

Последний слой Linear и Softmax

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

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

Вот и все, что нужно понимать о модели-трансформере.