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

Позиционные кодировки

Внимание не знает порядка — и почему синусоиды «относительны» только на бумаге

Шаг 84 из 117 · ~28 мин

Почему без них нельзя

Из урока 070: формула внимания не содержит индексов позиций вовсе. Отсюда точное утверждение.

Attn(PX)=PAttn(X)\text{Attn}(\htmlData{k=perm}{P}X) = \htmlData{k=perm}{P}\,\text{Attn}(X)

Доказывается в одну строку: строк XX переставляет строки QQ, KK, VV, значит матрица оценок превращается в PSPPSP^\top, softmax по строкам это переносит, и результат — переставленные строки исходного. Другими словами, для внимания «кот сел на коврик» и «коврик на сел кот» — одно и то же множество токенов.

Это не недоработка, а свойство операции, и его нужно чем-то исправлять извне. Требования к исправлению:

требованиепочему
различать позициииначе порядок не восстановим
работать на любой длинеобучались на 2048, работаем на 8192
ограниченностькодировка не должна перебивать содержание
убывание влияния с расстояниемлокальный контекст важнее далёкого

Синусоидальная кодировка

Исходное решение: вектор той же ширины, что и вход, прибавляемый к эмбеддингу.

PE(p)2i=sin ⁣(pβ2i/d),PE(p)2i+1=cos ⁣(pβ2i/d)\text{PE}(p)_{2i} = \sin\!\left(\frac{p}{\beta^{2i/d}}\right), \qquad \text{PE}(p)_{2i+1} = \cos\!\left(\frac{p}{\beta^{2i/d}}\right)

с β=104\beta = 10^4. Частоты образуют геометрическую прогрессию, поэтому длины волн покрывают несколько порядков сразу:

пара ii (при d=64d = 64)ω\omegaдлина волны
00116.286.28
880.10.162.862.8
16160.010.01628628
31311.31041.3\cdot10^{-4}4711747\,117

Быстрые пары различают соседей, медленные — далёкие области. Это и есть ответ на «различать позиции на любой длине»: пока хотя бы одна пара не сделала полный оборот, позиции ещё различимы.

Половина правды про относительность

Обычно говорят: «синусоиды кодируют относительную позицию, потому что PE(i)PE(j)\text{PE}(i) \cdot \text{PE}(j) зависит только от iji - j». Первая часть — вывод, вторая — факт, и факт верен:

PE(i)PE(j)=k[sin(ωki)sin(ωkj)+cos(ωki)cos(ωkj)]=kcos(ωk(ij))\text{PE}(i)\cdot\text{PE}(j) = \sum_{k} \big[\sin(\omega_k i)\sin(\omega_k j) + \cos(\omega_k i)\cos(\omega_k j)\big] = \sum_k \cos\big(\omega_k (i-j)\big)

по теореме сложения косинуса (блок 1, урок 100). Проверено численно при d=64d = 64: при смещении 11 произведение равно 30.916830.9168 из позиции 00 и 30.916830.9168 из позиции 1717, расхождение 1.410141.4\cdot10^{-14}.

А вывод при этом неверен, и вот почему. Внимание считает не PE(i)PE(j)\text{PE}(i)\cdot\text{PE}(j), а произведение сумм:

(xi+PE(i))(xj+PE(j))=xixjсодержание+xiPE(j)+PE(i)xjперекрёстные+PE(i)PE(j)только смещение(x_i + \text{PE}(i))^\top(x_j + \text{PE}(j)) = \underbrace{x_i^\top x_j}_{\text{содержание}} + \underbrace{x_i^\top \text{PE}(j) + \text{PE}(i)^\top x_j}_{\text{перекрёстные}} + \underbrace{\text{PE}(i)^\top \text{PE}(j)}_{\text{только смещение}}

Относительно только последнее слагаемое. Два перекрёстных зависят от абсолютных позиций, и они не малы. Посмотрите на readout «разброс по якорям»: это максимальная разница оценок при одинаковом смещении, взятая по трём разным абсолютным позициям.

смещение j − i оценка

позиция 0позиция 8позиция 24
размер головы d 64
смещений 32
размах оценок
0
разброс по якорям
0.0e+0
норма q после
1
Три кривые слились в одну горизонтальную прямую: оценка не зависит ни от позиций, ни от смещения. Порядок токенов не существует для этой операции вовсе.

Разброс по якорям равен машинному нулю: схема относительна не приблизительно, а тождественно.

Числа из одного прогона при d=64d = 64 и трёх якорях 00, 88, 2424:

схемаразмах оценокразброс по якорямнорма qq
без кодировки00001.0001.000
синусоидальная2.942.941.861.861.0031.003
RoPE1.981.982.910152.9\cdot10^{-15}1.0001.000

Вторая строка — суть урока. Разброс 1.861.86 при размахе 2.942.94 означает, что около двух третей изменчивости оценки объясняется абсолютной позицией, а не расстоянием. Синусоидальная кодировка относительна ровно в той мере, в какой перекрёстные слагаемые малы, — а они не малы.

Обучаемые кодировки

Альтернатива из BERT и GPT-2: таблица maxlen×d\text{maxlen} \times d, обучаемая как обычные параметры. Проще, и на обучающей длине работает не хуже.

Цена ровно одна и она жёсткая: за пределами таблицы значений нет. Не «хуже экстраполирует» — их не существует, потому что позиция 4096 в таблице на 2048 строк не адресуется. Отсюда и вся история с расширением контекста: у синусоид и RoPE значение хотя бы определено при любой позиции, у таблицы — нет.

Что попробовали дальше

схемагде живёт позицияэкстраполяция
абсолютная синусоидальнаяв эмбеддинге, прибавляетсяформально да, фактически плохо
обучаемая таблицав эмбеддинге, прибавляетсяневозможна
относительная (Shaw, T5)слагаемое в оценке, зависит от iji-jда
ALiBiлинейный штраф mij-m\vert i-j\vert в оценкеда, и хорошо
RoPEповорот qq и kkда, и хорошо

Общая линия видна: позиция переехала из входа в оценку. Как только она влияет прямо на qkq^\top k, а не через прибавленный к содержанию вектор, перекрёстные слагаемые исчезают вместе с зависимостью от абсолютной позиции.

ALiBi — самый резкий пример: там вообще нет кодировки, только вычитание mijm|i-j| из оценки, по своему наклону mm на каждую голову. Работает, и это хороший аргумент в пользу того, что основное содержание позиционной информации — «насколько далеко», а не «где именно».

RoPE выбирает третий путь: не прибавить и не вычесть, а повернуть. Об этом урок 120.

Источники

Проверки

0 из 2
  1. Что кодировка кодирует

    Отметьте все верные утверждения о позиционных кодировках.

  2. Зависит ли произведение только от смещения

    Реализуйте pe_probe(dimension, base, position, offset). Синусоидальная кодировка:

    PE(p)2i=sin(pωi),PE(p)2i+1=cos(pωi),ωi=β2i/d\text{PE}(p)_{2i} = \sin(p\,\omega_i), \qquad \text{PE}(p)_{2i+1} = \cos(p\,\omega_i), \qquad \omega_i = \beta^{-2i/d}

    где ii пробегает от 00 до d/21d/2 - 1. Верните [dot_at_position, dot_at_zero, difference, longest_wavelength]:

    • dot_at_position = PE(p)PE(p+Δ)\text{PE}(p) \cdot \text{PE}(p + \Delta);
    • dot_at_zero = PE(0)PE(Δ)\text{PE}(0) \cdot \text{PE}(\Delta) — то же смещение, но от начала;
    • difference — разность первых двух. Если утверждение «произведение зависит только от смещения» верно, здесь обязан быть машинный нуль;
    • longest_wavelength = 2π/ωd/212\pi / \omega_{d/2-1} — длина волны самой медленной пары, то есть расстояние, на котором кодировка ещё различает позиции.

    Проверить себя можно так: при Δ=0\Delta = 0 произведение обязано равняться d/2d/2, потому что каждая пара даёт sin2+cos2=1\sin^2 + \cos^2 = 1.

    функция pe_probe

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

    Ctrl/⌘ + Enter