中文翻译暂不可用,显示俄语原文。

Как работает 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), либо написать мини-трансформер.

Шаги:

  1. Реализовать precompute_freqs_cis и apply_rotary_emb.
  2. Натренировать маленький трансформер (2 слоя, 4 головы, d=128) на корпусе текстов (например, WikiText-2) с фиксированной длиной 512.
  3. Оценить perplexity на тестовых последовательностях длиной 512, 1024, 2048.
  4. Заменить RoPE на обучаемые абсолютные эмбеддинги (с max_len=512) и повторить замеры.
  5. Сравнить результаты: у модели с RoPE perplexity на длинах >512 останется приемлемой, а с абсолютными – резко упадёт.

Ожидаемый результат Убедиться, что RoPE устойчив к длинным контекстам, и понять механизм на практике.


12. Связь с другими вопросами

ВопросТема
277Абсолютные позиционные эмбеддинги
279ALiBi – линейное смещение внимания
280Относительное позиционирование в T5
281Механизмы экстраполяции позиций
282Linear attention и позиционные кодировки
285Архитектура LLaMA (использует RoPE)

13. Навигация


Навигация