Внимание: как трансформер решает, на что смотреть

Word2Vec показал: слова — это векторы, и близость по смыслу = близость в пространстве. Механизм внимания (attention) делает следующий шаг: каждое слово активно смотрит на остальные и собирает из них контекст — тем сильнее, чем ближе они ему по смыслу. Это сердце трансформеров, на которых построены нынешние языковые модели.

Внимание — это мягкий поиск

Представьте словарь-справочник: по точному ключу он возвращает одно значение. Внимание — это его «мягкая» версия. У каждого токена есть три вектора: запрос q (что я ищу), ключ k (чем я могу быть полезен) и значение v (что я отдам). Чтобы собрать контекст для запроса, считаем его схожесть с каждым ключом через скалярное произведение. Схожести превращаем в веса и берём взвешенную сумму значений:

\text{score}_i = \frac{q \cdot k_i}{\sqrt{d}}, \qquad \alpha = \operatorname{softmax}(\text{score}), \qquad \text{out} = \sum_i \alpha_i\, v_i.

Деление на \sqrt{d} — нормировка, чтобы при большой размерности d скалярные произведения не разрастались и softmax не «схлопывался» в один токен слишком рано.

Softmax и температура

\operatorname{softmax} превращает произвольные числа в распределение (положительные, в сумме 1):

\alpha_i = \frac{e^{\text{score}_i / \tau}}{\sum_j e^{\text{score}_j / \tau}}.

Температура \tau управляет резкостью внимания. При \tau \to 0 всё внимание уходит на единственный самый похожий ключ (жёсткий argmax). При \tau \to \infty веса выравниваются — токен смотрит на всех одинаково и контекст размывается.

ПредупреждениеТемпература — учебная ручка виджета, а не деталь трансформера

В настоящем слое внимания температуры нет: там ровно одна фиксированная нормировка 1/\sqrt{d}, и крутить её никто не даёт. Температуру вы встретите в другом месте — на выходе модели, когда из предсказанного распределения по словарю выбирают следующий токен; это параметр генерации, а не часть архитектуры. Мы вставили \tau в веса внимания только затем, чтобы вы могли руками покрутить резкость и увидеть, что делает softmax. По смыслу \tau и \sqrt{d} — одна и та же ручка масштаба, просто в трансформере её раз и навсегда зафиксировали.

Потрогайте внимание

Токены живут в игрушечном 2D «пространстве смысла». Кликните любой, чтобы сделать его запросом — и увидите, как он распределяет внимание по остальным (толщина связи = вес). Перетаскивайте токены: придвинете слово ближе по смыслу — внимание к нему сразу вырастет. Покрутите температуру \tau: от острого выбора одного соседа до размытого взгляда на всех.

УведомлениеПочему это масштабируется

Здесь схожесть — скалярное произведение в 2D. В настоящем трансформере q, k, v получаются из эмбеддинга обучаемыми матрицами W_Q, W_K, W_V, а d — уже не 2, а десятки или сотни измерений. Точное число зависит от модели, причём одна голова работает не со всем эмбеддингом, а со своим куском: полная размерность делится между головами, и на голову приходится заметно меньше, чем на модель целиком. Несколько «голов» внимания параллельно смотрят на разное: одна — на грамматику, другая — на то, к чему относится местоимение, третья — на тему. Но арифметика — ровно та, что на этой картинке.

СоветСуть

Внимание не «понимает» текст — оно вычисляет мягкое среднее по схожести. Но если близость в пространстве эмбеддингов совпадает с близостью по смыслу (а эмбеддинги именно этому и учат), то взвешивание по q \cdot k само вытаскивает нужный контекст: местоимение «смотрит» на своё существительное, глагол — на подлежащее. Из этой простой операции, повторённой слой за слоем, и вырастает то, что мы называем пониманием текста.

Связи

  • Word2Vec — откуда вообще берутся векторы слов, по которым считается схожесть
  • PCA и eigenfaces — там та же идея: выделить «важные» направления, только жёстко и без обучения
  • GD, momentum, Adam — матрицы W_Q, W_K, W_V обучаются тем самым градиентным спуском
Наверх