Нейросети архитектуры Трансформер (на которых построены GPT, BERT и большинство современных языковых моделей) обрабатывают весь текст целиком и одновременно. В отличие от старых рекуррентных сетей, они не читают слова по очереди. Из-за этого Трансформер по умолчанию не знает, какое слово стоит первым, а какое последним. Чтобы нейросеть отличала фразу “собака укусила человека” от “человек укусил собаку”, ей нужно явно указать порядок слов. Этот механизм называется позиционным кодированием.
Позиционное кодирование – это способ добавить к каждому слову (токену) математическую метку, которая сообщает нейросети его место в предложении. Без этого текста модель видела бы текст просто как перемешанный набор слов.
| Что разберем | Что это даст на практике |
| Как именно задаются координаты слов | Сможете понимать логику работы Трансформеров и их ограничения |
| Какой метод кодирования выбрать для своей задачи | Не ошибетесь при выборе между абсолютными метками и RoPE |
| Почему модели “глупеют” на длинных текстах | Сможете правильно рассчитывать окно контекста и избегать переполнения |
Как технически работает позиционное кодирование
Когда вы подаете текст в нейросеть, каждое слово превращается в вектор – длинный список чисел (эмбеддинг), который отражает смысл слова. Позиционное кодирование создает параллельный вектор такого же размера, который отражает только порядковый номер этого слова.
Эти два вектора (смысловой и позиционный) просто складываются вместе. В результате нейросеть получает гибридный вектор: числа в нем содержат информацию и о том, что это за слово, и о том, где оно находится.
Развилка: какой вид позиционного кодирования использовать
Если вы собираете свою модель с нуля или выбираете архитектуру для дообучения (fine-tuning), вам придется столкнуться с выбором метода кодирования. Выбор зависит от длины текстов, с которыми вы будете работать.
1. Абсолютное кодирование (на синусах и косинусах)
Это классический метод из оригинальной статьи “Attention Is All You Need”. Позиции рассчитываются по сложным математическим формулам (синусоидам разных частот). Каждое место в тексте (1-е, 2-е, 100-е) получает свой уникальный, фиксированный вектор.
- Когда подходит: Для базовых задач, где длина текста всегда предсказуема и не выходит за рамки того, что модель видела при обучении.
- В чем минус: Модель плохо справляется с текстами, которые длиннее обучающей выборки (проблема экстраполяции).
2. Обучаемое абсолютное кодирование
Вместо математических формул нейросеть сама в процессе обучения подбирает идеальные векторы для 1-й позиции, 2-й, 3-й и так далее. Этот метод используется в моделях семейства BERT.
- Когда подходит: Для задач с жестким лимитом на длину текста (например, анализ коротких отзывов, классификация документов до 512 токенов).
- В чем минус: Жесткое ограничение длины. Если модель обучена на 512 токенах, на 513-м она выдаст ошибку, потому что для этой позиции у нее просто нет вектора.
3. Относительное кодирование и RoPE (Rotary Position Embedding)
Современный стандарт для генеративных нейросетей (используется в LLaMA, Mistral, GigaChat). Вместо того чтобы запоминать абсолютное место слова от начала текста, этот метод вычисляет расстояние между словами. Нейросети важнее знать, что слово “не” стоит прямо перед словом “работает”, чем то, что они находятся на 145-й и 146-й позициях в документе.
- Когда подходит: При разработке чат-ботов, генераторов кода и систем суммаризации больших текстов.
- В чем плюс: Модель может обрабатывать тексты, которые длиннее тех, на которых она обучалась. Относительные расстояния сохраняют логику независимо от размера документа.
Частые ошибки и точки провала
Ошибка 1: Ожидание, что модель “поймет” бесконечный текст
Даже при использовании современных методов вроде RoPE, контекстное окно модели ограничено. Если вы берете модель с контекстом 4096 токенов и загружаете в нее договор на 10 000 токенов, позиционное кодирование перестает работать корректно. Нейросеть начинает “забывать” начало текста или генерировать бессмысленный набор слов (галлюцинировать).
Как избежать: Если текст превышает окно контекста, используйте методы разбиения (chunking). Разрежьте текст на куски, обработайте их по отдельности, а затем попросите модель сделать сводную выжимку.
Ошибка 2: Слияние текстов без сброса позиций
При подготовке датасета для обучения разработчики часто склеивают несколько коротких документов в один длинный блок, чтобы сэкономить вычислительные ресурсы. Если при этом не сбросить счетчик позиций (не начать отсчет с нуля для нового документа), модель будет думать, что второй документ – это прямое продолжение первого.
Как избежать: Используйте специальные токены-разделители (например, [SEP] или ) и обнуляйте позиционные индексы после каждого конца документа в батче.
Ошибка 3: Применение одномерного кодирования к картинкам
Если вы пытаетесь применить архитектуру Трансформера к изображениям (Vision Transformer), стандартное текстовое кодирование не сработает. Картинка – это не линия, а плоскость.
Как избежать: Замените одномерное кодирование на двумерное (2D Positional Encoding). Модель должна получать координаты патча изображения по осям X и Y, иначе она не поймет, что находится сверху, а что сбоку.
Ограничения и неочевидные случаи
Вмешательство в смысловой вектор. Поскольку позиционный вектор складывается со смысловым, он неизбежно создает “шум”. Слово “банк” на 5-й позиции математически выглядит для сети немного иначе, чем слово “банк” на 50-й позиции. В подавляющем большинстве случаев модели успешно фильтруют этот шум, но при тонкой настройке (fine-tuning) на очень специфичных данных (например, табличные данные или логи серверов) это может вызывать артефакты.
Отсутствие кодирования в графовых моделях. Если вы применяете Трансформеры к графам (например, структура молекул или социальные связи), стандартное позиционное кодирование бессмысленно, так как в графе нет последовательности слева направо. В таких случаях используются специальные структурные кодировки (Graph Positional Encoding), которые описывают количество шагов от одного узла до другого.