Что такое RoPE: как модель учитывает порядок токенов — это способ сообщить вниманию относительную позицию через поворот пар координат query и key. Векторы поворачиваются на угол, кратный номеру позиции, и скалярное произведение начинает зависеть от разности позиций. Ниже — механизм, ручные примеры и проверка настроек.
Зачем attention нужна информация о позиции токена
Механизм самовнимания сопоставляет каждый токен со всеми остальными и строит представление как взвешенную сумму. Учебник Dive into Deep Learning описывает это так: по полному набору оценок совместимости query и key для каждого токена строится представление через взвешенную сумму по другим токенам. Оценка совместимости — это скалярное произведение вектора запроса одного токена на вектор ключа другого. Чем выше произведение, тем больший вес получает соответствующий токен при сборке выхода.
Проблема в том, что самовнимание само по себе не получает явных меток позиции. Dive into Deep Learning указывает, что оно не сохраняет сведения о порядке последовательности. Чтобы учитывать взаимное расположение токенов, механизму передают позиционную информацию.
Общепринятый выход — добавить к каждому токену сведения о его месте. Dive into Deep Learning называет доминирующим подходом представление порядка как дополнительного входа, связанного с токеном; такие входы называют позиционными кодировками, и они бывают обучаемыми либо заданными заранее. Исторически популярны аддитивные схемы: к вектору токена прибавляется вектор позиции. RoFormer, первичная работа по RoPE, противопоставляет свой подход аддитивной природе прежних методов позиционного кодирования и называет собственный подход мультипликативным. Разница принципиальна: аддитивная схема сдвигает вектор, мультипликативная поворачивает его.
Что именно даёт поворот. RoFormer формулирует так: предлагаемый RoPE кодирует абсолютную позицию матрицей поворота и одновременно вносит явную зависимость от относительной позиции в формулу самовнимания. Один и тот же приём решает две задачи. Абсолютная позиция каждого токена закодирована в его собственном векторе. Относительная позиция пары проявляется в скалярном произведении, потому что углы вычитаются. Это и есть причина, по которой RoPE прижился: внимание получает информацию о взаимном расположении токенов прямо в оценке совместимости, без отдельного слагаемого.
Ещё одно следствие поворота — сохранение нормы. RoFormer отмечает: поскольку RoPE вносит позицию поворотом, норма скрытых представлений остаётся неизменной, и это позволяет сочетать RoPE с линейным вниманием, умножая матрицу поворота на выходы неотрицательных функций. Практический смысл для читателя простой: поворот меняет направление вектора, его длина сохраняется. Модель не «раздувает» представления по мере роста номера позиции.
Итог раздела: внимание нуждается в позиции, потому что скалярные произведения сами её не кодируют; RoPE встраивает позицию поворотом и делает относительное расстояние частью оценки совместимости.
Как RoPE вращает пары координат query и key
RoPE работает с парами координат внутри вектора. Координаты запроса и ключа объединяются в пары согласно конкретной реализации, и каждая пара рассматривается как точка на плоскости. Поворот этой точки на угол, зависящий от номера позиции, и есть операция RoPE.
Формально для пары координат (x, y) на позиции m поворот на угол θ даёт новые координаты:
- x’ = x·cos(mθ) − y·sin(mθ);
- y’ = x·sin(mθ) + y·cos(mθ).
Здесь m — номер позиции токена, θ — шаг угла для данной пары измерений. Одна и та же операция применяется к вектору query и к вектору key, но с разными номерами позиций: у запроса своя позиция, у ключа своя. Первичная работа описывает это так: чтобы внести относительную позицию, достаточно повернуть аффинно преобразованный вектор слова на угол, кратный его позиционному индексу; именно в этом интуиция Rotary Position Embedding.
Ключевой момент — какие именно измерения поворачиваются. Документация библиотеки Transformers описывает параметр partial_rotary_factor как долю измерений головы запроса и ключа, к которым применяется RoPE. Часть измерений остаётся без поворота, часть вращается. Это даёт разработчику рычаг: можно поворачивать весь вектор головы, можно только его долю.
Вторая деталь — шаг угла для разных пар. Разные пары измерений получают разные θ, обычно убывающие по геометрической прогрессии. Медленные пары меняют угол слабо и различают далёкие позиции, быстрые пары меняют угол резко и различают близкие. Так одна операция покрывает и локальный, и глобальный масштаб.
Порядок действий при чтении кода:
- Найдите, где формируются query и key до применения RoPE.
- Проверьте раскладку пар в конкретной реализации: используются соседние координаты или координаты из двух половин поворачиваемой части.
- Найдите таблицу углов: для каждой пары хранится свой шаг θ.
- Убедитесь, что к query и key применяется поворот с их собственными номерами позиций.
- Проверьте, что поворот применяется до вычисления скалярного произведения.
Ошибка на любом шаге ломает относительную зависимость. Если повернуть только query, произведение перестанет быть функцией разности позиций. Если применить поворот после произведения, он вообще не повлияет на оценку совместимости.
Практическая проверка формы тензора. Углы обычно хранятся как тензор формы «длина последовательности × половина размерности головы», потому что на каждую пару координат приходится один угол. Проверьте, что размер поворачиваемой части позволяет сформировать полные пары и соответствует реализации. Порядок обработки остальных координат задаётся конкретным кодом модели.
Итог раздела: RoPE поворачивает пары координат query и key на углы, пропорциональные номерам позиций; разные пары получают разные шаги, а доля поворачиваемых измерений задаётся параметром.
Почему скалярное произведение зависит от относительного угла
Скалярное произведение двух повёрнутых векторов определяется разностью их углов. Это центральное свойство RoPE, из которого следует всё остальное.
Возьмём два исходных вектора. После поворотов угол между ними определяется их исходными направлениями и разностью добавленных углов. Общий дополнительный поворот сохраняет скалярное произведение. Если меняется разность поворотов, произведение может измениться.
Переведём на язык позиций. Пусть запрос стоит на позиции m, ключ — на позиции n. Угол запроса пропорционален m, угол ключа пропорционален n. Разность углов пропорциональна m − n. Значит, позиционная часть оценки совместимости зависит от относительного расстояния между токенами. Первичная работа формулирует это как явную зависимость от относительной позиции, встроенную в формулу самовнимания.
Отсюда следует инвариант общего сдвига. Если прибавить к обеим позициям одно и то же число, разность сохранится, и скалярное произведение не изменится. Это ровно то поведение, которое нужно языковой модели: отношение между токенами с заданным расстоянием не должен зависеть от того, начинается ли фраза с первого символа текста или с тысячного.
Важная оговорка про многомерный случай. В реальной модели вектор разбит на много пар, и каждая пара имеет свой шаг θ. Инвариант общего сдвига выполняется для каждой пары по отдельности, потому что поворот каждой пары зависит только от её собственного угла. Суммарное скалярное произведение складывается из вкладов всех пар, и каждый вклад инвариантен к общему сдвигу. Свойство сохраняется целиком.
Что происходит при изменении разности позиций. Произведение может вырасти, упасть или сменить знак — это зависит от угла между векторами. Для читателя важен сам факт: относительное расстояние управляет оценкой совместимости. Модель получает возможность предпочитать близкие токены далёким или наоборот, и позиционная геометрия участвует в формировании этой оценки.
Сравнение с аддитивной схемой по этому критерию:
| Свойство | Аддитивная позиционная кодировка | RoPE |
|---|---|---|
| Как вносится позиция | Прибавление вектора позиции к вектору токена | Поворот пар координат query и key |
| Что видит скалярное произведение | Смесь абсолютных вкладов | Функцию разности позиций |
| Норма представления | Меняется от позиции к позиции | Сохраняется поворотом |
| Относительная зависимость | Возникает косвенно | Встроена в формулу внимания |
Таблица описывает механизм. Качество нужно проверять отдельно. Обе схемы работоспособны; различия касаются того, как именно позиция попадает в оценку совместимости.
Итог раздела: при фиксированных исходных query и key позиционный вклад определяется разностью поворотов. Общий сдвиг сохраняет произведение, изменение разности позиций может его менять.
Три ручных случая позиций (0,1), (1,2), (1,1) с векторами и итогами
Разберём учебную двумерную схему. Возьмём q = (1, 0) и k = (1, 0) — единичные векторы, направленные вдоль оси x. Шаг угла на одну позицию примем равным 90°. Это выбранное для счёта значение, оно помогает увидеть механику и не описывает частоты реальной модели.
Поворот на 90° переводит (1, 0) в (0, 1). Поворот на 180° переводит (1, 0) в (−1, 0). Поворот на 0° оставляет вектор на месте. Пользуясь этим, выпишем три случая.
Случай (0, 1): запрос на позиции 0, ключ на позиции 1. Угол запроса 0°, угол ключа 90°. Повёрнутый запрос q = (1, 0), повёрнутый ключ k = (0, 1). Скалярное произведение: 1·0 + 0·1 = 0.
Случай (1, 2): запрос на позиции 1, ключ на позиции 2. Угол запроса 90°, угол ключа 180°. Повёрнутый запрос q = (0, 1), повёрнутый ключ k = (−1, 0). Скалярное произведение: 0·(−1) + 1·0 = 0.
Случай (1, 1): запрос и ключ на одной позиции 1. Угол у обоих 90°. Повёрнутый запрос q = (0, 1), повёрнутый ключ k = (0, 1). Скалярное произведение: 0·0 + 1·1 = 1.
Сведём результаты в таблицу.
| Позиции (q, k) | Угол q | Угол k | Вектор q | Вектор k | Произведение |
|---|---|---|---|---|---|
| (0, 1) | 0° | 90° | (1, 0) | (0, 1) | 0 |
| (1, 2) | 90° | 180° | (0, 1) | (−1, 0) | 0 |
| (1, 1) | 90° | 90° | (0, 1) | (0, 1) | 1 |
Что показывают эти три строки. Первые два случая имеют одинаковую разность позиций: 1 − 0 = 1 и 2 − 1 = 1. Произведение в обоих случаях равно нулю. Общий сдвиг на одну позицию сохранил значение — это и есть инвариант относительной позиции в действии. Третий случай имеет разность 0, и произведение равно единице: одинаковые позиции дают совпадающие векторы и максимальную совместимость.
Теперь проверим инвариант на сдвиге. Возьмём первый случай и прибавим к обеим позициям по единице: получим (1, 2) — это в точности второй случай с тем же произведением. Прибавим ещё единицу: получим (2, 3), углы 180° и 270°, векторы q = (−1, 0) и k = (0, −1), произведение снова 0. Инвариант держится.
Проверим изменение разности. Возьмём (0, 1) с произведением 0 и сдвинем только ключ на позицию 2: получим (0, 2), углы 0° и 180°, векторы q = (1, 0) и k = (−1, 0), произведение −1. Разность позиций изменилась, и значение изменилось. Это подтверждает, что произведение реагирует именно на относительное расстояние.
Ограничение примера. Здесь одна пара координат и один шаг 90°. В реальной модели пар много, шаги разные, и итоговая оценка складывается из вкладов всех пар. Учебная схема показывает принцип на условных числах.
Итог раздела: три случая дают произведения 0, 0 и 1; одинаковые разности позиций дают одинаковые значения, а смена разности меняет результат.
Частотная база и масштабирование: разные варианты, разные конфигурации
Шаг угла для каждой пары задаётся частотной базой. Документация библиотеки Transformers описывает параметр rope_theta как базовый период RoPE-эмбеддингов, значение по умолчанию берётся из RotaryEmbeddingConfigMixin.default_theta. Через этот параметр настраивается, насколько быстро растут углы вдоль последовательности.
Как база связана с шагом. Для пары с индексом i шаг обычно вычисляется как величина, обратная степени базы: чем больше база, тем меньше шаг для той же пары. Малый шаг означает, что угол нарастает медленно и пара различает далёкие позиции. Большой шаг означает быстрое нарастание и чувствительность к близким позициям. Набор шагов по всем парам образует спектр частот — от медленных к быстрым.
Что меняется при смене базы. Увеличение базы растягивает спектр: медленные пары становятся ещё медленнее. Это влияет на то, как модель различает позиции за пределами типичной длины. Практический эффект зависит от обучения: база, заданная при обучении, и база при инференсе должны согласовываться.
Второй рычаг — доля поворачиваемых измерений. Документация Transformers описывает partial_rotary_factor как процент измерений головы запроса и ключа, к которым применяется RoPE. Значение меньше единицы оставляет часть измерений без позиционной информации. Это осознанный компромисс: часть каналов кодирует содержание, часть — позицию.
Третий слой — варианты RoPE. Transformers различает default, линейное масштабирование linear и dynamic с пересчётом частотной базы для длинного контекста. У каждого варианта свой набор ожидаемых ключей; отсутствие нужного ключа вызывает ошибку. Выбирайте параметры по конфигурации конкретной модели.
Четвёртый слой — послойные настройки. Та же документация указывает, что Transformers поддерживает задание разных параметров RoPE для разных типов слоёв в соответствующих моделях. Одна модель может использовать разные базы или разные доли поворота в разных частях архитектуры.
Сравнение рычагов настройки:
| Параметр | Что задаёт | На что влияет |
|---|---|---|
| rope_theta | Базовый период эмбеддингов | Спектр шагов угла по парам |
| partial_rotary_factor | Долю измерений головы под поворот | Сколько каналов несут позицию |
| Вариант RoPE | Набор ожидаемых ключей | Совместимость конфигурации |
| Послойные параметры | Настройки по типам слоёв | Разное поведение слоёв модели |
Порядок проверки конфигурации:
- Сверьте базу, указанную в конфигурации модели, с базой, использованной при обучении.
- Проверьте долю поворачиваемых измерений и её согласованность с размерностью головы.
- Убедитесь, что выбранный вариант RoPE совместим с архитектурой.
- Проверьте, не заданы ли отдельные параметры для разных типов слоёв.
- Запустите короткий прогон и убедитесь, что загрузка конфигурации проходит без ошибок ключей.
Итог раздела: база задаёт спектр углов, доля поворота определяет, сколько каналов несут позицию, а вариант и послойные параметры управляют совместимостью конфигурации.
Почему приём более длинного ввода не доказывает качество на нём
Конфигурация может принимать длинный ввод и при этом не отвечать правильно на вопросы по дальним фрагментам. Это разные утверждения, и их важно разделять.
Разберём учебный контрпример. Пусть конфигурация принимает 8192 позиции. Зададим контрольный вопрос по фрагменту, расположенному около 7000-й позиции. Ответ остаётся неправильным. Такой исход логически совместим с работающим позиционным кодированием: механизм поворота исправно кодирует позиции, а модель не извлекла нужное знание с этой глубины. Это условный пример для разбора. Измерение модели не проводилось.
Почему приём ввода и качество расходятся. Приём ввода — свойство интерфейса и конфигурации: модель не падает и выдаёт какой-то результат. Качество — свойство поведения: результат соответствует вопросу. Между ними лежит обучение. Если модель обучалась на последовательностях одной длины, а на инференсе получает более длинные, позиции за пределами обученного диапазона попадают в область, где поведение не отлажено. RoPE продолжает поворачивать векторы по той же формуле, но веса модели не настраивались на такие углы.
Что именно может пойти не так. Первое: медленные пары на больших позициях накапливают углы, которые при обучении не встречались. Второе: распределение оценок совместимости смещается, и внимание концентрируется не там, где нужно. Третье: модель может отвечать по началу текста, игнорируя дальнюю часть, и внешне это выглядит как работа.
Как проверять качество на длинном вводе. Нужен контрольный набор, где ответ находится именно в дальней части. Вопросы по началу текста такую проверку не проводят: модель ответит по ближнему контексту. Полезно сравнить ответы на один и тот же вопрос при разном расположении фрагмента: если при переносе фрагмента в начало ответ становится правильным, а в конце — нет, это указывает на проблему с дальними позициями.
Отдельно про масштабирование. Методы растяжения частот меняют шаги углов так, чтобы длинные позиции попадали в область, похожую на обученную. Это настройка конфигурации, и её эффект проверяется тем же контрольным набором. Приём длинного ввода сам по себе ничего не говорит о результате.
Итог раздела: конфигурация может принимать длинный ввод, а качество на дальних позициях проверяется отдельным контрольным набором; приём ввода и качество ответа — разные свойства.
Что проверить при несовместимых настройках RoPE; не переносить ограничения cuDNN на все модели
Несовместимые настройки RoPE проявляются по-разному. Разберём, что проверять, и где границы применимости ограничений.
Первая проверка — имена и набор ключей. Документация Transformers предупреждает: каждый вариант RoPE определяет собственный набор ожидаемых ключей, и отсутствие нужного ключа приводит к ошибке. Если конфигурация собрана под один вариант, а загружается под другой, ошибка возникает на этапе загрузки. Это самый простой случай: сбой виден сразу.
Вторая проверка — согласованность базы и метода масштабирования с конкретной моделью. Некоторые варианты намеренно пересчитывают частотную базу для длинного контекста. Сверьте выбранный вариант с конфигурацией модели и проверьте качество на контрольных задачах.
Третья проверка — доля поворачиваемых измерений. Если partial_rotary_factor задан не так, как при обучении, часть каналов получит позиционную информацию там, где её не должно быть, или наоборот. Проверяется сверкой конфигурации с описанием модели.
Четвёртая проверка — послойные параметры. Документация Transformers указывает, что для некоторых моделей поддерживается задание разных параметров RoPE по типам слоёв. Если модель использует такие настройки, а конфигурация задаёт единое значение, поведение слоёв изменится.
Пятая проверка — форма тензоров. Углы должны соответствовать размерности головы и длине последовательности. Несовпадение размерностей даёт ошибку формы при первом же прямом проходе.
Теперь о границах применимости. Документация NVIDIA cuDNN описывает операцию RoPE как часть своей библиотеки. Это описание относится к конкретной библиотеке и её реализации. Ограничения, указанные для операции в cuDNN, относятся к этой библиотеке. Переносить их на все модели, использующие RoPE, некорректно: реализация RoPE существует в разных фреймворках, и каждый задаёт свои требования. Утверждение об ограничении нужно привязывать к названному продукту.
Порядок диагностики при подозрении на несовместимость:
- Проверьте, проходит ли загрузка конфигурации без ошибок ключей.
- Сверьте базу с обученной.
- Сверьте долю поворота и послойные параметры.
- Проверьте формы тензоров углов.
- Прогоните контрольный набор с ответами в разных частях текста.
- При ошибке загрузки начните с конфигурации; при ухудшении ответов сравните параметры и результаты контрольных задач.
Типичные причины сбоев, которые стоит держать в голове: несовпадение варианта RoPE, расхождение базы, неверная доля поворота, единые параметры там, где нужны послойные, и несоответствие форм. Каждая из них проверяется отдельно, и это помогает быстро сузить круг.
Итог раздела: проверяйте набор ключей, базу, долю поворота, послойные параметры и формы тензоров; ограничения конкретной библиотеки относите к ней самой.
Частые вопросы
Что такое rotary position embedding простыми словами?
Это способ сообщить модели, на каком месте стоит каждый токен. Векторы запроса и ключа поворачиваются на угол, пропорциональный номеру позиции. Из-за этого оценка совместимости двух токенов зависит от расстояния между ними.
Почему скалярное произведение зависит от относительного угла?
Скалярное произведение зависит от длин и взаимного направления исходных векторов. RoPE добавляет к этому направлению разность позиционных поворотов. Поэтому общий сдвиг позиций сохраняет произведение, а изменение разности позиций может его менять.
Что даёт частотная база rope_theta?
Она задаёт базовый период эмбеддингов и определяет, насколько быстро растут углы вдоль последовательности. Большая база делает медленные пары ещё медленнее. Значение по умолчанию берётся из RotaryEmbeddingConfigMixin.default_theta.
Почему модель принимает длинный ввод, но отвечает плохо?
Приём ввода определяется конфигурацией, а качество — обучением. Позиции за пределами обученного диапазона попадают в область, где веса не отлажены. Проверяется это контрольным набором с ответами в дальней части текста.
Что делать при ошибке ключей RoPE?
Проверьте, какой вариант RoPE ожидает модель, и сверьте набор ключей конфигурации с ним. Документация Transformers указывает, что каждый вариант определяет собственный набор ожидаемых ключей. Затем сверьте базу и долю поворачиваемых измерений.
