Словарь ИИ

Что такое позиционное кодирование

Что такое позиционное кодирование

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

Содержание статьи

Зачем трансформеру знать порядок слов

Порядок слов меняет смысл, и без учёта позиции модель может потерять важную часть значения. Если в последовательности одни и те же токены переставить местами, набор слов останется тем же, а смысл уже будет другим.

Это особенно заметно в задачах обработки текста. Последовательности вроде «Аллен выгуливает собаку» и «собака выгуливает Аллена» состоят из похожих элементов, но роль каждого слова определяется именно местом в предложении.

Рекуррентные сети, включая RNN и LSTM, обрабатывают вход по шагам, поэтому порядок для них встроен в сам способ вычисления. Трансформер работает иначе: он может обрабатывать токены параллельно, что ускоряет обучение, но убирает естественный механизм отслеживания позиции.

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

Как работает позиционное кодирование

Идея простая: у каждого токена есть вектор значения, а позиционное кодирование добавляет к нему вектор позиции. На вход трансформера поступает их сумма.

Сначала слово или часть слова превращается в эмбеддинг — числовое представление смысла. Но такой вектор сам по себе не сообщает, стоит ли токен в начале, середине или конце последовательности.

Затем для каждой позиции создаётся отдельный вектор. Например, для первой, второй и третьей позиции будут разные числовые шаблоны. Эти шаблоны складываются с эмбеддингами токенов, и модель начинает различать одинаковые слова в разных местах.

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

Какие задачи решает позиционное кодирование

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

  • Абсолютная позиция показывает, где именно стоит токен: первым, пятым или десятым.
  • Относительная позиция помогает учитывать, насколько слова удалены друг от друга.
  • Сохранение структуры позволяет модели лучше работать с предложениями, кодом и другими последовательностями.
  • Параллельная обработка остаётся возможной, потому что порядок задаётся явно, а не через пошаговый проход.

Это важно не только для текста. Та же логика нужна в любых данных, где последовательность влияет на смысл: в коде, временных рядах, последовательностях действий и других подобных задачах.

Какое позиционное кодирование использовалось в исходном трансформере

В оригинальной архитектуре Transformer использовалось синусоидальное позиционное кодирование. Для чётных и нечётных координат вектора применялись функции синуса и косинуса с разной частотой.

Подход из статьи Attention Is All You Need задаёт позицию не обучаемой таблицей, а фиксированной математической схемой. Для каждой позиции и каждой размерности эмбеддинга вычисляется значение по формуле. Часть координат получает значения через синус, часть — через косинус.

Смысл в том, что разные размерности кодируют позицию на разных масштабах. Одни координаты меняются быстро, другие медленно. Благодаря этому модель может улавливать и близкие, и более далёкие отношения между токенами.

Формулы синусоидального позиционного кодирования

Для чётных индексов размерности используется синус, для нечётных — косинус. Это создаёт чередующийся позиционный вектор, где каждая пара координат описывает положение токена на своей частоте.

Формулы записываются так:

PE(pos, 2i) = sin(pos / 10000^(2i / d_model))

PE(pos, 2i + 1) = cos(pos / 10000^(2i / d_model))

Здесь pos — позиция токена в последовательности, i — индекс размерности, а d_model — размерность эмбеддинга модели.

Что означают переменные в формулах

Каждая переменная в формуле отвечает за конкретный аспект кодирования позиции. Без этого набора параметров модель не сможет построить устойчивое числовое представление порядка.

  • pos — номер позиции токена в последовательности.
  • i — индекс координаты ��нутри вектора.
  • d_model — общая размерность эмбеддинга.
  • 10000 — масштабный коэффициент, который меняет частоту синусоид по размерностям.
  • PE — функция, возвращающая позиционное значение для конкретной позиции и координаты.

Почему используются синус и косинус

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

Синус и косинус меняются предсказуемо и ограничены диапазоном от -1 до 1. Небольшой сдвиг по позиции даёт небольшое изменение в значении, а это полезно для нейросети.

Есть и ещё один практический момент. За счёт разных частот в разных координатах позиции получают непохожие представления. Две соседние позиции будут похожи, но не совпадут, а более далёкие позиции будут отличаться сильнее.

Такое кодирование помогает модели замечать расстояния между токенами. Для механизма внимания это важный сигнал.

Чем позиционное кодирование отличается от эмбеддинга слова

Эмбеддинг слова отвечает за смысл токена, а позиционное кодирование — за его место в последовательности. Эти представления решают разные задачи и работают вместе.

Компонент Что кодирует Пример вопроса
Эмбеддинг токена Значение слова или подслова Что означает этот токен?
Позиционное кодирование Положение токена в последовательности Где находится этот токен?
Сумма двух векторов И смысл, и позицию одновременно Какой это токен и где он стоит?

Если оставить только эмбеддинги, одинаковые токены в разных местах будут слишком похожи. Если оставить только позицию, модель поймёт порядок, но потеряет смысловое содержимое. Поэтому на практике используются оба сигнала сразу.

Как выглядит позиционное кодирование на простом примере

Если взять короткую последовательность из трёх токенов, каждая позиция получит свой набор чисел. Эти числа не читаются как слова, но они дают модели ориентир по порядку.

Представим три позиции: 0, 1 и 2. Для каждой из них по формуле вычисляется вектор одинаковой длины. У первой позиции значения будут одни, у второй — уже другие, у третьей — снова другие.

Дальше этот позиционный вектор складывается с эмбеддингом соответствующего токена. В результате один и тот же токен на первой позиции и на третьей позиции будет представлен по-разному.

Для человека это выглядит как набор чисел. Для модели — как способ отличить начало последовательности от её продолжения.

Позиционное кодирование обучается или задаётся заранее

Возможны оба варианта: позиционные представления могут быть фиксированными или обучаемыми. В исходном трансформере использовался фиксированный синусоидальный вариант.

Фиксированное кодирование задаётся формулой и не меняется в процессе обучения. Его плюс в том, что схема известна заранее и не требует дополнительных обучаемых параметров для самих позиций.

Обучаемое позиционное кодирование работает иначе. Для каждой позиции модель хранит отдельный вектор и подстраивает его на этапе обучения. Такой подход тоже применяется, но он уже не совпадает с оригинальной схемой из первой статьи про Transformer.

В чём ограничения позиционного кодирования

Позиционное кодирование не заменяет понимание смысла и не работает отдельно от остальной архитектуры. Оно лишь добавляет сигнал о порядке.

Если модель получает длинные последовательности, способ задания позиции начинает сильнее влиять на качество работы. Разные архитектуры решают эту задачу по-разному: где-то используются абсолютные позиции, где-то относительные.

Кроме того, позиционное кодирование само по себе не объясняет синтаксис, роли слов или логику высказывания. Эти зависимости модель учит уже на уровне внимания и параметров сети.

Коротко: что нужно запомнить

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

  1. Трансформер обрабатывает токены параллельно и не хранит порядок сам по себе.
  2. Позиционный вектор добавляется к эмбеддингу токена.
  3. В исходной версии Transformer использовались синус и косинус с разной частотой.
  4. Результат — модель учитывает и смысл токена, и его место в последовательности.

Если говорить совсем кратко, позиционное кодирование — это числовая метка порядка, встроенная во вход трансформера. Она помогает модели понимать, кто за кем идёт и как из этого складывается структура последовательности.