22 Attention (Багданау)
Контекст
Seq2seq (#21) теряет информацию на длинных входах — всё сжато в один вектор. Багданау, Чо и Бенжио снимают это ограничение, изобретая механизм внимания.
Идея и механизм
Вместо одного вектора декодер на КАЖДОМ шаге вычисляет веса внимания по всем скрытым состояниям энкодера (насколько каждое релевантно текущему состоянию декодера), нормирует их softmax и берёт взвешенную сумму — «контекстный вектор» под текущий шаг генерации. Так модель динамически фокусируется на нужных словах источника.
линейная алгебра Внимание как взвешенное извлечение по релевантности
Пусть h1..n — состояния энкодера, st−1 — текущее состояние декодера. Сначала оценка релевантности каждого hi (аддитивная, через маленькую сеть):
Затем softmax превращает оценки в веса (сумма 1), и контекст — их взвешенная сумма:
Это «мягкая адресация по содержимому»: запрос (s) сопоставляется с ключами (h), а на выходе — взвешенная смесь значений. Веса α ещё и интерпретируемы — они дают выравнивание слов перевода и источника. Замените аддитивную оценку на скалярное произведение q·k — и получите ровно attention из Transformer.
PyTorch Аддитивное внимание Багданау
import torch, torch.nn.functional as F
def attention(s, H, W1, W2, v):
# s: состояние декодера; H: (n, d) состояния энкодера
scores = (v * torch.tanh(H @ W1 + s @ W2)).sum(-1) # релевантность каждого hᵢ
alpha = F.softmax(scores, dim=0) # веса, Σ = 1
context = (alpha.unsqueeze(-1) * H).sum(0) # Σ αᵢ hᵢ
return context, alpha
Почему это важно
Сразу улучшило перевод (особенно длинных фраз), дало интерпретируемость (выравнивание слов) и — главное — стало концептуальным зерном Transformer (#32): там идею довели до self-attention и сделали единственным механизмом связи токенов.
Связи
Прямое лекарство от bottleneck'а: вместо сжатия всего входа в один вектор декодер держит доступ ко всем состояниям энкодера. Внимание — это «надстройка», снявшая главное ограничение encoder-decoder.
Transformer берёт эту идею и доводит до предела: убирает рекуррентность, заменяет аддитивную оценку на масштабированное скалярное произведение и делает self-attention единственным механизмом. Всё современное внимание выросло отсюда.
Внимание — это извлечение из ассоциативной памяти по сходству. «Современные сети Хопфилда» формально показывают, что softmax-внимание = одношаговое восстановление паттерна. Старая идея «памяти-как-минимума» и новое «внимание» оказываются одним и тем же.
Вопросы пытливого ума
Веса внимания интерпретируют как «объяснение» решения — насколько это надёжно?
С осторожностью. Для выравнивания в переводе α действительно осмысленны. Но в общем случае «attention ≠ explanation»: были работы, показавшие, что можно сильно изменить веса внимания, почти не меняя выход, — значит они не однозначно «причина» решения. Полезная визуализация, но не доказательство того, на что модель «на самом деле» опирается.
Чем аддитивное внимание Багданау отличается от dot-product в Transformer?
Багданау считает оценку маленькой сетью v⊤tanh(W₁h + W₂s) — гибко, но требует обучаемых матриц и медленнее. Transformer берёт просто q·k/√d — без лишних параметров и идеально векторизуется на GPU (одно матричное умножение на всю последовательность). Для масштаба важнее простота и параллелизм, поэтому победил dot-product.
Если внимание решает длинные зависимости, зачем тут вообще оставили рекуррентность?
В 2014-м внимание было добавкой к рекуррентному энкодеру-декодеру, а не заменой: состояния hi всё ещё производит RNN. Смелый шаг — «а давайте уберём рекуррентность совсем и оставим только внимание» — сделают через три года в Transformer. Здесь внимание ещё ездит верхом на LSTM.
Что читать в оригинале
Стоит прочитать целиком — это исток attention, без которого не понять современные LLM. Ключевое — формула внимания и интерпретация как «мягкое извлечение по релевантности».