Сравнение позиционных кодирований¶
~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)¶
| Свойство | Значение |
|---|---|
| Parameters | 0 (fixed) |
| Extrapolation | Poor |
| Relative info | Implicit |
| Used by | Original Transformer |
2. Learned (BERT, GPT-2)¶
| Свойство | Значение |
|---|---|
| Parameters | \(O(L \times d)\) |
| Extrapolation | None (fixed length) |
| Flexibility | High (learned) |
| Used by | BERT, GPT-2, early models |
3. RoPE (Rotary Position Embedding)¶
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)¶
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)¶
Only causal mask provides order information.
| Свойство | Значение |
|---|---|
| Parameters | 0 |
| Extrapolation | N/A |
| Effectiveness | Limited |
| Used by | Research only |
RoPE: глубокий разбор¶
Математическое свойство¶
RoPE кодирует относительную позицию через математическое свойство вращений:
Скалярное произведение зависит только от разности позиций \((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 токена):
Чем дальше токен -- тем сильнее штраф. Разные головы смотрят на разные масштабы расстояний.
Реализация 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 |
Гибридные подходы¶
Некоторые модели комбинируют несколько методов:
- RoPE + ALiBi -- RoPE для локальной структуры, ALiBi bias для глобальной позиции
- Learned + RoPE -- обучаемые базовые частоты + структура RoPE для относительного кодирования
- 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 на длинных документах."
Самопроверка
- Модель обучена с RoPE на 4K контексте. При inference подается 16K токенов без scaling. Что произойдёт и почему? Как это исправить?
- ALiBi использует slopes \(m = [1/2, 1/4, ..., 1/256]\) для 8 голов. Вычислите bias для токена на расстоянии 10 от текущего для головы с \(m = 1/4\). Что это означает для attention?
- Объясните, почему RoPE называют "relative" несмотря на то, что он применяет абсолютные вращения к каждой позиции. Запишите математическое доказательство.
Источники¶
- ICLR Blogposts — "Positional Embeddings in Transformer Models" (Apr 2025)
- arXiv — "Theoretical Analysis of Positional Encodings" (2506.06398)
- arXiv — "Positional Encoding in Time Series Models" (2502.12370)
- Towards Data Science — "Positional Embeddings: Math Guide to RoPE & ALiBi"
- LearnOpenCV — "Inside RoPE: Rotary Magic into Position Embeddings" (Jul 2025)
- MachineLearningMastery — "Positional Encodings in Transformer Models" (Sep 2025)
- OpenReview — "Positional Encoding Impact on Length Generalization"
- mbrenndoerfer.com — "Position Encoding Comparison: Sinusoidal, Learned, RoPE & ALiBi"
- Reddit r/MachineLearning — "Extending Context by Dropping Positional Encodings"
- Newline.co — "Relative vs. Absolute Positional Embedding in Decoders" (Aug 2025)
See Also¶
- RoPE и длинный контекст -- подробный разбор RoPE scaling и расширения контекста
- Длинный контекст -- Ring Attention, Infini-Attention, RAG vs long context
- Сравнение нормализаций -- BatchNorm vs LayerNorm vs RMSNorm
- Сравнение токенизаций -- BPE vs Unigram vs WordPiece
- Реализация внимания с нуля -- полная реализация attention