Математика глубокого обучения
RoPE
Поворот вместо прибавления — и почему из этого выходит точная относительность
Одна идея
Прошлый урок закончился разложением, в котором мешали перекрёстные слагаемые. Они появились потому, что позицию прибавили к содержанию. RoPE не прибавляет — он поворачивает.
Всё содержание метода — в двух равенствах: для ортогональной матрицы (блок 1, урок 060) и , потому что повороты складывают углы (блок 1, урок 100). Абсолютные позиции сократились тождественно, а не приблизительно.
Композиция углов — это то самое, что видно на циферблате: поверните на , затем на и убедитесь, что оказались там же, куда ведёт поворот на .
матрица поворота на θ
- cos
- 0.77
- sin
- 0.64
- радиан
- 0.7
- θ + φ
- 85°
Как это устроено внутри
Реализуется это без матриц вовсе — по две координаты за раз:
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
Стоимость — на голову, обучаемых параметров нуль, и применяется это только к и , но не к . Последнее логично: позиция должна влиять на то, куда смотреть, а не на то, что забрать.
Есть и компактная запись. Если пару координат считать комплексным числом, поворот — это умножение на , и вся оценка сворачивается в
Проверено численно: при обе формы дают одно и то же с расхождением .
Проверьте относительность
Переключите виджет между двумя схемами и смотрите на «разброс по якорям».
смещение j − i оценка
- размах оценок
- 2.95
- разброс по якорям
- 2.121
- норма q после
- 1.24
Два readout’а стоят рядом не случайно. Прибавление вектора меняет длину на величину, зависящую от позиции: измерено на позиции и на позиции . Значит масштаб оценок слегка дрейфует по последовательности. Поворот не может изменить длину вовсе — норма ровно при любой позиции, и это второе, более тихое преимущество RoPE.
Поправка: «долгосрочное затухание» — не то, чем кажется
Здесь стоит быть точным, потому что утверждение «RoPE обеспечивает затухание внимания с расстоянием» повторяется часто и в сильной форме неверно.
Проверим прямо: возьмём случайные и и посмотрим на средний модуль оценки как функцию смещения. Две тысячи пар, :
| смещение | средний оценка |
|---|---|
Никакого затухания. И это ожидаемо: — ортогональная матрица, она сохраняет норму, а значит и типичную величину скалярного произведения при любом . В работе про RoPE доказано затухание верхней оценки при дополнительном предположении об убывании частичных сумм — это утверждение про границу, а не про сами оценки, и для случайных векторов оно не проявляется вовсе.
Как есть на самом деле: RoPE даёт архитектуре возможность выразить зависимость от расстояния, а локальность модель выучивает. При инициализации никакого предпочтения близким токенам нет. Сравните с ALiBi, где штраф задан жёстко и затухание есть с первого шага — это разные инженерные ставки, и путать их не стоит.
Расширение контекста
Практическая ценность RoPE — здесь. Формула определена при любой позиции, поэтому вопрос не «можно ли посчитать», а «видела ли модель такие углы».
Посмотрим на углы при , и длине обучения :
| пара | оборотов за 2048 позиций |
|---|---|
Быстрые пары повторяются сотни раз — им безразлично, где мы. А медленные за всё обучение не прошли даже десятой доли оборота: самая медленная пара добралась до угла радиана. При переходе на она попадёт в радиана — область, которую модель никогда не видела. Вот где ломается экстраполяция, и ломается она у медленных пар, а не у быстрых.
Отсюда приёмы, каждый из которых решает ровно эту проблему:
| приём | что делает | цена |
|---|---|---|
| линейная интерполяция позиций | сжимает и быстрые пары, теряя различение соседей | |
| увеличение (NTK-aware) | растягивает все длины волн | меняет и то, что уже работало |
| YaRN | интерполирует медленные пары, быстрые оставляет | сложнее, требует немного дообучения |
Логика YaRN теперь читается прямо из таблицы: пары, прошедшие много оборотов, экстраполируются сами, и трогать их не нужно; интерполировать надо те, что не прошли и одного. Линейная интерполяция бьёт по всем без разбора — поэтому она работает, но заметно портит различение близких токенов.
Итог
- Одна замена: прибавить → повернуть. Из ортогональности и сложения углов следует точная зависимость только от смещения.
- Ноль обучаемых параметров, работы, применяется к и и не применяется к .
- Норма запросов и ключей не меняется — масштаб оценок не дрейфует по последовательности.
- Затухания внимания с расстоянием RoPE не даёт; это выученное свойство, а не встроенное.
- Расширение контекста — это вопрос про углы медленных пар, и все известные приёмы отличаются тем, как именно они с ними обходятся.
Источники
- Su и др. — RoFormer, Enhanced Transformer with Rotary Position Embedding — Исходная работа про RoPE
- Chen и др. — Extending Context Window of Large Language Models via Position Interpolation — Линейная интерполяция позиций
- Peng и др. — YaRN, Efficient Context Window Extension — Что делать с медленными парами при расширении контекста
Проверки
0 из 2Что даёт поворот
Отметьте все верные утверждения о RoPE.
Поворот и только смещение
Реализуйте
rope_score(q, k, base, i, j). Поворот действует на каждую пару координат отдельно: для пары номер (нумерация с нуля) угол равен , где и — длина вектора. Пара берётся как соседние координаты и поворачивается обычной матрицей поворота:Верните
[score, score_via_offset, difference, norm_ratio]:score= ;score_via_offset= — та же оценка, посчитанная по одному смещению;difference— разность первых двух;norm_ratio= .
Два последних числа — это и есть проверяемые тождества: разность обязана быть машинным нулём, отношение норм — единицей. Оба следуют из того, что ортогональна и повороты складывают углы. Обратите внимание, что бывает отрицательным, и формула это допускает.
Загрузка редактора…
Ctrl/⌘ + Enter