Внимание в LLM · часть 10

Linear attention

До сих пор мы пытались сделать квадрат меньше. Linear attention идёт дальше: меняет порядок умножений так, чтобы матрица «каждый с каждым» вообще не появлялась.

Не считать каждую пару отдельно

Обычный causal attention для каждого нового запроса заново просматривает всё прошлое. Linear attention сначала сворачивает ключи и значения в одну компактную сводку, а затем применяет к ней запрос. Число шагов растёт вместе с длиной контекста, а не с её квадратом.

Зафиксируйте длину контекста и сравните режимы «Пары» и «Сводка». Какие промежуточные данные нужны каждому? Затем увеличьте длину и объясните, почему перестановка умножений возможна для показанного ядра, но не переносится автоматически на softmax.

Два порядка вычислений

матрица пар
Способ вычисления
Длина контекста
Попарный путьКаждый запрос соединяется со всеми доступными ключами; число связей растёт квадратично.
позиция 11 ключдоступный causal-префикс
позиция 33 ключадоступный causal-префикс
позиция 44 ключадоступный causal-префикс
позиция 66 ключейдоступный causal-префикс
позиция 77 ключейдоступный causal-префикс
позиция 99 ключейдоступный causal-префикс
позиция 1010 ключейдоступный causal-префикс
позиция 1212 ключейдоступный causal-префикс
78 пар запрос–ключКвадратичный рост работы; память хранит позиции
Перестановка порядка умноженийДля факторизованного ядра можно сначала накопить общую сводку ключей и значений. Так исчезает матрица всех пар; равенство с обычным softmax из этого не следует.

Скобки можно переставить

Обозначим через ϕ признаковое отображение (feature map), одинаково применяемое к запросам и ключам. Тогда сходство запроса q и ключа k записывается как ϕ(q)ϕ(k).

Заглавные Q,K,V обозначают сразу все запросы, ключи и значения. Ассоциативность позволяет сначала собрать одну сводку ключей и значений, а уже затем применить к ней запросы.

В causal-режиме строчные qt,kt,vt относятся только к позиции t. Будем хранить накопленное содержание в St, а накопленную нормировку — в zt.

St=St1+ϕ(kt)vt
zt=zt1+ϕ(kt)
yt=ϕ(qt)Stϕ(qt)zt

Каждый токен один раз обновляет оба состояния. Числитель читает содержание, а знаменатель приводит результат к правильному масштабу.

Основополагающая работаLinear TransformerАвторы показали, как признаковое отображение ядра (kernel feature map) и ассоциативность устраняют квадрат по длине.

Контекст становится обновляемой памятью

В causal-режиме сводку не нужно пересчитывать. Каждый токен один раз дописывает в неё свой вклад; следующий запрос читает уже обновлённое состояние. Поэтому linear attention можно исполнять как рекуррентную сеть — с постоянным объёмом памяти относительно длины контекста.

Рекуррентное обновление состояния linear attention
  1. Пришёл токенkt,vt
  2. Обновили памятьSt,zt
  3. Получили ответyt

Фиксированное состояние смешивает прошлое

Полный attention (full attention) хранит отдельный адрес для каждой позиции. Linear attention сворачивает весь контекст в состояние фиксированного размера. Когда похожих записей становится много, они начинают делить одни и те же направления памяти: старый факт может примешаться к новому.

Компромиссы фиксированного состояния
  1. Отдельные позицииможно вернуться к конкретному токену; память растёт с контекстом
  2. Общее состояниеразмер не зависит от длины текста; записи могут смешиваться
  3. Новый фактдобавляется за один шаг; старый не исчезает автоматически
Популярная LLMMiniMax-Text-01Lightning Attention используется для работы с контекстом до миллиона токенов при обучении.