Перейти к содержанию

Сравнение позиционных кодирований

~7 минут чтения

Предварительно: Позиционное кодирование | Реализация внимания с нуля


Зачем это нужно

Все методы позиционного кодирования решают одну задачу: сообщить трансформеру порядок токенов. Но делают это радикально по-разному. Sinusoidal (оригинал) жестко фиксирует позиции. Learned -- обучает, но не экстраполирует. RoPE вращает эмбеддинги, неявно кодируя относительные расстояния. ALiBi добавляет линейный штраф к attention -- чем дальше токены, тем слабее связь. Выбор метода определяет, сможет ли модель работать с длинным контекстом за пределами обучающей длины.

Обзор

RoPE -- стандарт 2026: parameter-free, неявно кодирует относительные позиции, хорошо масштабируется. ALiBi лучше в extrapolation за пределы обучающей длины. NoPE -- только для исследований.

Метод Доля рынка Сильная сторона Лучше для
RoPE ~70% Implicit relative encoding General LLMs
ALiBi ~15% Strong extrapolation Long context
Learned (APE) ~10% Simple implementation Short sequences
Sinusoidal ~5% No parameters Legacy models

Методы позиционного кодирования

Таксономия

graph TD
    PE["Positional Encoding"] --> APE["Absolute (APE)<br/>Позиция + эмбеддинг"]
    PE --> RPE["Relative (RPE)<br/>Позиция в attention"]
    PE --> ROPE["RoPE<br/>Вращение эмбеддингов"]
    PE --> ALIBI["ALiBi<br/>Линейный bias в attention"]
    PE --> NOPE["NoPE<br/>Только causal mask"]

    APE --> SIN["Sinusoidal<br/>Original Transformer"]
    APE --> LEARN["Learned<br/>BERT, GPT-2"]
    RPE --> T5B["T5 bias, Shaw's RPE<br/>T5, DeBERTa"]
    ROPE --> ROPE_M["Parameter-free<br/>LLaMA, Mistral, Qwen"]
    ALIBI --> ALIBI_M["Strong extrapolation<br/>BLOOM, MPT"]
    NOPE --> NOPE_M["Research only<br/>Limited effectiveness"]

    style PE fill:#f3e5f5,stroke:#9c27b0
    style APE fill:#fff3e0,stroke:#ef6c00
    style RPE fill:#fff3e0,stroke:#ef6c00
    style ROPE fill:#e8f5e9,stroke:#4caf50
    style ALIBI fill:#e8eaf6,stroke:#3f51b5
    style NOPE fill:#fce4ec,stroke:#c62828

Детали методов

1. Sinusoidal (Original Transformer)

\[PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d}}\right)\]
\[PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d}}\right)\]
Свойство Значение
Parameters 0 (fixed)
Extrapolation Poor
Relative info Implicit
Used by Original Transformer

2. Learned (BERT, GPT-2)

\[x_{pos} = x_{token} + W_{pos}[pos]\]
Свойство Значение
Parameters \(O(L \times d)\)
Extrapolation None (fixed length)
Flexibility High (learned)
Used by BERT, GPT-2, early models

3. RoPE (Rotary Position Embedding)

\[\text{RoPE}(x_m, m) = \begin{pmatrix} x_m^{(1)} \\ x_m^{(2)} \end{pmatrix} \otimes \begin{pmatrix} \cos(m\theta) \\ \sin(m\theta) \end{pmatrix}\]

Full rotation: $\(R_{\Theta,m}^d x = \begin{pmatrix} x_1 \\ x_2 \\ \vdots \\ x_{d-1} \\ x_d \end{pmatrix} \otimes \begin{pmatrix} \cos m\theta_1 \\ \cos m\theta_1 \\ \vdots \\ \cos m\theta_{d/2} \\ \cos m\theta_{d/2} \end{pmatrix} + \begin{pmatrix} -x_2 \\ x_1 \\ \vdots \\ -x_d \\ x_{d-1} \end{pmatrix} \otimes \begin{pmatrix} \sin m\theta_1 \\ \sin m\theta_1 \\ \vdots \\ \sin m\theta_{d/2} \\ \sin m\theta_{d/2} \end{pmatrix}\)$

Свойство Значение
Parameters 0
Extrapolation Medium (with scaling)
Relative info Implicit (mathematical property)
Used by LLaMA, Mistral, Qwen, PaLM

4. ALiBi (Attention with Linear Biases)

\[\text{Attention}(q, k) = \text{softmax}(qK^T + m \cdot (-i + j))\]

Where \(m\) is a head-specific slope (geometric sequence).

Свойство Значение
Parameters 0 (just bias values)
Extrapolation Excellent
Relative info Explicit bias
Used by BLOOM, MPT, some long-context models

5. NoPE (No Positional Encoding)

\[\text{Attention}(q, k) = \text{softmax}(qK^T)\]

Only causal mask provides order information.

Свойство Значение
Parameters 0
Extrapolation N/A
Effectiveness Limited
Used by Research only

RoPE: глубокий разбор

Математическое свойство

RoPE кодирует относительную позицию через математическое свойство вращений:

\[\langle R_{\Theta,m} q_m, R_{\Theta,n} k_n \rangle = \langle q_m, R_{\Theta,n-m} k_n \rangle\]

Скалярное произведение зависит только от разности позиций \((n - m)\), а не от абсолютных позиций. Это дает:

  • Естественное кодирование относительных расстояний
  • Нулевые обучаемые параметры
  • Работу с последовательностями переменной длины

Реализация RoPE

import torch

def precompute_freqs_cis(dim: int, end: int, theta: float = 10000.0):
    """Precompute RoPE frequencies."""
    freqs = 1.0 / (theta ** (torch.arange(0, dim, 2)[:dim//2].float() / dim))
    t = torch.arange(end, device=freqs.device)
    freqs = torch.outer(t, freqs)
    freqs_cis = torch.polar(torch.ones_like(freqs), freqs)  # complex64
    return freqs_cis

def apply_rotary_emb(xq: torch.Tensor, xk: torch.Tensor, freqs_cis: torch.Tensor):
    """Apply RoPE to queries and keys."""
    # Reshape to complex
    xq_ = torch.view_as_complex(xq.float().reshape(*xq.shape[:-1], -1, 2))
    xk_ = torch.view_as_complex(xk.float().reshape(*xk.shape[:-1], -1, 2))

    # Rotate
    freqs_cis = freqs_cis.unsqueeze(0).unsqueeze(2)  # [1, seq, 1, head_dim//2]
    xq_out = torch.view_as_real(xq_ * freqs_cis).flatten(-2)
    xk_out = torch.view_as_real(xk_ * freqs_cis).flatten(-2)

    return xq_out.type_as(xq), xk_out.type_as(xk)

Масштабирование RoPE для длинного контекста

Метод Формула Используется
Linear scaling \(pos' = pos / s\) Simple interpolation
NTK-aware \(\theta' = \theta \times s^{d/(d-2)}\) YaRN, some LLaMA
Dynamic NTK Adaptive \(\theta\) based on length CodeLlama
YaRN Combined scaling + temperature Long-context models

ALiBi: глубокий разбор

Архитектура

Standard Attention: \(\text{Attention} = \text{softmax}(QK^T / \sqrt{d}) \times V\)

ALiBi Attention: \(\text{Attention} = \text{softmax}(QK^T / \sqrt{d} + \text{Bias}) \times V\)

Где \(\text{Bias}_{ij} = m \times (j - i)\) для \(j \leq i\) (causal).

Slopes по головам (геометрическая прогрессия): \(m_h = 1 / 2^{8h/n}\) для \(h = 1, ..., n\).

Пример для 8 голов: \(m = [1/2, 1/4, 1/8, 1/16, 1/32, 1/64, 1/128, 1/256]\)

Bias matrix (голова с \(m = 1/2\), 4 токена):

\[\begin{pmatrix} 0 & -\infty & -\infty & -\infty \\ -0.5 & 0 & -\infty & -\infty \\ -1 & -0.5 & 0 & -\infty \\ -1.5 & -1 & -0.5 & 0 \end{pmatrix}\]

Чем дальше токен -- тем сильнее штраф. Разные головы смотрят на разные масштабы расстояний.

Реализация ALiBi

import torch
import torch.nn.functional as F

def get_alibi_bias(seq_len: int, n_heads: int, device: str = 'cuda'):
    """Compute ALiBi bias matrix."""
    # Head slopes: geometric sequence
    slopes = torch.tensor([2**(-(8 * h / n_heads)) for h in range(1, n_heads + 1)])
    slopes = slopes.to(device).unsqueeze(1).unsqueeze(1)  # [heads, 1, 1]

    # Relative positions
    positions = torch.arange(seq_len, device=device)
    relative_pos = positions.unsqueeze(0) - positions.unsqueeze(1)  # [seq, seq]
    relative_pos = relative_pos.unsqueeze(0)  # [1, seq, seq]

    # ALiBi bias (negative for causal)
    bias = -slopes * relative_pos.abs()  # [heads, seq, seq]

    # Apply causal mask
    causal_mask = torch.triu(torch.ones(seq_len, seq_len, device=device), diagonal=1)
    bias = bias.masked_fill(causal_mask.bool(), float('-inf'))

    return bias

ALiBi не всегда лучше для длинного контекста

Таблица ниже показывает ALiBi лидирует в extrapolation. Но RoPE + YaRN на 128K контексте дает лучшее качество при обучающей длине и приемлемую extrapolation. ALiBi жертвует baseline quality ради extrapolation. В 2026 RoPE + scaling -- стандарт для long-context моделей (LLaMA 3.1 128K, Qwen 128K).

Нельзя менять PE в pretrained модели

Веса attention обучались совместно с конкретным PE. Замена RoPE на ALiBi (или наоборот) полностью ломает обученные паттерны внимания. Даже LoRA fine-tuning не спасёт -- нужно полное переобучение.

Экстраполяция

Обучающая длина RoPE (4K) ALiBi (4K) RoPE + YaRN (4K)
4K eval 100% 100% 100%
8K eval 45% 95% 85%
16K eval 15% 85% 70%
32K eval 5% 65% 50%

Матрица сравнения

Полное сравнение методов

Свойство Sinusoidal Learned RoPE ALiBi NoPE
Parameters 0 O(Ld) 0 0 0
Extrapolation Poor None Medium Excellent N/A
Relative info Implicit No Implicit Explicit No
Training speed Fast Fast Fast Faster Fastest
Long context Poor Poor Good Excellent Poor
Adoption 2026 Low Low High Medium Low

Бенчмарки

Задача Sinusoidal Learned RoPE ALiBi
WikiText-103 (PPL) 24.5 23.8 22.8 23.2
Length 2K Good Good Excellent Excellent
Length 8K Poor Poor Medium Excellent
Length 32K Fail Fail Poor Good

Гайд по выбору

Дерево решений

graph TD
    START{"Use case?"} -->|"Standard LLM training"| ROPE["RoPE<br/>Industry standard"]
    START -->|"Extrapolation beyond<br/>training length"| ALIBI["ALiBi<br/>Best extrapolation"]
    START -->|"Very long context<br/>(100K+)"| YARN["RoPE + YaRN scaling"]
    START -->|"Quick prototype /<br/>research"| LEARN["Learned<br/>Simplest"]
    START -->|"Legacy fine-tuning"| KEEP["Keep original encoding"]

    style ROPE fill:#e8f5e9,stroke:#4caf50
    style ALIBI fill:#e8eaf6,stroke:#3f51b5
    style YARN fill:#e8f5e9,stroke:#4caf50
    style LEARN fill:#fff3e0,stroke:#ef6c00
    style KEEP fill:#fce4ec,stroke:#c62828

Рекомендации по типу модели

Тип модели Рекомендация Причина
Decoder-only LLM RoPE Standard, good performance
Encoder (BERT-style) Learned or RoPE Task-dependent
Long-context LLM ALiBi or RoPE+YaRN Extrapolation needed
Multimodal RoPE-2D or ALiBi-2D Spatial encoding
Time series Specialized temporal PE Periodic patterns

Новые разработки (2025-2026)

2D расширения

Метод Описание Применение
RoPE-2D Separate rotation for x,y Vision transformers
ALiBi-2D 2D bias matrix ViT, image patches
2D-APE Learned 2D embeddings DeiT, ViT

Гибридные подходы

Некоторые модели комбинируют несколько методов:

  1. RoPE + ALiBi -- RoPE для локальной структуры, ALiBi bias для глобальной позиции
  2. Learned + RoPE -- обучаемые базовые частоты + структура RoPE для относительного кодирования
  3. Hierarchical PE -- разное кодирование для разных масштабов: мелкие паттерны (слова) и крупные (абзацы, секции)

Числа для интервью

Бенчмарки экстраполяции

Метод Обучение (2K) Eval 2K Eval 4K Eval 8K
Learned 22.5 PPL 22.5 Fail Fail
Sinusoidal 22.8 22.8 28.5 Fail
RoPE 22.2 22.2 24.1 32.5
ALiBi 22.5 22.5 22.8 23.5

Overhead по параметрам

Метод Параметры Overhead по памяти
Sinusoidal 0 O(L) precompute
Learned \(L \times d\) \(O(L \times d)\)
RoPE 0 \(O(L \times d/2)\) complex
ALiBi 0 \(O(L^2)\) bias (cached)

Скорость обучения

Метод Относительная скорость Примечания
ALiBi 1.0x (fastest) Just bias addition
RoPE 0.98x Complex rotation
Learned 1.0x Embedding lookup
Sinusoidal 0.99x Sin/cos compute

Распространённость в моделях (2026)

Модель Позиционное кодирование Макс. контекст
LLaMA 3.1 RoPE 128K
Mistral RoPE 32K
Qwen 2 RoPE + YaRN 128K
BLOOM ALiBi 2K
MPT-7B ALiBi 65K
GPT-4 Learned (speculated) 128K

Interview Questions

1. RoPE vs ALiBi: когда что использовать?

❌ Red flag: "RoPE лучше, его используют все"

✅ Strong answer: "RoPE -- стандарт для general-purpose LLM: parameter-free, неявно кодирует относительные позиции, хорошая производительность на обучающей длине. ALiBi -- для задач с extrapolation: модель обучена на 4K, но должна работать на 8-32K без дообучения. ALiBi добавляет линейный bias в attention, штрафуя дальние токены -- разные головы смотрят на разные масштабы. Для 100K+ контекста используют RoPE + YaRN scaling. Выбор зависит от сценария: фиксированный контекст → RoPE, нужна extrapolation → ALiBi, длинный контекст с дообучением → RoPE + YaRN."

2. Почему RoPE называют 'relative' если он применяется к абсолютным позициям?

❌ Red flag: "RoPE -- это просто sinusoidal с другой формулой"

✅ Strong answer: "RoPE вращает query и key вектора на угол, пропорциональный абсолютной позиции. Но ключевое математическое свойство: скалярное произведение \(\langle R_m q, R_n k \rangle = \langle q, R_{n-m} k \rangle\) зависит только от разности позиций \((n-m)\). Вращения на абсолютные углы дают относительную информацию через свойства вращений -- это элегантнее чем явные relative biases. В отличие от learned PE, RoPE не хранит embedding matrix и работает с любой длиной."

3. Как расширить контекст модели обученной на 4K до 128K?

❌ Red flag: "Просто подать длинный текст, RoPE справится"

✅ Strong answer: "RoPE не экстраполирует автоматически -- на позициях > 4K частоты выходят за обученный диапазон. Методы: (1) Linear scaling: \(pos' = pos / s\) -- простая интерполяция, качество падает. (2) NTK-aware: масштабирование base frequency \(\theta' = \theta \times s^{d/(d-2)}\) -- лучше сохраняет локальные паттерны. (3) YaRN: комбинация scaling + temperature -- SOTA для длинного контекста. (4) Для ALiBi: extrapolation из коробки, но baseline quality ниже. После scaling обычно нужен continual pretraining на длинных документах."

Самопроверка

  1. Модель обучена с RoPE на 4K контексте. При inference подается 16K токенов без scaling. Что произойдёт и почему? Как это исправить?
  2. ALiBi использует slopes \(m = [1/2, 1/4, ..., 1/256]\) для 8 голов. Вычислите bias для токена на расстоянии 10 от текущего для головы с \(m = 1/4\). Что это означает для attention?
  3. Объясните, почему RoPE называют "relative" несмотря на то, что он применяет абсолютные вращения к каждой позиции. Запишите математическое доказательство.

Источники

  1. ICLR Blogposts — "Positional Embeddings in Transformer Models" (Apr 2025)
  2. arXiv — "Theoretical Analysis of Positional Encodings" (2506.06398)
  3. arXiv — "Positional Encoding in Time Series Models" (2502.12370)
  4. Towards Data Science — "Positional Embeddings: Math Guide to RoPE & ALiBi"
  5. LearnOpenCV — "Inside RoPE: Rotary Magic into Position Embeddings" (Jul 2025)
  6. MachineLearningMastery — "Positional Encodings in Transformer Models" (Sep 2025)
  7. OpenReview — "Positional Encoding Impact on Length Generalization"
  8. mbrenndoerfer.com — "Position Encoding Comparison: Sinusoidal, Learned, RoPE & ALiBi"
  9. Reddit r/MachineLearning — "Extending Context by Dropping Positional Encodings"
  10. Newline.co — "Relative vs. Absolute Positional Embedding in Decoders" (Aug 2025)

See Also