COMRAD404 / GLOSSARY

Multi-Head Attention (многоголовое внимание)

Multi-Head Attention

Multi-Head Attention — механизм трансформера с несколькими параллельными головами внимания: они по-разному проецируют query, key и value, а затем объединяются в общий выход.

TL;DR

Многоголовое внимание — это механизм трансформера, в котором несколько параллельных голов независимо вычисляют внимание по своим проекциям query, key и value, а затем объединяются в общий выход.

Multi-Head Attention — это механизм внимания в трансформере, где одни и те же входные представления сначала проецируются несколькими наборами обучаемых матриц в параллельные «головы», затем результаты этих голов конкатенируются и проходят через итоговую выходную проекцию. В исходной статье Transformer он нужен для того, чтобы модель могла одновременно учитывать информацию из разных подпространств представлений, а не смотреть на последовательность только одним способом.

Английский термин: multi-head attention. Также встречается: multihead attention, MHA, «многоголовое внимание». Ниже приведено объяснение по первичным и официальным источникам; условия ускорения в PyTorch и Keras актуальны по снимку источников на 2026-08-14.

Простыми словами

Грубо говоря, это не один «взгляд» модели на последовательность, а несколько взглядов сразу. Можно представить редактора, который проверяет один и тот же текст с нескольких позиций: один следит за ближайшими словами, другой — за дальними связями, третий — за тем, какие части уже были важны раньше. Это аналогия, а не техническое описание, но она передаёт идею: несколько голов позволяют обрабатывать одну и ту же последовательность параллельно разными проекциями.

Важно не путать это с отдельным типом модели. Multi-head attention — это строительный блок внутри трансформера, а не самостоятельная архитектура.

Как это работает

В исходной формулировке Transformer каждая голова получает свои обучаемые проекции для query, key и value. Для каждой головы сначала вычисляется обычное внимание над её собственными проекциями, затем выходы всех голов объединяются и пропускаются через финальную матрицу.

Входы Q, K, V
   │
   ├─ Голова 1: QW₁^Q, KW₁^K, VW₁^V → Attention → head₁
   ├─ Голова 2: QW₂^Q, KW₂^K, VW₂^V → Attention → head₂
   ├─ ...
   └─ Голова h: QWh^Q, KWh^K, VWh^V → Attention → headh

Concat(head₁, head₂, ..., headh)
   │
   └─ Выходная проекция W^O
        ↓
      Итоговый выход

Формально в статье это записано так:

head_i = Attention(QW_i^Q, KW_i^K, VW_i^V)
MultiHead(Q, K, V) = Concat(head_1, ..., head_h)W^O
  1. Проекция. Исходные тензоры Q, K и V умножаются на разные обучаемые матрицы для каждой головы.
  2. Вычисление внимания. Каждая голова независимо считает своё внимание на основе собственных проекций.
  3. Параллельность. Все головы работают одновременно, поэтому модель может совместно учитывать разные подпространства представлений.
  4. Объединение. Выходы голов конкатенируются.
  5. Финальная проекция. Объединённый результат проходит через итоговую выходную проекцию.

Если query, key и value совпадают, это self-attention — именно так поведение описывает Keras для своего слоя MultiHeadAttention. В оригинальном Transformer multi-head attention используется в трёх местах: в self-attention энкодера, в self-attention декодера и в encoder-decoder attention. Для decoder self-attention применяется маска, чтобы сохранять авторегрессионное поведение и не смотреть в будущие позиции.

Историческая деталь из исходной статьи: в базовой конфигурации Transformer использовалось 8 голов, а размерности на голову были d_k = d_v = d_model / h = 64. Это пример из оригинальной модели, а не универсальное правило для любой современной реализации.

Где применяется

  • Self-attention энкодера. В оригинальном Transformer этот блок позволяет каждому токену учитывать другие токены входной последовательности.
  • Self-attention декодера с маской. Здесь будущие позиции закрываются маской, чтобы при генерации следующего токена модель не видела то, что ещё не должно быть доступно.
  • Encoder-decoder attention. В декодере multi-head attention связывает текущее состояние декодера с представлениями, пришедшими из энкодера.
  • Практические библиотеки. В PyTorch слой nn.MultiheadAttention реализует исходную архитектуру multi-head attention и может использовать оптимизированные пути через scaled_dot_product_attention(), если выполняются условия из документации. В Keras слой MultiHeadAttention проецирует query, key и value, считает scaled dot-product attention, конкатенирует результаты и при необходимости применяет финальную проекцию.

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

Практический пример

Сценарий: masked decoder self-attention при авторегрессионной генерации.

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

Позиции:   1   2   3   4
Токены:    A   B   C   ?

Разрешённое внимание по маске:
1 → 1
2 → 1,2
3 → 1,2,3
4 → 1,2,3,4
  1. Так как это self-attention, в слой подаётся одна и та же последовательность как источник query, key и value.
  2. Каждая голова создаёт свои проекции Q, K и V.
  3. Маска запрещает позиции 1 смотреть на 2, 3 и 4; позиции 2 — на 3 и 4; и так далее. Это и сохраняет авторегрессионный режим, описанный в исходной статье.
  4. Каждая голова считает свои веса внимания только по разрешённым позициям и формирует собственный выход.
  5. Выходы всех голов конкатенируются и проходят через финальную проекцию.
  6. Итог передаётся дальше по сети, где обучение идёт через обратное распространение, а сам процесс обучения обычно организуется по шагам epoch, batch и iteration.

Если вы работаете в PyTorch, документация отдельно отмечает, что для лучшей производительности часто полезно ставить need_weights=False, потому что это позволяет использовать оптимизированные attention-kernels, когда они доступны. Официальный блог PyTorch также указывает, что scaled_dot_product_attention() может эффективно реализовывать multi-head attention и откатывается к math kernel, если ни один специализированный kernel не подходит.

Если вы работаете в Keras, по release notes на снимок источников Keras 3.15.0 в MultiHeadAttention появился параметр sliding_window, а causal-only MHA/GQA может автоматически отправляться в Flash Attention через cuDNN SDPA. Но это условное ускорение: оно зависит от backend, runtime и конкретной конфигурации маски.

Чем отличается от похожих терминов

Термин Что это значит Ключевое отличие
Multi-Head Attention Несколько параллельных голов внимания с отдельными проекциями Q/K/V, конкатенацией результатов и выходной проекцией Это именно многоголовый механизм
Scaled dot-product attention Базовая операция внимания, которую используют отдельные головы Это не несколько голов, а строительный блок внутри них
Self-attention Режим, где query, key и value совпадают Self-attention может быть реализован как multi-head attention, но это не одно и то же понятие

Коротко: self-attention отвечает на вопрос «откуда берутся Q, K и V?», а multi-head attention — «сколько параллельных наборов проекций и вычислений внимания мы делаем?».

Ограничения и заблуждения

  • Заблуждение: multi-head attention = self-attention. Нет. Self-attention — это частный случай, когда Q=K=V. Multi-head attention может работать и в encoder-decoder attention.
  • Заблуждение: больше голов всегда лучше. Источники этого не утверждают. Исходная статья приводит 8 голов как конфигурацию базового Transformer, но не как универсальный стандарт для всех моделей и задач.
  • Заблуждение: ускорение гарантировано. В PyTorch ускоренные пути зависят от условий. В документированных fastpath-условиях для инференса перечислены self-attention, батчевый 3D-вход с batch_first=True, режим eval, отсутствие grad/autocast и совпадение embed_dim, kdim и vdim. В Keras автоматический dispatch в Flash Attention для causal-only MHA/GQA тоже условный.
  • Заблуждение: это то же самое, что параметры генерации. Не путайте multi-head attention с temperature: temperature управляет выбором токенов на этапе генерации, а внимание — это внутренняя операция обработки представлений.
  • Ограничение источников. Официальные документы и статья хорошо описывают механику и часть оптимизаций, но не дают универсального ответа, какая конфигурация голов оптимальна для любой архитектуры, железа и режима маскирования.

Практический вердикт: если вы встретили MultiHeadAttention в документации или коде, думайте о нём как о стандартном блоке трансформера с несколькими параллельными attention-путями. Для практики важнее не абстрактный спор о «количестве голов», а проверка того, какой это режим — self-attention или нет, нужна ли маска, и выполняются ли условия ускорения в вашем фреймворке.

Связанные термины

Источники

Вопросы и ответы

Multi-head attention и self-attention — это одно и то же?

Нет. Self-attention — это случай, когда query, key и value совпадают. Multi-head attention — это способ считать внимание через несколько параллельных голов; он может использоваться и как self-attention, и как encoder-decoder attention.

Зачем нужны несколько голов, а не одна?

Смысл multi-head attention в том, чтобы модель могла совместно учитывать информацию из разных подпространств представлений. Для этого каждая голова получает свои обучаемые проекции, а затем их результаты объединяются.

Когда PyTorch считает multi-head attention быстрее?

По документации PyTorch слой nn.MultiheadAttention может использовать оптимизированные пути через scaled_dot_product_attention(). Для лучшей производительности документация рекомендует need_weights=False, а fastpath-инференс возможен только при наборе условий, включая self-attention, batch_first=True, режим eval и отсутствие grad/autocast.

Что важно знать про Keras MultiHeadAttention?

Официальный слой Keras проецирует query, key и value, считает scaled dot-product attention, конкатенирует результаты и может применять финальную проекцию. По release notes на 2026-08-14, в Keras 3.15.0 добавлен sliding_window, а causal-only MHA/GQA может автоматически отправляться в Flash Attention через cuDNN SDPA при подходящей поддержке.

Есть ли универсально «правильное» число голов?

Нет универсального числа в приведённых источниках. Исходная статья показывает базовый Transformer с 8 головами и размерностью 64 на голову, но это пример конкретной конфигурации, а не обязательная норма для всех реализаций.

Источники

SOURCES

Вопросы и ответы

FAQ
Multi-head attention и self-attention — это одно и то же?

Нет. Self-attention — это случай, когда query, key и value совпадают. Multi-head attention — это многоголовый механизм, который может использоваться и как self-attention, и как encoder-decoder attention.

Зачем нужны несколько голов внимания?

По исходной статье, механизм задуман так, чтобы модель могла совместно учитывать информацию из разных подпространств представлений. Для этого каждая голова получает свои обучаемые проекции Q, K и V, а затем их выходы объединяются.

Когда PyTorch MultiheadAttention работает быстрее?

Документация PyTorch указывает, что слой может использовать оптимизированные пути через scaled_dot_product_attention(). Для лучшей производительности рекомендуется need_weights=False, а fastpath-инференс зависит от набора условий, включая self-attention, batch_first=True, eval mode и отсутствие grad/autocast.

Что изменилось в Keras MultiHeadAttention по актуальным источникам?

По release notes на снимок 2026-08-14, в Keras 3.15.0 для MultiHeadAttention и GroupedQueryAttention добавлен sliding_window, а causal-only MHA/GQA может автоматически dispatch-иться в Flash Attention через cuDNN SDPA при поддерживаемой конфигурации.

Есть ли универсально правильное число голов?

Нет универсального числа в приведённых источниках. В базовом Transformer из исходной статьи использовалось 8 голов с d_k = d_v = 64 на голову, но это конфигурация конкретной модели, а не общий стандарт.

Читайте также

LINKS