EssayAI
Блог
Блог
Математика и алгоритмы

Механизм внимания attention: формула и примеры

11 июня 2026Время чтения: 8 минут
#механизм внимания#attention#трансформер#scaled dot-product#нейронные сети

Механизм внимания (attention) появился как ответ на проблему «бутылочного горлышка» в seq2seq-сетях: весь смысл входной последовательности пытались вжать в один вектор фиксированной длины, и при длинных предложениях качество резко падало. Идея attention проста: пусть декодер сам выбирает, на какую часть входа обращать внимание при генерации каждого выходного токена. Именно этот принцип лежит в основе трансформера - архитектуры, на которой построены все современные большие языковые модели. Чтобы сразу увидеть, как температурный параметр и размерность ключей меняют распределение весов, попробуйте калькулятор ниже, а потом разберём каждую строку формулы.

Формула scaled dot-product attention

Основная формула выглядит так:

Attention(Q,K,V)=softmax ⁣(QKdk)V\text{Attention}(Q, K, V) = \text{softmax}\!\left(\frac{QK^{\top}}{\sqrt{d_k}}\right)V

Здесь QRn×dkQ \in \mathbb{R}^{n \times d_k} - матрица запросов (queries), KRm×dkK \in \mathbb{R}^{m \times d_k} - матрица ключей (keys), VRm×dvV \in \mathbb{R}^{m \times d_v} - матрица значений (values), nn - число запрашивающих позиций, mm - число источников, dkd_k - размерность ключей.

Три матрицы Q, K, V формируются из входных эмбеддингов линейными проекциями. Scores = QK^T/sqrt(d_k) вычисляются как скалярные произведения всех пар; softmax нормирует каждую строку в вероятности; итог умножается на V. Золотая строка показывает, как один токен «смотрит» на все остальные

Вычисление идёт в три шага:

  1. Оценки (scores): eij=qikj/dke_{ij} = \mathbf{q}_i \cdot \mathbf{k}_j / \sqrt{d_k}. Это скалярное произведение ii-го запроса и jj-го ключа, нормированное корнем из dkd_k.
  2. Нормировка (softmax): αij=exp(eij)/jexp(eij)\alpha_{ij} = \exp(e_{ij}) / \sum_{j'} \exp(e_{ij'}). Каждая строка суммируется в 1, то есть αij\alpha_{ij} - это вероятность «обратить внимание» на позицию jj при обработке позиции ii.
  3. Взвешенная сумма: oi=jαijvj\mathbf{o}_i = \sum_j \alpha_{ij} \mathbf{v}_j. Выходной вектор позиции ii - это взвешенная комбинация значений всех позиций.

Зачем делить на dk\sqrt{d_k}

Деление на dk\sqrt{d_k} - не косметика, а математическая необходимость. Скалярное произведение двух случайных векторов из Rdk\mathbb{R}^{d_k} имеет дисперсию порядка dkd_k. Если dk=64d_k = 64, оценки могут достигать значений порядка ±8\pm 8, и softmax от таких чисел даёт распределение, сосредоточенное почти в одной точке: один вес близок к 1, остальные - к 0. Это убивает градиент: он проходит только через одну позицию. Деление на dk\sqrt{d_k} возвращает дисперсию к единице и сохраняет градиент через все позиции.

Матрица весов внимания для 6 токенов при d_k=64 и T=1: тёмные клетки показывают пары с высоким сходством запроса и ключа
Матрица весов внимания для 6 токенов при d_k=64 и T=1: тёмные клетки показывают пары с высоким сходством запроса и ключа

Эффект заметен в калькуляторе выше: при маленьком dkd_k и высокой температуре TT матрица внимания почти однородна (высокая энтропия); при большом dkd_k и низкой TT - резко заострена.

Self-attention и его роль в трансформере

В self-attention все три матрицы QQ, KK, VV получаются из одного и того же входа линейными проекциями:

Q=XWQ,K=XWK,V=XWV,Q = X W_Q, \quad K = X W_K, \quad V = X W_V,

где XRn×dmodelX \in \mathbb{R}^{n \times d_{\text{model}}} - входные эмбеддинги, а WQ,WK,WVW_Q, W_K, W_V - обучаемые матрицы весов. Такой слой позволяет каждому токену «смотреть» на все остальные в той же последовательности и собирать контекст.

Cross-attention отличается источником: запросы QQ берутся из одной последовательности (например, декодер), а ключи и значения KK, VV - из другой (выход энкодера). Именно через cross-attention декодер трансформера «читает» закодированный вход при генерации.

Multi-Head Attention

Одной пары проекций (WQ,WK,WV)(W_Q, W_K, W_V) часто недостаточно: разные головы могут уловить разные типы зависимостей (синтаксические, семантические, позиционные). Multi-Head Attention запускает hh независимых механизмов внимания параллельно:

MultiHead(Q,K,V)=Concat(head1,,headh)WO\text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \ldots, \text{head}_h)\,W_O

где каждая голова:

headi=Attention(QWQi,  KWKi,  VWVi)\text{head}_i = \text{Attention}(Q W_{Q_i},\; K W_{K_i},\; V W_{V_i})

Размерность каждой головы dk=dmodel/hd_k = d_{\text{model}} / h, поэтому суммарное число параметров не растёт. В оригинальном трансформере dmodel=512d_{\text{model}} = 512, h=8h = 8, dk=64d_k = 64.

Практически это означает, что восемь голов одновременно строят восемь разных матриц внимания для одного и того же входа. Одна голова может учиться отслеживать синтаксические зависимости (подлежащее - сказуемое), другая - семантическое сходство токенов, третья - позиционную близость. Конкатенация результатов всех голов и финальная проекция WOW_O смешивают эти разные «взгляды» в один выходной вектор. Исследования показывают, что удаление одной головы из обученной модели почти не влияет на качество, а удаление сразу нескольких - резко его снижает: головы частично дублируют и страхуют друг друга.

Маскировка в декодере

В авторегрессионных моделях (GPT, LLaMA) декодер не должен «видеть» будущие токены при предсказании текущего. Это реализуется каузальной маской: перед softmax в строке ii все оценки eije_{ij} с j>ij > i заменяются на -\infty, поэтому exp()=0\exp(-\infty) = 0 и соответствующие веса обнуляются.

Матрица оценок до softmax приобретает форму нижнетреугольной:

E~=(e11e21e22e31e32e33)\begin{aligned} \tilde{E} &= \begin{pmatrix} e_{11} & -\infty & -\infty \\ e_{21} & e_{22} & -\infty \\ e_{31} & e_{32} & e_{33} \end{pmatrix} \end{aligned}

После softmax каждая строка суммируется в 1 только по разрешённым позициям.

На практике маска реализуется добавлением матрицы MM к матрице оценок перед softmax:

Mij={0,ji,j>iM_{ij} = \begin{cases} 0, & j \le i \\ -\infty, & j > i \end{cases}

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

Энтропия внимания как метрика качества

Для каждой строки матрицы внимания можно вычислить энтропию Шеннона:

Hi=jαijlog2αijH_i = -\sum_j \alpha_{ij} \log_2 \alpha_{ij}

При nn позициях равномерное распределение даёт Hmax=log2nH_{\max} = \log_2 n бит; сосредоточенный «пик» - близко к 0. Средняя энтропия по всем головам используется как диагностика: слишком высокая означает, что модель не может выбрать релевантный контекст; слишком низкая - что модель «застряла» на одном токене и игнорирует остальные.

Калькулятор выше отображает среднюю энтропию в реальном времени при изменении параметра температуры. При температуре T=0.3T = 0.3 и n=6n = 6 токенах энтропия опускается ниже 0.5 бит - модель сфокусирована почти на одной позиции. При T=2.0T = 2.0 энтропия приближается к log262.58\log_2 6 \approx 2.58 бит - внимание почти равномерно. В хорошо обученных трансформерах разные головы работают в разных режимах: «острые» головы фокусируются на конкретных грамматических связях, «мягкие» усредняют смысловой контекст.

Анимация показывает, как softmax-распределение одной строки матрицы оценок меняется при увеличении температуры T от 0.3 до 2.5: при малых T кривая острая (низкая энтропия), при больших T - почти плоская (высокая энтропия). Золотая точка отмечает текущую энтропию

Частые ошибки

  • Забытое деление на dk\sqrt{d_k}. Без нормировки при dk=64d_k = 64 оценки легко достигают ±8\pm 8, softmax вырождается, и градиент умирает. Это самая распространённая ошибка при реализации с нуля.
  • Путаница Q, K и V. Запросы и ключи участвуют в вычислении весов α\alpha, значения - только в итоговой сумме. Если перепутать KK и VV, сеть всё равно «запустится», но учиться не будет.
  • Self-attention без позиционного кодирования. Механизм внимания инвариантен к перестановке: он не знает, что «кот» стоит перед «сидел». Без sinusoidal или RoPE позиций смысл порядка теряется.
  • Игнорирование маски при обучении. В авторегрессионной задаче утечка информации о будущих токенах даёт хорошие лоссы на обучении, но нулевое качество на инференсе.
  • Multi-head как ансамбль независимых моделей. Головы разделяют dmodeld_{\text{model}}, а не дублируют его; конкатенация выходов проецируется обратно матрицей WOW_O.

FAQ

Почему softmax берётся по строкам, а не по столбцам матрицы оценок? Каждая строка ii отвечает на вопрос: «как токен ii распределяет внимание по всем позициям источника?». Сумма весов в строке равна 1 - это корректное вероятностное распределение. Нормировка по столбцам имела бы другой смысл и не давала бы корректного взвешенного среднего значений.

Чем self-attention отличается от cross-attention? В self-attention QQ, KK, VV берутся из одной последовательности, и каждый токен анализирует контекст внутри той же последовательности. В cross-attention QQ из одной последовательности, KK и VV из другой. В трансформере cross-attention используется в декодере для обращения к выходу энкодера.

Как связан параметр температуры TT с dkd_k? Стандартная нормировка 1/dk1/\sqrt{d_k} - это частный случай температурного масштабирования при T=1T = 1. Явная температура TT добавляется поверх: eij=(qikj/dk)/Te_{ij} = (\mathbf{q}_i \cdot \mathbf{k}_j / \sqrt{d_k}) / T. При T<1T < 1 распределение заостряется (меньше энтропия), при T>1T > 1 - сглаживается. В инференсе языковых моделей T>1T > 1 часто называют «температурой генерации» и используют для увеличения разнообразия ответов.

Коротко

Механизм внимания вычисляет взвешенную комбинацию значений VV, где веса определяются сходством запросов QQ и ключей KK через формулу softmax(QK/dk)\text{softmax}(QK^\top / \sqrt{d_k}). Деление на dk\sqrt{d_k} удерживает дисперсию оценок стабильной и сохраняет градиент. Multi-Head Attention запускает несколько таких механизмов параллельно с пониженной размерностью, позволяя модели одновременно улавливать разные типы зависимостей. Маскировка будущих позиций через -\infty обеспечивает авторегрессионное свойство декодера.

Доверьте текст нейросети EssayAI

Открыть EssayAI

Бесплатно, на русском языке и без VPN

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