COMRAD404 / GLOSSARY

Позиционное кодирование (Positional Encoding)

Positional Encoding

Позиционное кодирование (Positional Encoding) передает трансформеру порядок токенов, которого нет в самом attention. В статье — простое объяснение, схема работы, различия между синусоидами, learned embeddings, RoPE и ALiBi, а также их ограничения.

TL;DR

Позиционное кодирование — это механизм, который передает трансформеру информацию о порядке токенов, потому что сам attention не знает последовательность элементов.

Позиционное кодирование (positional encoding) — это способ сообщить трансформеру порядок токенов во входной последовательности. Без такого сигнала self-attention видит связи между токенами, но сам по себе не знает, что было раньше, а что позже.

В исходной статье Transformer позиционные векторы нужны именно для инъекции порядка. Авторы также сообщили, что learned positional embeddings работали почти так же, а синусоидальный вариант они выбрали потому, что он позволяет экстраполировать на более длинные последовательности.

Английский термин: positional encoding. Также встречаются: position embedding, positional embedding, «позиционные эмбеддинги». Важно: это не полные синонимы. На практике это семейство механизмов, которые добавляют в модель информацию о позиции токена или о расстоянии между токенами.

Практический вердикт: если вам нужен понятный базовый вариант, начинайте с классического синусоидального кодирования из Transformer. Если для вас критична работа на длинах, выходящих за обучающий контекст, отдельно изучайте RoPE и ALiBi, но не считайте их взаимозаменяемыми по умолчанию.

Простыми словами

Можно представить, что модель получает стопку карточек со словами. Если карточки не пронумеровать, фразы с одинаковыми словами, но в разном порядке, будут для модели слишком похожи.

Позиционное кодирование — это, грубо говоря, способ выдать каждой карточке номер места в очереди. Аналогия неполная: в реальной модели это не отдельная цифра рядом со словом, а вектор или bias, который попадает в вычисления attention.

Как это работает

В официальном tutorial TensorFlow по Transformer прямо сказано: attention сам по себе не содержит информации о порядке. Поэтому токеновые эмбеддинги дополняют позиционной информацией до того, как модель начнет сравнивать токены между собой.

Токены -> эмбеддинги токенов
Позиции 0..n -> позиционные векторы или bias

Дальше один из вариантов:
1) позиционный вектор добавляется к эмбеддингу токена
2) позиция встраивается в представления для attention
3) к attention scores добавляется bias по расстоянию

Результат:
self-attention получает не только «что это за токен»,
но и «где он находится относительно других»

Синусоидальное positional encoding

В исходном Transformer каждой позиции соответствует фиксированный вектор. Его координаты строятся через функции sine и cosine разной частоты, а затем этот вектор добавляется к эмбеддингу токена.

Идея в том, что позиция кодируется не как произвольный ID, а как гладкий числовой шаблон. Именно этот вариант авторы выбрали в статье, потому что он, по их словам, позволяет экстраполировать на более длинные последовательности.

Learned absolute position embeddings

Вместо фиксированной формулы можно обучать отдельную таблицу позиционных векторов. В той же исходной работе сказано, что learned positional embeddings показали почти идентичный результат по сравнению с синусоидальными.

Это важно практически: «позиционное кодирование» не обязано быть фиксированным и математически заданным. Официальный пример такого подхода — слой PositionEmbedding в KerasHub, который учит позиционные векторы для входных последовательностей.

RoPE

Rotary Position Embedding (RoPE) кодирует позицию иначе. В документации Hugging Face для RoFormer механизм описан как поворот представлений токенов в двумерном пространстве, чтобы зашить в них позицию.

Это уже не просто «прибавить еще один вектор сверху». Позиционная информация встраивается в те представления, которые затем участвуют в attention.

ALiBi

ALiBi идет еще по другому пути: вместо явных позиционных эмбеддингов он добавляет к attention scores линейный bias, пропорциональный расстоянию между токенами. В исходной работе и репозитории это подается как способ train short, test long — обучать на более коротких последовательностях и тестировать на более длинных.

Итого: под одним зонтичным термином «позиционное кодирование» скрываются механизмы с разной точкой вмешательства. Одни меняют входные представления, другие — сами вычисления attention.

Где применяется

  • Нейронный перевод на Transformer. В официальном tutorial TensorFlow/Keras по машинному переводу эмбеддинги дополняются синусоидальным positional encoding именно потому, что attention без этого не знает порядок слов.
  • Базовые и учебные реализации Transformer в PyTorch. torch.nn.Transformer описан как reference implementation оригинальной архитектуры и отдельно отмечен как вариант с ограниченным набором возможностей по сравнению с новыми архитектурами. Учебный tutorial для языкового моделирования с nn.Transformer существует, но он помечен как deprecated.
  • Keras-модели с обучаемыми абсолютными позициями. Слой PositionEmbedding подходит, когда вы хотите учить позиционные векторы вместе с моделью. Практическая оговорка из документации: сам слой не поддерживает masking, поэтому при работе с padding его комбинируют с keras.layers.Embedding.
  • Эксперименты с альтернативами для длинных последовательностей. Документация RoFormer в Hugging Face описывает текущую реализацию как encoder-only, а значение max_position_embeddings по умолчанию указано как 1536. ALiBi, напротив, интересен там, где вы отдельно проверяете экстраполяцию на длины за пределами обучающего контекста.

Практический пример

Ниже — не «лучший рецепт на все случаи», а рабочий сценарий выбора механизма в Keras/TF без смешивания терминов.

  1. Сначала решите, что именно вам нужно: фиксированный и воспроизводимый baseline или обучаемые позиции. Для baseline ближе всего синусоидальный вариант из исходного Transformer.
  2. Если хотите обучаемые абсолютные позиции, используйте токеновые эмбеддинги и поверх них добавляйте PositionEmbedding. Но учитывайте ограничение из документации: этот слой не поддерживает masking, поэтому логику padding нужно продумать отдельно.
  3. Если длина входов меняется от вызова к вызову, в TF Models API есть tfm.vision.layers.PositionalEncoding. Документация отмечает, что при cache_encoding=False слой перестраивает кодирование на каждом вызове, и это полезно для variable-length inputs.
  4. Если вы рассматриваете RoPE или ALiBi, не относитесь к ним как к простому косметическому переключателю. Они встраивают позицию по-разному, значит и проверять их нужно по-разному.
  5. Проверяйте поведение на длинах, отличных от обучающих, через отдельную валидационную выборку. Иначе вы не увидите, помогает ли механизм именно на длинном контексте.

Чем отличается от…

Понятие Что кодирует Как внедряется Практическая оговорка
Эмбеддинг токена Содержание токена, то есть его векторное представление Преобразует token ID в вектор Сам по себе не кодирует порядок
Синусоидальное positional encoding Абсолютную позицию Фиксированный вектор добавляется к эмбеддингу токена Выбран в исходном Transformer из-за экстраполяции на более длинные последовательности
Learned position embedding Абсолютную позицию Обучаемая таблица позиционных векторов В исходной статье работал почти так же, как синусоиды; в KerasHub PositionEmbedding не поддерживает masking
RoPE Позицию через вращение представлений Позиция встраивается в представления, используемые attention В документации Hugging Face текущая реализация RoFormer отмечена как encoder-only
ALiBi Предпочтение по расстоянию между токенами Линейный bias добавляется к attention scores Не использует явные position embeddings; в работе акцент сделан на length extrapolation

Ограничения и заблуждения

  • Заблуждение: «self-attention сам понимает порядок». Нет. Официальный tutorial TensorFlow прямо объясняет обратное: attention без дополнительного сигнала не знает порядок токенов.
  • Заблуждение: «позиционное кодирование — это одна конкретная формула». Нет. Синусоиды, learned position embeddings, RoPE и ALiBi решают одну задачу разными способами.
  • Заблуждение: «если заменить механизм позиции, контекст сразу станет длиннее». Само по себе это не так. Ограничения по длине входа связаны и с архитектурой, и с реализацией, и с настройками вроде контекстного окна.
  • Практическое ограничение API: детали реализации важны. В KerasHub PositionEmbedding не поддерживает masking; в PyTorch reference-реализация torch.nn.Transformer имеет ограниченный набор возможностей по сравнению с более новыми архитектурами; учебный tutorial для nn.Transformer помечен как deprecated.
  • Редакционное ограничение: здесь нет рейтинга «что лучше по качеству или скорости», потому что в доступных официальных источниках и работах из списка нет единого сопоставимого benchmark-набора для синусоид, learned embeddings, RoPE и ALiBi в одинаковых условиях.

Итог для практики: если вы объясняете термин или строите baseline, достаточно понимать базовую идею «модели нужно сообщить порядок». Если вы выбираете механизм для продакшена или исследования, уже нельзя останавливаться на общем слове positional encoding — нужно смотреть на конкретную реализацию и ее ограничения.

Связанные термины и материалы

Чтобы не смешивать уровни абстракции, полезно отдельно разобрать машинное обучение (ML) как общий контекст и инструкционное обучение (Instruction Tuning) как этап настройки LLM, который не заменяет позиционный механизм базовой архитектуры.

Источники

Вопросы и ответы

Зачем нужно позиционное кодирование, если attention уже видит все токены?

Потому что сам attention не несет информации о порядке. Он умеет сопоставлять токены, но без дополнительного сигнала не знает, какой токен был первым, а какой — последним.

Learned position embedding хуже синусоидального?

Не обязательно. В исходной статье Transformer указано, что learned positional embeddings работали почти идентично синусоидальным. Разница в том, что синусоидальный вариант авторы выбрали из-за экстраполяции на более длинные последовательности.

RoPE и ALiBi — это тоже позиционное кодирование?

В широком практическом смысле — да, потому что они тоже передают модели информацию о порядке или расстоянии. Но технически это разные механизмы: RoPE вращает представления, а ALiBi добавляет линейный bias к attention scores.

Увеличивает ли positional encoding максимальную длину контекста?

Само по себе — нет. На максимальную длину влияют архитектурные и реализационные ограничения. Например, в текущей документации Hugging Face для RoFormer значение max_position_embeddings по умолчанию указано как 1536.

Источники

SOURCES

Вопросы и ответы

FAQ
Зачем нужно позиционное кодирование, если attention уже видит все токены?

Потому что сам attention не несет информации о порядке. Он умеет сопоставлять токены, но без дополнительного сигнала не знает, какой токен был первым, а какой — последним.

Learned position embedding хуже синусоидального?

Не обязательно. В исходной статье Transformer указано, что learned positional embeddings работали почти идентично синусоидальным. Синусоидальный вариант авторы выбрали из-за экстраполяции на более длинные последовательности.

RoPE и ALiBi — это тоже позиционное кодирование?

В широком практическом смысле — да, потому что они тоже передают модели информацию о порядке или расстоянии. Но технически это разные механизмы: RoPE вращает представления, а ALiBi добавляет линейный bias к attention scores.

Увеличивает ли positional encoding максимальную длину контекста?

Само по себе — нет. На максимальную длину влияют архитектурные и реализационные ограничения. Например, в текущей документации Hugging Face для RoFormer значение max_position_embeddings по умолчанию указано как 1536.

Читайте также

LINKS