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)
Что здесь важно на практике:
- Если
q,kиvпроисходят из одного входа, это self-attention. - Если вы строите decoder-only сценарий, решающую роль играет causal-маска.
- Если вы используете
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.
Связанные термины и материалы
- Multi-Head Attention (многоголовое внимание)
- Fine-tuning (дообучение)
- Latency (задержка)
- OpenLLM (BentoML) — self-hosted OpenAI-совместимый API для open-source LLM
- Llama vs Mistral: что выбрать для self-hosting, API и дообучения
Источники
- Attention Is All You Need
- MultiheadAttention — PyTorch 2.12 documentation
- torch.nn.functional.scaled_dot_product_attention — PyTorch main documentation
- torch.nn.attention — PyTorch 2.13 documentation
- MultiHeadAttention layer
- Glossary · Hugging Face
- Attention backends · Hugging Face
Вопросы и ответы
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-примитива и конкретных условий, при которых включаются оптимизированные пути вычисления.