Self-attention — это механизм, который для каждого токена в последовательности вычисляет, на какие другие токены этой же последовательности нужно смотреть сильнее, чтобы получить его контекстное представление. На практике это базовый строительный блок архитектуры Transformer: он хорошо ловит дальние зависимости и легко распараллеливается, но по умолчанию требует квадратичной памяти и времени по длине последовательности, поэтому без специальных модификаций плохо подходит для очень длинных документов, длинного аудио, видео и сценариев со строгими ограничениями по задержке и памяти.
Простыми словами
Если упростить, self-attention отвечает на вопрос: какие слова вокруг важны для понимания этого слова прямо сейчас. Не вообще по словарю, а именно в текущем контексте.
Когда модель читает фразу, она не обрабатывает слово изолированно. Для слова лук в предложении Он купил лук для супа полезны слова купил и супа. В предложении Он натянул лук перед выстрелом важными станут уже натянул и выстрелом. Само слово то же, но его представление в модели меняется за счет контекста.
В этом и смысл self-attention: каждый токен получает не одно фиксированное значение, а представление, собранное из всей последовательности с разными весами важности.
Как это работает
Механизм работает не со словами как таковыми, а с их векторными представлениями. Для каждого токена модель строит три вектора: Query, Key и Value. Дальше она сравнивает Query текущего токена с Key остальных токенов и получает оценки релевантности. После нормализации эти оценки становятся весами, которыми усредняются Value.
| Компонент | Что делает | Зачем нужен |
|---|---|---|
| Входные эмбеддинги | Преобразуют токены в векторы | Дают модели числовое представление текста |
| Позиционная информация | Добавляет сведения о порядке токенов | Без нее self-attention не знает, что было раньше и позже |
| Query | Формулирует, что ищет текущий токен | Позволяет сравнивать токен с контекстом |
| Key | Описывает, чем токен может быть полезен другим | Участвует в вычислении веса внимания |
| Value | Содержит информацию, которую токен передает дальше | Из Value собирается итоговое представление |
| Softmax | Преобразует оценки в веса | Делает веса сравнимыми и суммирующимися к 1 |
| Multi-head | Считает несколько attention-проекций параллельно | Позволяет ловить разные типы связей одновременно |
Классическая формула выглядит так: Attention(Q, K, V) = softmax(QK^T / sqrt(d_k))V.
Практически процесс можно описать так:
- Токены превращаются в эмбеддинги.
- К эмбеддингам добавляется позиционная информация.
- Три линейных слоя строят матрицы
Q,KиV. - Считаются попарные оценки сходства между токенами.
- Оценки масштабируются и пропускаются через
softmax. - Полученные веса используются для взвешенной суммы
V. - Результаты нескольких голов внимания объединяются.
В языковых моделях для генерации текста часто используется causal self-attention: токен может смотреть только на себя и предыдущие токены, но не на будущие. Это ограничение задается маской.
Важно понимать, что self-attention сам по себе не хранит «знание о мире» и не делает логический вывод. Он лишь строит более полезные контекстные представления, на которых потом работают остальные слои модели.
Зачем нужно
Для практики self-attention полезен по нескольким причинам.
- Улавливает дальние зависимости. Токен может напрямую учитывать слова, стоящие далеко в тексте, без длинной цепочки промежуточных состояний.
- Дает контекстно-зависимые представления. Одно и то же слово получает разный смысл в разных предложениях.
- Хорошо параллелится. В отличие от классических рекуррентных сетей, обработку токенов можно выполнять одновременно, что удобно для обучения на GPU.
- Масштабируется по выразительности. Несколько голов внимания позволяют модели одновременно отслеживать синтаксис, локальный контекст, согласование и тематические связи.
- Работает не только с текстом. Идея перенесена в обработку изображений, аудио, биологических последовательностей и мультимодальных моделей.
На уровне инженерии это означает, что self-attention особенно полезен там, где важны сложные контекстные зависимости: машинный перевод, извлечение фактов, поиск по документам, генерация кода, суммаризация и диалоговые системы.
Пример
Практический пример — снятие неоднозначности слова.
Возьмем два предложения:
| Предложение | Для токена лук важнее |
Что меняется |
|---|---|---|
Он купил лук для супа |
купил, супа |
Представление смещается к значению «овощ» |
Он натянул лук перед выстрелом |
натянул, выстрелом |
Представление смещается к значению «оружие» |
Здесь не нужно вручную описывать правило «если рядом суп, то это овощ». Модель сама учится распределять веса внимания так, чтобы контекст менял представление токена.
Для практикующего инженера это означает следующее: если downstream-задача зависит от смысла слова в контексте, self-attention обычно полезнее простого усреднения эмбеддингов или мешка слов. Но это не гарантирует интерпретируемость: из того, что вес на слове высокий, не всегда следует, что именно оно стало причиной финального решения модели.
Заблуждения и ограничения
1. Self-attention — это не «человеческое внимание»
Название легко вводит в заблуждение. Механизм не имитирует когнитивное внимание в строгом смысле, а лишь вычисляет веса взаимодействия между токенами.
2. Веса attention не равны объяснению решения
По картинке attention-weight удобно смотреть, куда модель «смотрит», но это не полноценное объяснение. На результат влияют и остальные слои, и residual-связи, и MLP-блоки.
3. Без позиционной информации порядок теряется
Чистый self-attention не знает, какой токен первый, а какой последний. Поэтому нужны позиционные эмбеддинги или их аналоги.
4. Стандартный self-attention плохо масштабируется на очень длинные последовательности
Полная матрица внимания требует O(n^2) операций и памяти по длине последовательности n. На коротких и средних входах это нормально, но для длинных документов, аудиодорожек и видео стоимость быстро становится высокой. В таких случаях используют оконное, разреженное, линейное, иерархическое внимание или специализированные реализации вроде FlashAttention.
5. Self-attention не всегда лучший выбор
- Для маленьких табличных задач без выраженной последовательной структуры он часто избыточен.
- Для жесткого real-time на слабом железе квадратичная сложность может быть неприемлемой.
- Для очень длинных сигналов без модификаций архитектуры он быстро упирается в память.
- Для задач, где важна сильная локальная индуктивная предвзятость, свертки иногда эффективнее и дешевле.
Итоговый практический вывод простой: self-attention — мощный универсальный механизм, но не бесплатный и не универсально оптимальный.
Частые вопросы
Чем self-attention отличается от обычного attention?
В self-attention запросы, ключи и значения берутся из одной и той же последовательности. В cross-attention запросы приходят из одной последовательности, а ключи и значения — из другой. Поэтому self-attention связывает элементы внутри одного контекста, а cross-attention — между двумя контекстами.
Зачем нужен positional encoding?
Потому что self-attention сам по себе инвариантен к перестановке токенов. Без позиции модель не отличит собака укусила человека от человек укусил собаку, если смотреть только на набор токенов и их попарные взаимодействия.
Что такое multi-head attention?
Это несколько независимых механизмов внимания, работающих параллельно на разных проекциях признаков. Одна голова может сильнее реагировать на локальные связи, другая — на согласование или дальние зависимости. После этого результаты объединяются.
Можно ли применять self-attention к длинным документам?
Можно, но не всегда в лоб. Для длинных входов стандартная полная матрица внимания дорога по памяти и времени. На практике используют chunking, sliding window, sparse attention, retrieval, иерархические схемы или специальные оптимизации ядра.
Связанные понятия
- Transformer — архитектура, в которой self-attention стал центральным механизмом обработки последовательностей.
- Scaled dot-product attention — базовая форма вычисления внимания через скалярные произведения
QиK. - Multi-head attention — параллельные головы внимания, расширяющие выразительность модели.
- Cross-attention — внимание между двумя разными последовательностями, например между декодером и энкодером.
- Positional encoding — способ добавить в модель информацию о порядке токенов.
- Causal mask — ограничение, запрещающее токену смотреть в будущее при авторегрессионной генерации.
- FlashAttention — класс оптимизированных реализаций attention, уменьшающих накладные расходы по памяти и ускоряющих обучение и инференс.