Как работает RoPE (Rotary Position Embedding) и чем лучше абсолютных позиций?
Краткий тезис
RoPE — это метод кодирования позиций токенов в трансформере, основанный на вращении пар координат в комплексной плоскости. В отличие от абсолютных позиционных эмбеддингов, RoPE не добавляет обучаемых параметров, привносит свойство относительного позиционирования и демонстрирует превосходную способность к экстраполяции на длинные последовательности. Благодаря этому RoPE широко применяется в современных LLM (LLaMA, Mistral, GPT‑Neo) и особенно востребован в RAG-системах, где длины контекстов могут значительно варьироваться.
1. Термин: Positional Encoding (позиционное кодирование)
В архитектуре трансформера слой self-attention по своей природе инвариантен к порядку токенов: если перемешать входные векторы, attention-веса не изменятся. Чтобы внести информацию о позиции каждого токена в последовательности, используются позиционные кодировки.
Encoding|Positional Encoding|Абсолютные Encoding|позиционные эмбеддинги (APE), впервые предложенные в статье "Attention is All You Need", добавляют к вектору токена фиксированный или обучаемый вектор, зависящий от индекса позиции. Например, синусоидальные кодировки: [ PE_{(pos,2i)} = \sin\left(\frac{pos}{10000^{2i/d}}\right), \quad PE_{(pos,2i+1)} = \cos\left(\frac{pos}{10000^{2i/d}}\right) ] Эти векторы просто суммируются с эмбеддингами токенов. Недостатки APE будут раскрыты ниже.
Относительное позиционирование старается моделировать не абсолютные индексы, а расстояния между токенами. RoPE является одной из наиболее удачных реализаций этой идеи.
2. Проблема абсолютных позиций
| Аспект | Ограничение APE |
|---|---|
| Экстраполяция | APE не способны обобщаться на длины, не встречавшиеся при обучении. Если модель обучалась на последовательностях до 2048 токенов, подача на вход 4096 токенов приведёт к неопределённым или неправильно обученным позиционным векторам. |
| Отсутствие относительной информации | Attention-слой «видит» только абсолютные позиции; чтобы вывести относительные расстояния, модель должна выучить сложные паттерны. |
| Параметрическая избыточность | Обучаемые APE добавляют ( [text](/wiki/text){max_len} \times d ) параметров. Для длинных контекстов это дорого. |
Эти ограничения становятся критическими в задачах Agentic RAG, где агент может обрабатывать контексты переменной длины (от фрагментов до целых документов).
3. Идея RoPE: вращение в комплексном пространстве
Position Embedding (RoPE), предложенная в статье "RoFormer: Enhanced Transformer with Position Embedding" (Su et al., 2021), работает не путём добавления сигнала к вектору, а путём вращения пар координат вектора эмбеддинга в двумерном комплексном подпространстве.
Ключевая интуиция:
- Разобьём (d)-мерный вектор эмбеддинга (x) на (d/2) пар соседних координат.
- Каждую пару ((x_{2k}, x_{2k+1})) интерпретируем как комплексное число: (z_k = x_{2k} + i x_{2k+1}).
- Для каждой пары задаётся своя угловая частота (\theta_k) (обычно (\theta_k = 10000^{-2k/d})).
- Позиция (pos) кодируется поворотом комплексного числа на угол (pos \cdot \theta_k): [ z_k' = z_k \cdot e^{i \cdot pos \cdot \theta_k} ]
- В вещественных координатах это соответствует ортогональному преобразованию: [ \begin{pmatrix} x_{2k}' \ x_{2k+1}' \end{pmatrix} = \begin{pmatrix} \cos(pos\theta_k) & -\sin(pos\theta_k) \ \sin(pos\theta_k) & \cos(pos\theta_k) \end{pmatrix} \begin{pmatrix} x_{2k} \ x_{2k+1} \end{pmatrix} ]
Таким образом, каждой паре координат соответствует своя частота вращения, и вектор эмбеддинга после применения RoPE содержит информацию как о содержании токена, так и о его абсолютной позиции.
4. Математическая формулировка RoPE
Для последовательности токенов с эмбеддингами (\mathbf{x}_1, \mathbf{x}_2, \ldots, \mathbf{x}_n) RoPE применяется к каждому вектору независимо:
[ [text](/wiki/text){RoPE}(\mathbf{x}_m)_k = \begin{cases} x_m^{(k)} \cos(m\theta_k) - x_m^{(k+1)} \sin(m\theta_k), & k [text](/wiki/text){ чётное} \ x_m^{(k-1)} \sin(m\theta_k) + x_m^{(k)} \cos(m\theta_k), & k [text](/wiki/text){ нечётное} \end{cases} ]
где (m) — позиция токена, а (\theta_k = 10000^{-2\lfloor k/2 \rfloor / d}).
Внимание: на практике RoPE включается не в эмбеддинг, а в вычисление attention scores. Query и Key векторы поворачиваются, а Value остаётся неизменным. Тогда скалярное произведение между query (q_m) и key (k_n) после вращения приобретает свойство: [ \langle [text](/wiki/text){RoPE}(q_m), [text](/wiki/text){RoPE}(k_n) \rangle = [text](/wiki/text){Re}\left( \sum_{j} q_{m,2j:2j+1} \cdot k_{n,2j:2j+1}^* \cdot e^{i(m-n)\theta_j} \right) ] То есть attention score зависит только от относительного расстояния ((m-n)). Абсолютные позиции (m) и (n) по отдельности не влияют — только их разность. Это и есть относительное позиционирование, полученное из абсолютных вращений.
5. Как RoPE влияет на attention score
Покажем на примере пары ( (x_{2k}, x_{2k+1}) ). Пусть query (q_m) и key (k_n) для токенов на позициях (m) и (n). После поворота:
[ q_m' = R_m \cdot q_m, \quad k_n' = R_n \cdot k_n ] где (R_m) — блочно-диагональная матрица вращений с углами (m\theta_k).
Тогда произведение: [ q_m'^T k_n' = q_m^T R_m^T R_n k_n = q_m^T R_{m-n} k_n ] поскольку (R_m^T R_n = R_{n-m}) (вращения коммутируют). Таким образом, attention-вес определяется эмбеддингами токенов и относительным сдвигом (m-n). Модель «видит» расстояние между токенами, а не их абсолютные номера.
Это свойство позволяет RoPE:
- Обобщаться на длины, превышающие тренировочные — при увеличении длины меняются только аргументы синусов/косинусов (не более 1 периода), без выхода за обученный диапазон.
- Эффективно работать с линейными attention (например, в Transformer‑XL офлайн-вычисление).
6. Преимущества RoPE
| Преимущество | Описание |
|---|---|
| Отсутствие параметров | Вращения задаются аналитически, не требуется обучаемых весов. |
| Относительное позиционирование | Внимание естественным образом зависит от расстояния между токенами. |
| Экстраполяция | Легко обобщается на последовательности, в 2–4 раза длиннее обучающих (например, LLaMA-2 с окном 4096 на практике может обрабатывать до 8192). |
| Вычислительная эффективность | Преобразование выполняется за (O(n d)) операций, не требует дополнительной памяти для хранения позиционных матриц. |
| Совместимость с кэшированием KV | Поскольку вращаются только Q и K, кэш keys не пересчитывается при генерации. |
Эти качества делают RoPE стандартом де-факто в современных LLM.
7. Сравнение с другими подходами
| Метод | Тип позиционирования | Параметры | Экстраполяция | Применение |
|---|---|---|---|---|
| Absolute (синусоидальные) | Абсолютное | Нет | Плохая | Базовые трансформеры |
| Absolute (обучаемые) | Абсолютное | (O([text](/wiki/text){max_len} \cdot d)) | Нет | BERT, GPT-2 |
| T5 relative bias | Относительное | (O([text](/wiki/text){window})) | Средняя (фикс. окно) | T5 |
| ALiBi | Относительное | Нет | Хорошая | BLOOM, MPT |
| RoPE | Относительное (через вращение) | Нет | Отличная | LLaMA, Mistral, GPT-NeoX, Yi |
RoPE сочетает лучшие черты: не требует параметров, экстраполирует дальше ALiBi (за счёт различных частот) и даёт более гладкое представление относительных расстояний.
8. Реализация RoPE в PyTorch
Ниже представлен фрагмент, как обычно применяют RoPE к query и key перед вычислением attention:
import torch
import math
def precompute_theta_pos_frequencies(head_dim, seq_len, theta_base=10000.0):
# head_dim обычно равен d_model // num_heads
# Вычисляем theta для каждой пары координат
inv_freq = 1.0 / (theta_base ** (torch.arange(0, head_dim, 2).float() / head_dim))
# Создаём позиционные индексы: [0, 1, ..., seq_len-1]
positions = torch.arange(seq_len)
# Перемножаем: [seq_len, head_dim//2]
angles = positions[:, None] * inv_freq[None, :]
# Превращаем в [seq_len, head_dim] с помощью sin и cos
# cos(angles) и sin(angles) по два раза
cos = torch.cos(angles).repeat_interleave(2, dim=-1)
sin = torch.sin(angles).repeat_interleave(2, dim=-1)
return cos, sin
def apply_rotary_emb(x, cos, sin):
# x: [batch, seq_len, num_heads, head_dim]
# Разделяем на две половины
half = x.shape[-1] // 2
x1 = x[..., :half]
x2 = x[..., half:]
# Применяем вращение
x_rot = torch.cat([x1 * cos - x2 * sin, x1 * sin + x2 * cos], dim=-1)
return x_rot
# Пример использования в attention:
cos, sin = precompute_theta_pos_frequencies(head_dim, seq_len)
q = apply_rotary_emb(q, cos[:seq_len], sin[:seq_len])
k = apply_rotary_emb(k, cos[:seq_len], sin[:seq_len])
# Далее стандартное вычисление attention
Обратите внимание: на практике часто объединяют cos и sin в один тензор для векторизации.
9. Когда RoPE особенно полезна
- Long-context RAG: агент может получать длинные документы (10k+ токенов). RoPE позволяет fine-tune модель на коротких контекстах, а затем использовать на длинных без переобучения.
- Agentic циклы: когда агент генерирует цепочки рассуждений с растущим контекстом, RoPE стабильно кодирует позиции на каждом шаге.
- Динамическая длина входов: в чат-системах длина истории может сильно варьироваться; RoPE адаптируется без изменения архитектуры.
10. Недостатки и ограничения
- Периодичность: при очень больших расстояниях (>> (2\pi / \theta_{\min})) вращения могут привести к неоднозначности (алиасинг). На практике решается подбором (\theta).
- Отсутствие смещения абсолютного времени: в некоторых задачах (например, предсказание следующего токена) абсолютная позиция тоже важна. RoPE даёт только относительную информацию.
- Сложность масштабирования до тысяч раз: несмотря на хорошую экстраполяцию, при увеличении длины в 10+ раз требуется дополнительная настройка (например, NTK-aware scaling).
Эти ограничения не снижают ценности RoPE для большинства приложений, но о них стоит знать на собеседовании.
11. Пет-проект для закрепления
Задача Реализовать RoPE "с нуля" и сравнить влияние на perplexity модели для последовательностей разной длины.
Инструменты PyTorch, Hugging Face Transformers (например, загрузить LLaMA-2-7B, где уже есть RoPE), либо написать мини-трансформер.
Шаги:
- Реализовать
precompute_freqs_cisиapply_rotary_emb. - Натренировать маленький трансформер (2 слоя, 4 головы, d=128) на корпусе текстов (например, WikiText-2) с фиксированной длиной 512.
- Оценить perplexity на тестовых последовательностях длиной 512, 1024, 2048.
- Заменить RoPE на обучаемые абсолютные эмбеддинги (с max_len=512) и повторить замеры.
- Сравнить результаты: у модели с RoPE perplexity на длинах >512 останется приемлемой, а с абсолютными – резко упадёт.
Ожидаемый результат Убедиться, что RoPE устойчив к длинным контекстам, и понять механизм на практике.
12. Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 277 | Абсолютные позиционные эмбеддинги |
| 279 | ALiBi – линейное смещение внимания |
| 280 | Относительное позиционирование в T5 |
| 281 | Механизмы экстраполяции позиций |
| 282 | Linear attention и позиционные кодировки |
| 285 | Архитектура LLaMA (использует RoPE) |
13. Навигация
- Предыдущий: 277
- Следующий: 279
- Индекс: 00. Индекс разборов
Навигация
- Предыдущий: 277
- Следующий: 279
- Индекс: 00. Индекс разборов