Математика глубокого обучения
Внимание
Откуда берётся деление на √d — дисперсионный аргумент, а не эстетика
Формула
Три шага, каждый из которых — контракция из урока 040:
Первый сворачивает размер головы, давая матрицу «каждый запрос против каждого ключа». Последний сворачивает ключи, возвращая размер головы. Обе операции стоят одинаково — внимание состоит из двух равно дорогих умножений, а не из одного.
Откуда √d
Это единственное место формулы, которое обычно принимают на веру. Аргумент чисто дисперсионный и проверяется в три строки.
Пусть компоненты и независимы, с нулевым средним и единичной дисперсией. Тогда
потому что дисперсия произведения независимых центрированных величин с единичной дисперсией равна единице, а дисперсии независимых слагаемых складываются (блок 3, урок 060).
Проверено численно:
| измеренная дисперсия | предсказанная | ст. откл. | |
|---|---|---|---|
Значит, без деления оценки имеют стандартное отклонение : при логиты разбросаны на , при — на . Деление на возвращает дисперсию к единице независимо от . В этом весь смысл: масштаб не должен зависеть от размера головы.
Почему это важно, а не косметично
Если бы softmax был линейным, масштаб не имел бы значения. Но он насыщается, и последствия из урока 060 применяются напрямую.
Выключите масштабирование в виджете и посмотрите на два числа: энтропию строки и масштаб градиента.
Что стоит проделать:
- выключите масштаб при — энтропия строки падает, максимальный вес растёт;
- поднимите до без масштабирования — насыщение усиливается, и появляется предупреждение про градиент;
- включите масштаб обратно — распределение возвращается к осмысленному при любом .
Числа для одного прогона при и восьми ключах:
| разброс оценок | энтропия строки | максимальный вес | |
|---|---|---|---|
| без масштаба | бита | ||
| с масштабом | бита |
Равномерное распределение по восьми ключам дало бы бита. То есть без масштабирования внимание уже почти определилось, не увидев ни одного обучающего примера — просто из-за геометрии случайной инициализации.
Цена: где на самом деле уходят вычисления
Здесь стоит поправить распространённое утверждение. «Внимание квадратично, поэтому оно доминирует» — верно не всегда, и порог считается точно.
Для одного слоя с головами размера и моделью ширины :
| часть | стоимость |
|---|---|
| проекции | |
| две контракции внимания |
Отношение равно , то есть внимание перевешивает проекции только при . Проверим при :
| внимание / проекции | |
|---|---|
При коротком контексте внимание — малая часть работы, и оптимизировать его бессмысленно; основное время уходит в матрицы проекций. Квадратичный член начинает доминировать где-то за тысячей токенов, и вот тогда появляются FlashAttention, разреженные схемы и всё прочее.
Посмотрите на обе контракции в нотации индексов — квадратичность видна как две свободные буквы вместо одной.
Что ещё стоит знать
Внимание — это не поиск по ключам. Softmax даёт распределение по всем ключам, а не выбор одного. Название «query/key/value» пришло из аналогии со словарём, но операция мягкая: всегда используются все значения, просто с разными весами.
Оно инвариантно к перестановке. Формула не содержит информации о порядке токенов — переставьте их, и веса переставятся вместе с ними. Отсюда необходимость позиционных кодировок, о которых урок 110. Это не деталь реализации, а свойство самой операции.
Оно не имеет параметров. В формуле выше нет обучаемых весов вовсе — они все в проекциях , , , . Само внимание — фиксированная функция трёх аргументов, и это одна из причин, по которой оно так хорошо переносится между задачами.
Источники
- Vaswani и др. — Attention Is All You Need — Scaled dot-product attention, сноска про √d
- Bahdanau и др. — Neural Machine Translation by Jointly Learning to Align and Translate — Аддитивное внимание, предшественник
Проверки
0 из 2Почему √d
Отметьте все верные утверждения о scaled dot-product attention.
Где уходят вычисления внимания
Реализуйте
attention_cost(n, model_dim, heads)— верните[head_dim, attn_flops, proj_flops, ratio]:head_dim= — размер одной головы;attn_flops= — две контракции внимания (оценки и выход, каждая по );proj_flops= — четыре проекции , , , ;ratio=attn_flops / proj_flops.
Обратите внимание, что число голов не влияет на стоимость: суммарная работа зависит только от и , потому что головы делят между собой одну и ту же ширину модели.
Проверить себя можно так:
ratioобязано равняться — сократите формулы и убедитесь. Отсюда сразу виден порог: внимание перевешивает проекции при .Загрузка редактора…
Ctrl/⌘ + Enter