Self-Attention
Самовнимание позволяет каждому токену последовательности учитывать все остальные токены с помощью запросов, ключей и значений, полученных из тех же входных данных. Основа трансформеров.
Самовнимание — это разновидность механизма внимания, в которой запросы, ключи и значения берутся из одной и той же последовательности, поэтому каждый токен формирует новое представление с учётом всех остальных токенов этой последовательности. Один слой самовнимания может за один шаг связать первое и последнее слова абзаца или противоположные углы изображения, тогда как рекуррентной нейронной сети (RNN) требуется по одному шагу на каждую позицию, а свёрточной нейронной сети (CNN) — много последовательно расположенных слоёв, чтобы расширить область обзора. В сочетании с полносвязными слоями самовнимание образует трансформер, представленный в статье Attention Is All You Need 2017 года. Эта архитектура лежит в основе больших языковых моделей (LLM), визуальных трансформеров (ViT) и детекторов на основе трансформеров.
Как работает самовнимание#
Каждый входной токен, представленный как эмбеддинг, умножается на три обучаемые матрицы, чтобы получить запрос, ключ и значение. Выход для токена i — это взвешенное среднее векторов значений всех токенов; веса вычисляются с помощью softmax от масштабированных скалярных произведений запроса токена i со всеми ключами. Это масштабированное скалярное внимание описано на странице о механизме внимания. Поскольку запросы, ключи и значения являются проекциями одних и тех же токенов, последовательность из n токенов порождает матрицу весов размера n × n. В предложении «Животное не перешло улицу, потому что слишком устало» строка для слова «оно» может присвоить большую часть веса слову «животное» и перенести его значение в собственное представление.
Многоголовое самовнимание выполняет несколько таких вычислений параллельно на проекциях меньшего размера, а затем объединяет результаты. Благодаря этому разные головы могут отслеживать разные связи: например, одна — синтаксис, другая — кореференцию. В исходном трансформере использовались 8 голов по 64 измерения в модели размерностью 512.
Отсутствие информации о порядке и причинная маска#
Самовнимание воспринимает вход как множество. Перестановка токенов приводит к такой же перестановке выходов, не меняя ничего другого, поэтому модели добавляют информацию о позициях: например, синусоидальные эмбеддинги в исходном трансформере или вращательные позиционные эмбеддинги (RoPE) в большинстве современных LLM. Кодировщики, такие как BERT, позволяют каждому токену обращать внимание в обоих направлениях. LLM только с декодером применяют причинную маску, чтобы каждый токен учитывал только себя и предыдущие токены. Это позволяет модели генерировать текст слева направо и повторно использовать ключи и значения предыдущих токенов из KV-кэша. MultiheadAttention в PyTorch демонстрирует оба свойства, если передать один и тот же тензор в качестве запроса, ключа и значения:
import torch
torch.manual_seed(0)
tokens = torch.randn(1, 5, 16) # Одна последовательность из 5 токенов, в каждом по 16 признаков
attn = torch.nn.MultiheadAttention(embed_dim=16, num_heads=2, batch_first=True)
# Самовнимание: запросы, ключи и значения — это проекции одних и тех же токенов
out, weights = attn(tokens, tokens, tokens)
print("Attention weights shape:", tuple(weights.shape))
# Перестановка токенов меняет только порядок выходов, поэтому без позиционной информации порядок слов не виден
perm = torch.tensor([3, 0, 4, 1, 2])
out_shuffled, _ = attn(tokens[:, perm], tokens[:, perm], tokens[:, perm])
print("Same outputs after shuffling:", torch.allclose(out_shuffled, out[:, perm], atol=1e-6))
# Причинная маска блокирует внимание к последующим токенам, как в LLM только с декодером
mask = torch.triu(torch.ones(5, 5, dtype=torch.bool), diagonal=1)
_, causal_weights = attn(tokens, tokens, tokens, attn_mask=mask)
print(causal_weights[0].detach().round(decimals=2))Вывод содержит форму весов (1, 5, 5), True для теста с перестановкой и нижнетреугольную матрицу: первый токен присваивает себе вес 1.00, второй распределяет веса 0.31 и 0.69 между первыми двумя токенами, а все элементы выше диагонали равны 0.00.
Самовнимание и связанные понятия#
- Механизм внимания: общая операция, которая взвешивает значения по степени сходства запроса и ключа. Самовнимание — это случай, когда все три элемента берутся из одной последовательности.
- Перекрёстное внимание: запросы берутся из одной последовательности, а ключи и значения — из другой. Декодер перевода обращается к закодированному исходному предложению, объектные запросы декодера DETR — к признакам изображения, а диффузионная модель преобразования текста в изображение — к запросу.
- Свёртка: применяет один и тот же небольшой фильтр в каждой позиции, поэтому каждый выход охватывает фиксированное локальное окно с весами, не зависящими от содержимого. Самовнимание вычисляет веса на основе содержимого и охватывает весь вход.
Исходный трансформер с кодировщиком и декодером сочетает двунаправленное самовнимание, причинное самовнимание и перекрёстное внимание:
Вычислительные затраты и эффективные варианты#
Вычисление оценки для каждой пары токенов приводит к тому, что время и объём памяти растут квадратично относительно длины последовательности: 1 000 токенов дают миллион оценок на голову, а 100 000 токенов — десять миллиардов. FlashAttention вычисляет точное самовнимание блоками, не сохраняя полную матрицу; внимание с групповыми запросами (GQA) использует общие ключи и значения для нескольких голов, сокращая KV-кэш; а внимание с скользящим окном, разреженное внимание и линейное внимание уменьшают число пар. В компьютерном зрении число токенов зависит от разрешения изображения, поэтому многие детекторы применяют самовнимание только там, где карты признаков имеют наименьший размер. YOLO26 использует многоголовое самовнимание только в блоке C2PSA в конце бэкбона и в одном блоке C3k2 с механизмом внимания в шее; оба блока работают с картой признаков 20 × 20 с шагом 32 для изображения размером 640 пикселей, то есть с 400 токенами. Модуль внимания вычисляет запросы, ключи и значения с помощью одной свёртки 1 × 1 по этой карте и добавляет позиционную информацию с помощью глубинной свёртки 3 × 3, применённой к значениям.










