Описание архитектуры и принципов реализации

В основе архитектуры Трансформера лежат последовательные блоки Encoder и Decoder со схожей архитектурой. Каждый из блоков включает несколько одинаковых слоев с разными весовыми матрицами.

Архитектура Трансформера

Архитектура Трансформера

Каждый слой Encoder содержит два внутренних слоя: Self-Attention и Feed Forward. Слой Feed Forward включает два полносвязных слоя нейронов с функцией активации ReLU на внутреннем слое. Каждый слой применяется для всех элементов последовательности с одинаковыми весовыми коэффициентами, что позволяет одновременно проводить независимые вычисления для всех элементов последовательности в параллельных потоках.

Encoder

Encoder

Слой Decoder имеет схожую структуру, но добавляется еще один слой Self-Attention, анализирующий зависимости между входными и выходными последовательностями.

Decoder

Decoder

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

Self-Attention

  1. Вначале вычисляем векторы Query (запрос), Key (ключ) и Value (значение). Указанные векторы получаются путем умножения каждого элемента последовательности на соответствующую матрицу WQ, WK и WV.
  2. Далее определяем парные зависимости между элементами последовательности. Для этого перемножим вектор Query с векторами Key всех элементов последовательности. Данная итерация повторяется для вектора Query каждого элемента последовательности. В результате данной итерации получаем матрицу Score размером N*N, где N — размер последовательности.
  3. Следующим этапом разделим полученные значение на квадратный корень из размерности вектора Key и нормализуем функцией Softmax в разрезе каждого Query. Таким образом, получаем коэффициенты попарной взаимозависимости между элементами последовательности.
  4. Умножением каждого вектора Value на соответствующий коэффициент взаимозависимости получаем скорректированное значение элемента. Цель данной итерации — акцентировать внимание на релевантных элементах и снизить влияние не релевантных значений.
  5. Далее суммируем все скорректированные вектора Value для каждого элемента. Результат данной операции и будет вектор выходных значений слоя Self-Attention.

Результаты итераций каждого слоя складываются с входной последовательностью и нормализуются.

Для нормализации данных мы сначала определяем среднее значение всей последовательности. Затем для каждого элемента рассчитываем частное от деления его отклонения от среднего на среднеквадратичное отклонение последовательности.