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

RoPE

Поворот вместо прибавления — и почему из этого выходит точная относительность

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

Одна идея

Прошлый урок закончился разложением, в котором мешали перекрёстные слагаемые. Они появились потому, что позицию прибавили к содержанию. RoPE не прибавляет — он поворачивает.

(Riq)(Rjk)=qRiRjk=qRjik\big(\htmlData{k=rot}{R_i} q\big)^\top \big(\htmlData{k=rot}{R_j} k\big) = q^\top R_i^\top R_j k = q^\top R_{\htmlData{k=offset}{j-i}} k

Всё содержание метода — в двух равенствах: R=R1R^\top = R^{-1} для ортогональной матрицы (блок 1, урок 060) и Ri1Rj=RjiR_i^{-1}R_j = R_{j-i}, потому что повороты складывают углы (блок 1, урок 100). Абсолютные позиции сократились тождественно, а не приблизительно.

Композиция углов — это то самое, что видно на циферблате: поверните на θ\theta, затем на φ\varphi и убедитесь, что оказались там же, куда ведёт поворот на θ+φ\theta + \varphi.

e₁e₂

матрица поворота на θ

cos
0.77
sin
0.64
радиан
0.7
θ + φ
85°
первый угол θ 40°
второй угол φ 45°
Два поворота подряд равны одному повороту на сумму углов. Именно из этого равенства следует, что в оценке RoPE остаётся только разность позиций: R_i⁻¹R_j = R_{j−i}.

Как это устроено внутри

RpR_p — блочно-диагональная матрица: координаты головы разбиты на пары, и каждая пара поворачивается на свой угол pωip\,\omega_i с теми же частотами ωi=β2i/d\omega_i = \beta^{-2i/d}, что были у синусоид.

Rp=(cospω0sinpω0sinpω0cospω0)R_p = \begin{pmatrix} \cos p\omega_0 & -\sin p\omega_0 & & \\ \sin p\omega_0 & \cos p\omega_0 & & \\ & & \ddots & \\ \end{pmatrix}

Реализуется это без матриц вовсе — по две координаты за раз:

def rope(x, pos, base=10000.0):
    d = x.shape[-1]
    i = torch.arange(d // 2)
    theta = pos * base ** (-2 * i / d)
    a, b = x[..., 0::2], x[..., 1::2]
    out = torch.empty_like(x)
    out[..., 0::2] = a * theta.cos() - b * theta.sin()
    out[..., 1::2] = a * theta.sin() + b * theta.cos()
    return out

Стоимость — O(nd)O(nd) на голову, обучаемых параметров нуль, и применяется это только к qq и kk, но не к vv. Последнее логично: позиция должна влиять на то, куда смотреть, а не на то, что забрать.

Есть и компактная запись. Если пару координат считать комплексным числом, поворот — это умножение на eipωe^{ip\omega}, и вся оценка сворачивается в

qRΔk=ReiqikˉieiΔωiq^\top R_\Delta k = \operatorname{Re}\sum_{i} q_i \bar{k}_i\, e^{-i\Delta\omega_i}

Проверено численно: при d=64d = 64 обе формы дают одно и то же с расхождением 101510^{-15}.

Проверьте относительность

Переключите виджет между двумя схемами и смотрите на «разброс по якорям».

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

позиция 0позиция 8позиция 24позиция 40
размер головы d 64
смещений 32
размах оценок
2.95
разброс по якорям
2.121
норма q после
1.24
Четыре кривые расходятся: при одном и том же расстоянии между токенами оценка зависит от того, где они стоят.

Два readout’а стоят рядом не случайно. Прибавление вектора меняет длину qq на величину, зависящую от позиции: измерено 1.0031.003 на позиции 2424 и 0.9880.988 на позиции 88. Значит масштаб оценок слегка дрейфует по последовательности. Поворот не может изменить длину вовсе — норма ровно 1.0001.000 при любой позиции, и это второе, более тихое преимущество RoPE.

Поправка: «долгосрочное затухание» — не то, чем кажется

Здесь стоит быть точным, потому что утверждение «RoPE обеспечивает затухание внимания с расстоянием» повторяется часто и в сильной форме неверно.

Проверим прямо: возьмём случайные qq и kk и посмотрим на средний модуль оценки как функцию смещения. Две тысячи пар, d=64d = 64:

смещениесредний \vertоценка\vert
000.7900.790
16160.7950.795
2562560.8020.802
409640960.8010.801

Никакого затухания. И это ожидаемо: RΔR_\Delta — ортогональная матрица, она сохраняет норму, а значит и типичную величину скалярного произведения при любом Δ\Delta. В работе про RoPE доказано затухание верхней оценки при дополнительном предположении об убывании частичных сумм — это утверждение про границу, а не про сами оценки, и для случайных векторов оно не проявляется вовсе.

Как есть на самом деле: RoPE даёт архитектуре возможность выразить зависимость от расстояния, а локальность модель выучивает. При инициализации никакого предпочтения близким токенам нет. Сравните с ALiBi, где штраф mij-m|i-j| задан жёстко и затухание есть с первого шага — это разные инженерные ставки, и путать их не стоит.

Расширение контекста

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

Посмотрим на углы при d=64d = 64, β=104\beta = 10^4 и длине обучения 20482048:

параоборотов за 2048 позиций
00326326
8832.632.6
16163.263.26
24240.330.33
31310.0440.044

Быстрые пары повторяются сотни раз — им безразлично, где мы. А медленные за всё обучение не прошли даже десятой доли оборота: самая медленная пара добралась до угла 0.270.27 радиана. При переходе на 81928192 она попадёт в 1.091.09 радиана — область, которую модель никогда не видела. Вот где ломается экстраполяция, и ломается она у медленных пар, а не у быстрых.

Отсюда приёмы, каждый из которых решает ровно эту проблему:

приёмчто делаетцена
линейная интерполяция позицийppLобучLновp \to p \cdot \frac{L_{\text{обуч}}}{L_{\text{нов}}}сжимает и быстрые пары, теряя различение соседей
увеличение β\beta (NTK-aware)растягивает все длины волнменяет и то, что уже работало
YaRNинтерполирует медленные пары, быстрые оставляетсложнее, требует немного дообучения

Логика YaRN теперь читается прямо из таблицы: пары, прошедшие много оборотов, экстраполируются сами, и трогать их не нужно; интерполировать надо те, что не прошли и одного. Линейная интерполяция бьёт по всем без разбора — поэтому она работает, но заметно портит различение близких токенов.

Итог

  • Одна замена: прибавить → повернуть. Из ортогональности и сложения углов следует точная зависимость только от смещения.
  • Ноль обучаемых параметров, O(nd)O(nd) работы, применяется к qq и kk и не применяется к vv.
  • Норма запросов и ключей не меняется — масштаб оценок не дрейфует по последовательности.
  • Затухания внимания с расстоянием RoPE не даёт; это выученное свойство, а не встроенное.
  • Расширение контекста — это вопрос про углы медленных пар, и все известные приёмы отличаются тем, как именно они с ними обходятся.

Источники

Проверки

0 из 2
  1. Что даёт поворот

    Отметьте все верные утверждения о RoPE.

  2. Поворот и только смещение

    Реализуйте rope_score(q, k, base, i, j). Поворот RpR_p действует на каждую пару координат отдельно: для пары номер mm (нумерация с нуля) угол равен pωmp\,\omega_m, где ωm=β2m/d\omega_m = \beta^{-2m/d} и dd — длина вектора. Пара берётся как соседние координаты (x2m,x2m+1)(x_{2m}, x_{2m+1}) и поворачивается обычной матрицей поворота:

    x2m=x2mcosθx2m+1sinθ,x2m+1=x2msinθ+x2m+1cosθx'_{2m} = x_{2m}\cos\theta - x_{2m+1}\sin\theta, \qquad x'_{2m+1} = x_{2m}\sin\theta + x_{2m+1}\cos\theta

    Верните [score, score_via_offset, difference, norm_ratio]:

    • score = (Riq)(Rjk)(R_i q)^\top (R_j k);
    • score_via_offset = qRjikq^\top R_{j-i} k — та же оценка, посчитанная по одному смещению;
    • difference — разность первых двух;
    • norm_ratio = Riq/q\|R_i q\| / \|q\|.

    Два последних числа — это и есть проверяемые тождества: разность обязана быть машинным нулём, отношение норм — единицей. Оба следуют из того, что RpR_p ортогональна и повороты складывают углы. Обратите внимание, что jij - i бывает отрицательным, и формула это допускает.

    функция rope_score

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

    Ctrl/⌘ + Enter