COMRAD404 / GLOSSARY

Self-Attention (самовнимание)

Self-Attention

Self-Attention — механизм трансформера, в котором каждый элемент входа выбирает, на какие другие элементы того же входа смотреть. Ниже — простое объяснение Q/K/V, масок и отличий от MHA.

TL;DR

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

Self-Attention (самовнимание) — это механизм, при котором каждый элемент входа решает, к каким другим элементам того же входа ему обращаться. В трансформерах это обычно означает, что query, key и value построены из одного и того же входного тензора; исходный Transformer был представлен как архитектура, основанная только на механизмах attention, без рекуррентных и сверточных слоев.

Английский термин: self-attention. Русский вариант: самовнимание. В документации рядом с ним часто встречаются scaled dot-product attention, multi-head attention, а также маски causal и bidirectional. Важно: self-attention — это не отдельная модель, а механизм внутри трансформерных блоков.

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

Можно грубо представить self-attention как чтение предложения, где каждое слово быстро оглядывается на остальные слова того же предложения и решает, какие из них сейчас важнее. Не все связи одинаково полезны: для одного слова важен сосед слева, для другого — слово в начале фразы, для третьего — знак препинания или специальный токен.

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

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

Технически self-attention обычно описывают через три представления: Q (query), K (key) и V (value). В случае self-attention они выводятся из одного и того же входа. Затем вычисляются оценки похожести между Q и K, к ним при необходимости применяется маска, после чего полученные веса используются для взвешивания V.

Вход X
 ├─> Q
 ├─> K
 └─> V

Q · K^T / scale
   └─> + mask (если нужна)
        └─> веса внимания
             └─> взвешенная сумма V
                  └─> выход Y

В текущих документациях библиотек это выглядит так:

  • PyTorch: канонический примитив — torch.nn.functional.scaled_dot_product_attention. Он работает с тензорами query, key, value и поддерживает необязательные маски внимания, dropout, causal-флаг, явный scale и grouped-query attention.
  • PyTorch: модуль torch.nn.MultiheadAttention рассматривается как эталонная реализация attention-блока из оригинального Transformer и, когда это возможно, использует оптимизированный scaled_dot_product_attention().
  • Keras: слой MultiHeadAttention прямо указывает, что если query, key и value — один и тот же тензор, то это self-attention. В текущем API также есть опции flash-attention и sliding-window.

Маска определяет, какие связи разрешены. В текущей документации Hugging Face create_causal_mask соотносится с decoder-only self-attention, а create_bidirectional_mask — с encoder self-attention или cross-attention. Это практическая разница между «модель может смотреть только влево» и «модель может смотреть на весь доступный вход».

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

  • В encoder-блоках трансформера: когда элементам входа нужен двунаправленный контекст. Для такого сценария Hugging Face описывает create_bidirectional_mask.
  • В decoder-only моделях для генерации текста: там используется self-attention с причинной, или каузальной, маской, чтобы текущая позиция не опиралась на будущие позиции. В текущем интерфейсе Hugging Face для этого используется create_causal_mask.
  • В прикладном коде на PyTorch: либо напрямую через scaled_dot_product_attention, либо через MultiheadAttention, который может переключаться на оптимизированные варианты вычисления.
  • В Keras-пайплайнах: через MultiHeadAttention, где self-attention определяется тем, что на вход query, key и value подается один и тот же тензор.

Если вы работаете с прикладными LLM-задачами, self-attention почти неизбежно встретится рядом с такими темами, как Fine-tuning (дообучение) и Latency (задержка): не потому, что это один и тот же термин, а потому, что выбор attention-блока влияет на то, как вы строите и обслуживаете модель.

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

Ниже не «копипастный» фрагмент под конкретную версию, а рабочая схема, по которой вы быстро проверяете, имеете ли дело именно с self-attention.

# x — один и тот же входной тензор
q = x
k = x
v = x

# если нужен encoder-style просмотр всего входа
mask = create_bidirectional_mask(...)

# если модель генерирует слева направо
# mask = create_causal_mask(...)

output = scaled_dot_product_attention(q, k, v, mask)

Что здесь важно на практике:

  1. Если q, k и v происходят из одного входа, это self-attention.
  2. Если вы строите decoder-only сценарий, решающую роль играет causal-маска.
  3. Если вы используете torch.nn.MultiheadAttention, библиотека может применить оптимизированный путь вычисления, но это зависит от условий входа и режима выполнения.

Для self-hosted стеков это особенно заметно: при развертывании через OpenLLM (BentoML) — self-hosted OpenAI-совместимый API для open-source LLM или при выборе модели в материале Llama vs Mistral: что выбрать для self-hosting, API и дообучения вы в итоге упираетесь не только в саму модель, но и в то, какой attention-код реально исполняется.

Чем отличается от…

Термин Что это Чем отличается от self-attention
Scaled Dot-Product Attention Базовый примитив вычисления attention на Q, K, V. Это низкоуровневая операция. Self-attention — конкретный случай ее применения, когда все три представления происходят из одного входа.
Multi-Head Attention (многоголовое внимание) Блок, который организует attention по нескольким головам. Multi-head описывает организацию вычисления по головам, а self-attention — источник входов. Один и тот же блок MHA может реализовывать self-attention, если query, key и value одинаковы.
Causal self-attention Self-attention с причинной маской. Это не другой механизм, а частный режим self-attention: позиции не видят будущие токены.

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

  • Заблуждение: self-attention = весь трансформер. Нет. Это ключевой механизм внутри архитектуры, но не вся модель целиком.
  • Заблуждение: любой attention-слой — это self-attention. В текущей документации Keras self-attention определяется именно совпадением query, key и value.
  • Заблуждение: если библиотека поддерживает SDPA, поведение всегда одинаковое. Нет. В PyTorch есть оптимизированные пути вычисления, но их включение зависит от условий. Для fastpath-инференса у MultiheadAttention среди условий фигурирует сценарий self-attention с идентичными query, key и value.
  • Заблуждение: маска — второстепенная деталь. На практике именно маска часто определяет, какой режим self-attention вы используете: двунаправленный или каузальный.
  • Ограничение текущих API: интерфейсы attention в PyTorch, Keras и Hugging Face развиваются; Hugging Face отдельно отмечает, что legacy-хелперы масок считаются deprecated.

Редакционное ограничение: документации PyTorch, Keras и Hugging Face — живые веб-страницы, в том числе разделы stable и main. Формулировки, список оптимизаций и детали backend’ов могут меняться; эта статья фиксирует состояние, проверенное на 2026-08-18.

Практический вывод: если в вашем слое query, key и value приходят из одного и того же входа, вы, скорее всего, имеете дело с self-attention. Для инженера дальше важнее три вещи: какая маска используется, какой блок вызывает вычисление и при каких условиях библиотека включает оптимизированный backend.

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

Источники

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

Self-attention и attention — это одно и то же?

Не совсем. В этой статье self-attention — это режим, в котором query, key и value относятся к одному и тому же входу. Слово attention в документации может использоваться шире.

Почему рядом почти всегда обсуждают multi-head attention?

Потому что на практике self-attention часто реализуется внутри блока MultiheadAttention или аналогичного слоя. Multi-head описывает организацию по нескольким головам, а self-attention — источник входов.

Когда нужна causal mask?

Когда модель работает в decoder-only режиме и не должна смотреть на будущие позиции. В текущей документации Hugging Face это соответствует create_causal_mask.

Self-attention — это отдельная модель?

Нет. Это механизм внутри трансформера и родственных ему архитектур.

Можно ли судить о производительности только по тому, что в модели есть self-attention?

Нет. В актуальных библиотеках многое зависит от backend’а, выбранного attention-примитива и конкретных условий, при которых включаются оптимизированные пути вычисления.

Источники

SOURCES

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

FAQ
Self-attention и attention — это одно и то же?

Не совсем. Self-attention — это режим, в котором query, key и value относятся к одному и тому же входу; attention в документации может обозначать более общий механизм.

Почему рядом почти всегда обсуждают multi-head attention?

Потому что self-attention часто реализуется внутри блока MultiheadAttention или аналогичного слоя. Multi-head описывает организацию по нескольким головам, а self-attention — источник входов.

Когда нужна causal mask?

Когда модель работает в decoder-only режиме и не должна смотреть на будущие позиции. В текущей документации Hugging Face это соответствует create_causal_mask.

Self-attention — это отдельная модель?

Нет. Это механизм внутри трансформера и родственных ему архитектур.

Можно ли судить о производительности только по тому, что в модели есть self-attention?

Нет. В актуальных библиотеках многое зависит от backend'а, выбранного attention-примитива и конкретных условий, при которых включаются оптимизированные пути вычисления.

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

LINKS