Ну чё, малютки, в июле 2026 Thinking Machines выпустила Inkling и мимоходом сделала то, чего фронтир не делал с 2023-го: выкинула RoPE. Дословно — «relative positional embedding работает лучше и лучше экстраполируется на длинные последовательности, чем более распространённый Rotary Positional Embedding». Чтобы понять, почему это новость, надо понять, что вообще делает RoPE — и почему трансформеру без позиционного кодирования всё равно, в каком порядке идут токены. Разбираем механику от начала до конца, с визуальными демками: RoPE — это буквально вращение векторов, и его удобнее один раз увидеть, чем прочитать десять формул.
Self-attention перестановочно-инвариантен — сам по себе он не различает порядок токенов, позицию надо впрыснуть отдельно. RoPE делает это поворотом: вектор на позиции m поворачивается на угол m·θ, причём разные пары измерений вращаются с разными частотами. Красота в том, что скалярное произведение зависит только от разности позиций (m−n) — то есть кодирование относительное. Ломается RoPE за длиной обучения: углы уходят out-of-distribution. Чинят интерполяцией позиций — NTK-aware и YaRN. А Inkling утверждает, что относительное смещение вместо RoPE экстраполируется лучше.
Часть 1: Зачем трансформеру вообще позиция
Self-attention считает для каждого токена взвешенную сумму остальных — и в этой операции нет ничего про порядок. Переставь входные токены местами, и выход переставится ровно так же, но содержательно не изменится: attention видит множество токенов, а не последовательность. Для языка это катастрофа — «кот ловит мышь» и «мышь ловит кот» стали бы неразличимы. Позиционную информацию нужно добавить руками.
Исторически было два лагеря. Абсолютное кодирование — приклеить к каждому токену вектор его позиции: синусоиды из оригинального «Attention Is All You Need» или обучаемые эмбеддинги позиций. Относительное — кодировать не «токен на позиции 5», а «токен на 3 позиции левее». RoPE хитро совмещает удобство первого с семантикой второго.
Часть 2: RoPE как поворот
Идея RoPE (Su et al., «RoFormer», arXiv:2104.09864) — не прибавлять позицию к вектору, а поворачивать сам вектор запроса и ключа на угол, пропорциональный позиции. Измерения берутся парами (2i, 2i+1), и каждая пара вращается как точка на плоскости. Для одной пары на позиции m:
Целиком по всем измерениям это блочно-диагональная матрица поворота , где i-я пара крутится со своей частотой:
(в пейпере эта же величина написана и в 1-индексной форме — это тот же набор частот, просто другая нумерация). База 10000 — та же, что в синусоидах оригинального трансформера.
θ=1
98°
θ=0.1
46°
θ=0.01
5°
θ=0.001
0°
Низкие измерения (маленькое i, θ близко к 1) вращаются быстро — полный оборот за считанные позиции. Высокие (большое i, θ крошечное) едва ползут — им нужны тысячи позиций на оборот.
Часть 3: Почему это относительное кодирование
Вот главный трюк. Хотя RoPE задаётся через абсолютную позицию m, скалярное произведение повёрнутого запроса и повёрнутого ключа зависит только от разности позиций:
(RoFormer, уравнение 11). Поворот на m и поворот на n при перемножении дают поворот на (m−n) — абсолютные углы сокращаются, остаётся относительный. То есть attention через RoPE видит «на сколько позиций один токен отстоит от другого», а не «какой у каждого абсолютный индекс».
А разброс частот по измерениям (из Части 2) означает, что RoPE кодирует относительные расстояния сразу на многих масштабах — от «соседний токен» до «за тысячу позиций». Само слово «длина волны» для этих измерений закрепил позже пейпер YaRN; RoFormer называл это «long-term decay».
Всё это — про углы векторов. А зачем угол вообще влияет на ответ? Attention выбирает тот ключ, к которому запрос ближе по направлению: поверни вектор запроса — и на выход выходит другое слово. Пощупай сам:
Часть 4: Где RoPE ломается и как чинят
Проблема вылезает, когда на инференсе последовательность длиннее, чем всё, что модель видела при обучении. Пусть при обучении позиции доходили до L_train. Тогда для каждой пары измерений модель видела углы только в диапазоне [0, θ·L_train]. На позиции m > L_train угол m·θ уходит за этот диапазон — в область, которой при обучении не было. Модель получает паттерн вращения, на который её не учили, и качество сыпется.
Чинят это интерполяцией позиций, и есть три уровня хитрости:
- Position Interpolation (Chen et al., arXiv:2306.15595) — в лоб: отобразить позицию m в , линейно сжав весь диапазон обратно в обученный. Так LLaMA растянули с 2048 до 32768 контекста меньше чем за 1000 шагов дообучения.
- NTK-aware interpolation — придумано в community-посте (bloc97, r/LocalLLaMA, середина 2023, потом зафиксировано в пейпере YaRN): вместо равномерного сжатия всех частот масштабируют базу неравномерно — , где s — коэффициент расширения. Высокие частоты почти не трогают, низкие растягивают. Меньше портит близкие расстояния.
- YaRN (Peng et al., arXiv:2309.00071) — «NTK-by-parts» (интерполировать по-разному в зависимости от длины волны измерения) плюс температурный трюк на внимании: домножить логиты так, чтобы . YaRN расширяет контекст до 128k, требуя, по заявлению авторов, «в 10 раз меньше токенов и в 2.5 раза меньше шагов обучения», чем прежние методы.
Часть 5: Контртезис Inkling
И вот тут возвращаемся к началу. Thinking Machines в Inkling (июль 2026) решила, что вся эта конструкция — вращение плюс патчи на экстраполяцию — не оптимальна, и заменила RoPE на relative positional embedding (по формулировке анонса; «выученное» — это уже наша интерпретация, дословно они говорят просто «relative positional embedding»). Их заявление: оно «работает лучше и экстраполируется лучше на длинные последовательности, чем более распространённый RoPE».
Плюс — деталь, которая тут неслучайна: Inkling добавляет короткие свёртки в двух местах — после проекций key и value в каждом слое внимания и на residual-ветках внимания и MLP. Свёртка по своей природе кодирует локальный порядок соседних токенов — то есть часть работы позиционного кодирования уходит в неё.
Насколько это лучше RoPE на практике — покажут независимые замеры (Inkling — свежая модель: 975B параметров всего / 41B активных, MoE из 256 роутизируемых + 2 shared экспертов, sliding-window и global attention в пропорции 5:1, контекст до 1M, 45 триллионов мультимодальных токенов претрейна). Но сам факт, что фронтир-лаборатория ставит под сомнение стандарт де-факто трёх последних лет, — уже сигнал, что позиционное кодирование не «решённая» тема.
TL;DR
RoPE — красивая идея: закодировать относительную позицию через абсолютный поворот, бесплатно получив свойство m−n. Но «бесплатно» кончается ровно на границе длины обучения, и всё, что дальше — интерполяционные костыли той или иной степени изящества. Inkling предлагает не чинить, а заменить. Кто прав — узнаем по независимым длинноконтекстным замерам, а не по строчке в анонсе. 🫡
Источники
- RoFormer: Enhanced Transformer with Rotary Position Embedding — Su et al. (arXiv:2104.09864)
- Extending Context Window of LLMs via Positional Interpolation — Chen et al. (arXiv:2306.15595)
- YaRN: Efficient Context Window Extension of Large Language Models — Peng et al. (arXiv:2309.00071)
- Train Short, Test Long: Attention with Linear Biases (ALiBi) — Press et al. (arXiv:2108.12409)
- Introducing Inkling — Thinking Machines Lab
- KV-кэш: почему LLM помнит без памяти и жрёт VRAM
- FlashAttention: как реально считается attention на GPU
- Kimi K3: open-weight модель обгоняет Claude Opus 4.8


