Эпоха 3 · Взрыв deep learning · 2014

22 Attention (Багданау)

Neural Machine Translation by Jointly Learning to Align and Translate · Bahdanau, Cho & Bengio · ICLR 2015
🟥 читать целиком~45–60 миноригинал ↗
Суть за 20 секунд. Чинит узкое место seq2seq: вместо одного вектора декодер на каждом шаге сам решает, на какие слова источника смотреть, через взвешенную сумму состояний энкодера. Дало интерпретируемые выравнивания и скачок на длинных фразах. Концептуальное зерно Transformer.

Контекст

Seq2seq (#21) теряет информацию на длинных входах — всё сжато в один вектор. Багданау, Чо и Бенжио снимают это ограничение, изобретая механизм внимания.

Идея и механизм

Вместо одного вектора декодер на КАЖДОМ шаге вычисляет веса внимания по всем скрытым состояниям энкодера (насколько каждое релевантно текущему состоянию декодера), нормирует их softmax и берёт взвешенную сумму — «контекстный вектор» под текущий шаг генерации. Так модель динамически фокусируется на нужных словах источника.

линейная алгебра Внимание как взвешенное извлечение по релевантности

Пусть h1..n — состояния энкодера, st−1 — текущее состояние декодера. Сначала оценка релевантности каждого hi (аддитивная, через маленькую сеть):

scorei = v⊤ tanh(W1 hi + W2 st−1)

Затем softmax превращает оценки в веса (сумма 1), и контекст — их взвешенная сумма:

αi = escoreiΣj escorej,    ct = Σi αi hi

Это «мягкая адресация по содержимому»: запрос (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
h₁ h₂ h₃ h₄ состояния энкодера Σ αᵢhᵢ веса α (толщина = внимание) декодер s выбирает, на что смотреть
Декодер на каждом шаге взвешивает все состояния энкодера (толщина = вес α) и берёт их сумму как контекст. Внимание динамически перемещается по источнику.
Аналогия. Тому же синхронисту наконец разрешили держать исходный текст перед глазами и водить пальцем по нужному слову, пока он переводит. Не надо запоминать всю фразу — на каждом шаге он смотрит ровно туда, что сейчас переводит. Веса внимания — это и есть «куда показывает палец».

Почему это важно

Сразу улучшило перевод (особенно длинных фраз), дало интерпретируемость (выравнивание слов) и — главное — стало концептуальным зерном Transformer (#32): там идею довели до self-attention и сделали единственным механизмом связи токенов.

Связи

← чинит21. Seq2Seq

Прямое лекарство от bottleneck'а: вместо сжатия всего входа в один вектор декодер держит доступ ко всем состояниям энкодера. Внимание — это «надстройка», снявшая главное ограничение encoder-decoder.

→ ведёт к32. Transformer

Transformer берёт эту идею и доводит до предела: убирает рекуррентность, заменяет аддитивную оценку на масштабированное скалярное произведение и делает self-attention единственным механизмом. Всё современное внимание выросло отсюда.

↔ перекликается6. Сеть Хопфилда

Внимание — это извлечение из ассоциативной памяти по сходству. «Современные сети Хопфилда» формально показывают, что 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. Ключевое — формула внимания и интерпретация как «мягкое извлечение по релевантности».