Математика глубокого обучения

Внимание

Откуда берётся деление на √d — дисперсионный аргумент, а не эстетика

Шаг 80 из 117 · ~30 мин

Формула

Attn(Q,K,V)=softmax ⁣(QKd)V\text{Attn}(Q,K,V) = \htmlData{k=weights}{\text{softmax}\!\left(\frac{\htmlData{k=scores}{QK^\top}}{\htmlData{k=scale}{\sqrt{d}}}\right)} V

Три шага, каждый из которых — контракция из урока 040:

’bhqd,bhkd->bhqk’softmax по k’bhqk,bhkd->bhqd’\texttt{'bhqd,bhkd->bhqk'} \quad\to\quad \text{softmax по } k \quad\to\quad \texttt{'bhqk,bhkd->bhqd'}

Первый сворачивает размер головы, давая матрицу «каждый запрос против каждого ключа». Последний сворачивает ключи, возвращая размер головы. Обе операции стоят одинаково — внимание состоит из двух равно дорогих умножений, а не из одного.

Откуда √d

Это единственное место формулы, которое обычно принимают на веру. Аргумент чисто дисперсионный и проверяется в три строки.

Пусть компоненты qq и kk независимы, с нулевым средним и единичной дисперсией. Тогда

qk=i=1dqiki,Var(qk)=i=1dVar(qiki)=dq \cdot k = \sum_{i=1}^{d} q_i k_i, \qquad \operatorname{Var}(q \cdot k) = \sum_{i=1}^d \operatorname{Var}(q_i k_i) = d

потому что дисперсия произведения независимых центрированных величин с единичной дисперсией равна единице, а дисперсии независимых слагаемых складываются (блок 3, урок 060).

Проверено численно:

ddизмеренная дисперсияпредсказаннаяст. откл.
444.034.03442.012.01
646464.2164.2164648.018.01
102410241017.81017.81024102431.931.9

Значит, без деления оценки имеют стандартное отклонение d\sqrt{d}: при d=64d = 64 логиты разбросаны на ±8\pm 8, при d=1024d = 1024 — на ±32\pm 32. Деление на d\sqrt{d} возвращает дисперсию к единице независимо от dd. В этом весь смысл: масштаб не должен зависеть от размера головы.

Почему это важно, а не косметично

Если бы softmax был линейным, масштаб не имел бы значения. Но он насыщается, и последствия из урока 060 применяются напрямую.

Выключите масштабирование в виджете и посмотрите на два числа: энтропию строки и масштаб градиента.

ключи

запросы
котселнаковрикиуснул
кот
сел
на
коврик
и
уснул
размер головы d 64
температура T 1
разброс оценок
4.38
энтропия строки
1.986 бит
максимальный вес
0.8266
масштаб градиента
2.48e-1

Что стоит проделать:

  1. выключите масштаб при d=64d = 64 — энтропия строки падает, максимальный вес растёт;
  2. поднимите dd до 256256 без масштабирования — насыщение усиливается, и появляется предупреждение про градиент;
  3. включите масштаб обратно — распределение возвращается к осмысленному при любом dd.

Числа для одного прогона при d=64d = 64 и восьми ключах:

разброс оценокэнтропия строкимаксимальный вес
без масштаба25.125.10.9940.994 бита0.5470.547
с масштабом3.143.142.2952.295 бита0.3550.355

Равномерное распределение по восьми ключам дало бы 33 бита. То есть без масштабирования внимание уже почти определилось, не увидев ни одного обучающего примера — просто из-за геометрии случайной инициализации.

Цена: где на самом деле уходят вычисления

Здесь стоит поправить распространённое утверждение. «Внимание квадратично, поэтому оно доминирует» — верно не всегда, и порог считается точно.

Для одного слоя с hh головами размера dd и моделью ширины D=hdD = hd:

частьстоимость
проекции Q,K,V,OQ, K, V, O4nD24 n D^2
две контракции внимания2n2D2 n^2 D

Отношение равно n2D\frac{n}{2D}, то есть внимание перевешивает проекции только при n>2Dn > 2D. Проверим при D=768D = 768:

nnвнимание / проекции
1281280.080.08
102410240.670.67
819281925.35.3

При коротком контексте внимание — малая часть работы, и оптимизировать его бессмысленно; основное время уходит в матрицы проекций. Квадратичный член начинает доминировать где-то за тысячей токенов, и вот тогда появляются FlashAttention, разреженные схемы и всё прочее.

Посмотрите на обе контракции в нотации индексов — квадратичность видна как две свободные буквы вместо одной.

bhqd, bhkd bhqk

индексразмерроль
b
1
остаётся
h
12
остаётся
q
64
остаётся
d
64
суммируется
k
64
остаётся
форма результата
[1, 12, 64, 64]
элементов
49,152
умножений-сложений
3,145,728
операций на элемент
64
Свёртка по d, а q и k остаются оба — отсюда квадратичность по длине. Потяните q и k вместе и посмотрите, как растёт число операций: вдвое большая длина даёт вчетверо больше работы.

Что ещё стоит знать

Внимание — это не поиск по ключам. Softmax даёт распределение по всем ключам, а не выбор одного. Название «query/key/value» пришло из аналогии со словарём, но операция мягкая: всегда используются все значения, просто с разными весами.

Оно инвариантно к перестановке. Формула не содержит информации о порядке токенов — переставьте их, и веса переставятся вместе с ними. Отсюда необходимость позиционных кодировок, о которых урок 110. Это не деталь реализации, а свойство самой операции.

Оно не имеет параметров. В формуле выше нет обучаемых весов вовсе — они все в проекциях QQ, KK, VV, OO. Само внимание — фиксированная функция трёх аргументов, и это одна из причин, по которой оно так хорошо переносится между задачами.

Источники

Проверки

0 из 2
  1. Почему √d

    Отметьте все верные утверждения о scaled dot-product attention.

  2. Где уходят вычисления внимания

    Реализуйте attention_cost(n, model_dim, heads) — верните [head_dim, attn_flops, proj_flops, ratio]:

    • head_dim = D/hD / h — размер одной головы;
    • attn_flops = 2n2D2 n^2 D — две контракции внимания (оценки и выход, каждая по n2Dn^2 D);
    • proj_flops = 4nD24 n D^2 — четыре проекции QQ, KK, VV, OO;
    • ratio = attn_flops / proj_flops.

    Обратите внимание, что число голов не влияет на стоимость: суммарная работа зависит только от nn и DD, потому что головы делят между собой одну и ту же ширину модели.

    Проверить себя можно так: ratio обязано равняться n2D\dfrac{n}{2D} — сократите формулы и убедитесь. Отсюда сразу виден порог: внимание перевешивает проекции при n>2Dn > 2D.

    функция attention_cost

    Загрузка редактора…

    Ctrl/⌘ + Enter