Если вы до сих пор считаете, что positional encoding в трансформерах — это знаменитые sin/cos из статьи 2017 года, то боюсь, что собеседование для вас закончится автоматическим реджектом.
Позиционное кодирование заметно эволюционировало с момента появления оригинальной статьи о трансформерах. В современных LLM и моделях компьютерного зрения, таких как FLUX, уже давно не используется классическое sin/cos-кодирование.
Про это почему-то не знают 80% кандидатов на интервью, хотя, казалось бы, эта информация уже давно перешла в разряд «базовой классики».
В этой статье я разберу популярные вопросы с технических собеседований, связанные с позиционным кодированием: как оно устроено, как реализуется в современных моделях, расскажу про relative encodings, как устроено позиционное кодирование в T5, а также завершим обзор rotary embeddings.
Разбирать темы будем в формате реального собеседования — покажу, как правильно отвечать на вопросы, чтобы производить впечатление опытного специалиста и показать своё глубокое понимание устройства трансформеров.
Формат: вопрос — ответ.
Вопрос 1. Зачем в трансформере позиционное кодирование, что это такое?
Ответ:
Для начала коротко расскажу об устройстве трансформера и операции self-attention.
Небольшое напоминание (mini-recap) про архитектуру трансформера:
Предположим, что мы работаем с текстовыми данными. На первом этапе последовательность слов нужно преобразовать в числовой формат, удобный для нейросетки — этот процесс называется токенизацией . Каждому слову (грубо говоря, хотя на деле токены — это более атомарные единицы, чем целое слово) присваивается свой уникальный вектор — эмбеддинг , который передаётся в нейросеть для дальнейшей обработки и получения предсказания.

Трансформер изначально не учитывает порядок слов в предложении. Механизм внимания работает с элементами как с множеством, а не как с последовательностью. То есть для него “кошка видит собаку”
и “собака видит кошку”
— одинаковые наборы слов.
Позиционное кодирование (positional encoding) — это способ добавить в модель информацию о позиции каждого токена в последовательности. В оригинальной статье оно прибавляется к эмбеддингам токенов до входа в первый слой self-attention.
Если ты посмотришь на матрицу внимания, то увидишь, что она показывает, какие токены "обращают внимание" друг на друга. Но если мы не скажем модели, где какой токен стоит, она просто будет считать их без учёта порядка. Это может привести к тому, что семантика предложения будет потеряна.
? Как это влияет на обучение?
Без positional encoding модель теряет важную структурную информацию
Она может частично компенсировать это через другие слои, но это требует большего числа параметров и данных
Правильное позиционное кодирование помогает модели лучше понимать локальный контекст и длинные зависимости
Вопрос 2. А можно вообще убрать позиционное кодирование?
Да, можно!
Вот статья https://arxiv.org/pdf/1905.04226 в которой исследована возможность убрать кодирование и они получили даже лучше метрики качества, чем с кодированием, но

это кажется выброс и на практике мы видим, что у всех топовых моделей все еще присутствуют этап позиционного кодирования.
Хотя вот еще статья 23-го года The Impact of Positional Encoding on Length Generalization in Transformers
.
В которой пишут о том, что decoder-only модели(GPT) сами могут выучить кодирование , и не надо делать отдельной операцией. Вот цитата из статьи:
Our findings reveal that the most commonly used positional encoding methods, such as ALiBi, Rotary, and APE, are not well suited for length generalization in downstream tasks. More importantly, NoPE outperforms other explicit positional encoding methods while requiring no additional computation. We theoretically demonstrate that NoPE can represent both absolute and relative PEs, but when trained with SGD, it mostly resembles T5’s Relative PE attention patterns.

Если лень на собесе приводить примеры этих статей, озвучьте классическое: трансформер использует механизм self-attention, который по своей природе инвариантен к порядку элементов. То есть, если ты перемешаешь слова в предложении, матрица внимания изменится, но модель не «заметит» этого изменения напрямую , потому что она не знает, где какой токен стоял изначально.
Вопрос 3. Какие недостатки у оригинального подхода через sin/cos?
Sin/Cos positional encoding — это первый и классический способ передачи информации о позиции в трансформере (Vaswani et al., 2017). Но у него есть несколько важных ограничений , которые со временем заставили исследователей искать более гибкие и масштабируемые решения

Основные недостатки ?:
-
Фиксированная функция
Sin/Cos кодирование не обучается , оно задано аналитически.
Это делает его менее адаптивным к специфике задачи или датасета.
-
Проблемы с экстраполяцией
Хотя теоретически модель может обрабатывать последовательности любой длины, на практике длинные последовательности могут приводить к ухудшению качества.
Периодичность sin/cos может создавать неправильные паттерны между удалёнными токенами.
-
Невозможность учёта специфики задачи
Модель не может "подстроиться" под конкретную структуру данных.
Например, если в вашей задаче важна определённая зависимость между близкими словами — sin/cos не сможет это выделить.
Что такое Absolute Positional Encoding?
Теперь самое время ввести термин, который объединяет sin/cos и обучаемый positional embeddings:
Absolute Positional Encoding - это общий термин для методов, где позиция каждого токена кодируется отдельно и явно , без учета относительного расстояния до других токенов.
Кстати, в сфере Computer vision, в ViT моделях используются обучаемые positional encodings, почему так честно сам не знаю.
Вопрос 4. Разница между абсолютным и относительным кодированием?
Даем сначала определения
Absolute positional encoding - это подход, при котором каждому токену присваивается уникальный вектор на основе его абсолютной позиции в последовательности .
То есть:
Первый токен всегда получает одно и то же значение (например,
PE[0]
)Второй — другое (
PE[1]
) и так далее
Примеры:
Sin/Cos кодирование из оригинального transformer’а
Learned positional embeddings (BERT, RoBERTa)
Relative Positional Encoding - это подход, при котором модель учитывает не абсолютные номера позиций токенов, а относительное расстояние между ними. Вместо того чтобы присваивать каждому токену фиксированный вектор на основе его места в последовательности, Relative Positional Encoding формирует представления, зависящие от разницы позиций пары токенов — например, насколько далеко запрос (query) отстоит от ключа (key) в механизме внимания. Такой подход позволяет модели лучше улавливать локальные зависимости и взаимосвязи между элементами вне зависимости от их абсолютного расположения в тексте или другой последовательности. Это особенно полезно в задачах с длинными входами, где важна структура и порядок, но не конкретные номера позиций.
Пример работы relative positional encoding
Представь, что у нас есть два токена:
Токен A на позиции 3
Токен B на позиции 5
В absolute positional encoding модель знает:
A — это позиция 3
B — это позиция 5
В relative positional encoding модель знает:
B находится на +2 позиции от A
Это помогает лучше понять, насколько они связаны по порядку
Где используется relative positional encoding?
Self-Attention with Relative Position Representations, 2018 – первая работа, где предложили добавлять информацию о разнице позиций в матрицу внимания.
T5, 2020 – использует скалярные relative embeddings с логарифмическим биннингом.
DeBERTa , BigBird , Longformer – используют relative positional info для эффективной обработки длинных текстов.
RoPE (Rotary Position Embedding), 2023 – современный способ кодирования относительной позиции через поворот векторов (LLaMA, Falcon и др.)
Еще одна важная разница
APE применяется ко входному тензору токенов ДО self-attention
-
RPE применяется ВНУТРИ self-attention к query, key векторам
Схема работы Rotary embeddings
Идея кодировать токены только по зависимости того насколько далеко они друг от друга очень логично выглядит. Представим у нас предложение: Шла Саша по шоссе и сосала сушку.
Тогда кодирование между слова Саша - шоссе, будет такое же как и между Шла - по
Это кодирование будет происходить в матрице сравнений Self-attention
Вопрос 5. Почему бы не делать кодирование через порядковые числа 1 2 3, а не сложный sin/cos?
На первый взгляд, идея использовать простые числа — 1, 2, 3... — кажется логичной и даже более интуитивной. Однако в контексте нейронных сетей и особенно трансформеров такой подход имеет существенные ограничения.
1. Проблема масштабирования
Если мы просто передадим номер позиции как число (например, 1
, 2
, 3
), то для последовательности из 1000 токенов максимальное значение будет 999
. Это создаст сильный дисбаланс между первыми и последними токенами, особенно если модель работает с разной длиной входов. Такая числовая информация будет влиять на обучение и нормализацию, но не будет нести полезного смысла для модели.
2. Нет интерпретируемой структуры для сравнения позиций
Число 5
не связано математически с числом 6
никакой периодичностью или плавным переходом. Для модели это просто скаляр, который сложно использовать при вычислении внимания. В то время как sin/cos-функции создают плавные и периодические представления , которые легче интерполировать и сравнивать.
3. Невозможность обобщать на произвольную длину
Один из ключевых плюсов sin/cos кодирования — возможность экстраполяции . Если последовательность длиннее, чем те, что были в обучающих данных, мы можем просто продолжить вычислять функции для новых позиций. Число 1001
не даёт никакой информации о близости к 1000
, тогда как sin/cos значения будут отличаться предсказуемо и гладко.
4. Скалярное число не работает в многомерном пространстве
Позиционное кодирование добавляется к эмбеддингам токенов, которые обычно имеют размерность d_model
(например, 512 или 768). То есть каждому токену соответствует вектор, а не одно число. Если мы просто будем использовать номер позиции как скаляр и повторять его по всем измерениям, это приведёт к потере информативности и создаст сильную корреляцию между компонентами .
Вопрос *. Какое кодирование в модели T5?
T5 — одна из первых крупных моделей, где позиционное кодирование было пересмотрено с точки зрения эффективности и масштабируемости. В отличие от BERT или RoBERTa, где используется learned absolute positional encoding, T5 делает ставку на relative positional encoding , но в сильно упрощённой и оптимизированной форме .
Там оно было как раз в виде скаляров.
Основные особенности T5 Relative Position Encoding:
1. Скалярные значения вместо векторов
Вместо того чтобы использовать вектора размерности
d_model
для каждой относительной позиции (как в Shaw et al., 2018), T5 использует скаляры .То есть каждая относительная позиция кодируется одним числом , которое добавляется к соответствующему attention logit'у.
2. Ограниченное число эмбеддингов
В T5 используется всего 32 относительных эмбеддинга , независимо от длины последовательности.
-
Эти эмбеддинги покрывают относительные расстояния от
-n
до+m
, гдеn
иm
зависят от реализации, но обычно:Близкие позиции: точное соответствие
Дальние позиции: группируются по логарифмической шкале
Например:
Относительные расстояния от -8 до +8 получают уникальные скалярные значения
Расстояния больше 8 кодируются через логарифмическое биннинг-правило
Это сильно снижает количество обучаемых параметров и память, необходимую для хранения.
Вопрос 6. Как устроен RoPE
Rotary Position Embedding (RoPE) — это современный и мощный способ кодирования позиционной информации, который активно используется в современных LLM, таких как LLaMA, Falcon, Phi-3, а также в картичнончых моделях FLUX
Rotary Positional Embedding (RoPE) — это метод кодирования позиционной информации, при котором позиция токена не добавляется к его эмбеддингу , а встраивается через поворот вектора в многомерном пространстве.
Это кардинально отличается от классических подходов, где позиционное кодирование просто складывалось с входными эмбеддингами (APE). В RoPE информация о позиции вводится на уровне механизма внимания , модифицируя взаимодействие между query и key векторами.
Основная идея RoPE
Вместо того чтобы использовать фиксированные или обучаемые векторы для обозначения позиции, RoPE применяет математически строгое преобразование , основанное на повороте вектора в комплексной плоскости .
Для каждого токена и каждой пары координат (x,y) из его вектора эмбеддинга, применяется следующее преобразование:

Где θ — это функция от номера позиции m , например:
Таким образом, для каждой позиции m определяется свой угол поворота , и все пары координат внутри вектора эмбеддинга поворачиваются на этот угол.
Почему именно поворот?
Идея поворота позволяет модели сохранить относительную информацию между токенами , потому что:
Поворот зависит только от разницы позиций, а не от абсолютных значений
Это делает RoPE по сути относительным позиционным кодированием
При вычислении матрицы внимания между query и key, относительные позиции автоматически учитываются благодаря геометрической структуре векторов
Пример использования
Представь, что у тебя есть два токена:
Токен A на позиции m
Токен B на позиции m+Δ
После применения RoPE:
Их векторы будут повернуты на разные углы
Разница между этими углами будет зависеть от Δ
-
Это влияет на значение attention score, тем самым передавая информацию о относительном расстоянии между токенами
Визулиазация того, как выглядят повороты
Это был непростой технический материал — если ты дочитал до конца, значит, ты супер молодец!
Такие темы я разбираю регулярно — вместе с примерами кода, объяснениями, а иногда и тем, чего нет даже в оригинальных статьях.
Вот еще мои статьи про подготовку к собеседованиям
Про интерактивный сборник материалов по ML
Про CLIP модели и базу к Computer vision собесам
Вопросы с ML | Computer vision собесов Читай у меня в телеграм канале
Комментарии (4)
scientificus-emigrans
09.07.2025 17:39Если вы до сих пор считаете, что positional encoding в трансформерах — это знаменитые sin/cos из статьи 2017 года, то боюсь, что собеседование для вас закончится автоматическим реджектом.
Ну удачи им в поисках кандидатов, которые в совершенстве знают виды positional encoding в трансформерах, предметную область NLP с которой им придется работать и еще и хотят немного денег.
А если более развернутый и менее токсичный комментарий) то, как вы правильно упомянули, кодирование порядка слов в трансформере не самая важная его часть. В одном из проектов, мы делали трансформер для преобразования Set2Set, где позиционное кодирование не то, что не нужно а даже вредно. В результате модель прекрасно работает и с позиционным кодированием и без. Поэтому народ и не особо уделяет этому внимание.
Если на собеседовании задается вопрос про positional encoding это может означать 2 вещи:
Вы устраиваетесь на позицию PhD/Postdoc в лабораторию которая занимается AI и вам придется с этим работать (например, проводить эксперименты по новым типам трансформеров). Такие кандидаты стоят очень дорого.
Интервьювер не понимает что спрашивать надо, и спрашивает вопрос по тому, что выучил сам.
Ответ про sin/cos достаточен, потому-что показывает, что кандидат знает как с помощью простых периодических функций можно закодировать позицию. И это достаточно древняя идея, использовавшаяся и до трансформеров. Остальное, в работе ему скорее всего не понадобится, за исключением п.1
Ну и да) просить написать техническую статью по AI ChatGPT -- иронично
naumtsevalex
09.07.2025 17:39Ну камон) Если ты идешь NLP разрабом и идешь на техническую секцию, то пробегутся о всех частях трансформера, и конечно нужно знать о позиционных кодировании - это буквально проверка как устроен трансформер и куда/как в нем можно вставить знания о позиции
Если не везде, то в бигтехах точно спрашивают
vened
1001 -- составное число:
.
boterxxx Автор
Спасибо за замечание
Неправильный нейминг сделал, имел ввиду просто число 1001, никаких отсылок на математические свойства простых чисел