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
- Проекция. Исходные тензоры
Q,KиVумножаются на разные обучаемые матрицы для каждой головы. - Вычисление внимания. Каждая голова независимо считает своё внимание на основе собственных проекций.
- Параллельность. Все головы работают одновременно, поэтому модель может совместно учитывать разные подпространства представлений.
- Объединение. Выходы голов конкатенируются.
- Финальная проекция. Объединённый результат проходит через итоговую выходную проекцию.
Если 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
- Так как это self-attention, в слой подаётся одна и та же последовательность как источник
query,keyиvalue. - Каждая голова создаёт свои проекции
Q,KиV. - Маска запрещает позиции 1 смотреть на 2, 3 и 4; позиции 2 — на 3 и 4; и так далее. Это и сохраняет авторегрессионный режим, описанный в исходной статье.
- Каждая голова считает свои веса внимания только по разрешённым позициям и формирует собственный выход.
- Выходы всех голов конкатенируются и проходят через финальную проекцию.
- Итог передаётся дальше по сети, где обучение идёт через обратное распространение, а сам процесс обучения обычно организуется по шагам 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 или нет, нужна ли маска, и выполняются ли условия ускорения в вашем фреймворке.
Связанные термины
- Self-attention — чтобы отделить режим
Q=K=Vот многоголового механизма. - Backpropagation (обратное распространение) — как обучаются матрицы проекций внимания.
- Epoch, batch и iteration — как организуется обучение блоков внимания на практике.
Источники
- Attention is all you Need
- Attention Is All You Need | Google Research
- MultiheadAttention — PyTorch 2.13 documentation
- Accelerated PyTorch 2 Transformers – PyTorch
- MultiHeadAttention layer
- Releases · keras-team/keras
- Releases · pytorch/pytorch
Вопросы и ответы
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 на голову, но это пример конкретной конфигурации, а не обязательная норма для всех реализаций.