Содержание
  1. Зачем нужен subword-словарь
  2. Корпус и начальные символы: откуда берутся частоты пар
  3. Первое слияние ab на корпусе ab ab ab ac
  4. Применение фиксированных слияний к abac и cab
  5. Обучение слияний и кодирование нового текста
  6. Символьный и byte-level BPE: что меняется для Unicode
  7. Границы слов, специальные токены и разные словари
  8. Частые вопросы
Справочник

Что такое BPE: как текст разбивают на токены

12 ноября 2026 · 9 минут чтения

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

Зачем нужен subword-словарь

Правило «одно слово — один токен» упирается в размер словаря. Словарь на все словоформы, опечатки, имена и термины растёт без предела, а редкие слова всё равно остаются за его границей. Subword-словарь хранит частые последовательности и мелкие фрагменты. Новое слово можно собрать из них, если его символы представлены в базовом алфавите.

Документация курса Hugging Face описывает порядок обучения: сначала вычисляется уникальный набор слов корпуса после нормализации и предварительной токенизации, затем строится словарь из всех символов, которыми эти слова записаны. Такой старт даёт базовый алфавит, покрывающий весь корпус.

Оригинальная работа Sennrich и соавторов формулирует тот же принцип: словарь инициализируется символами, а каждое слово представляется последовательностью символов с добавленным маркером конца слова. Маркер позволяет восстановить исходную разбивку после перевода.

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

Что это даёт на выходе:

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

Дальше важно понять, откуда берутся числа, по которым выбираются слияния.

Корпус и начальные символы: откуда берутся частоты пар

Обучение начинается с корпуса — набора текстов, на котором вы хотите получить словарь. Документация Hugging Face называет первый шаг прямо: обучение BPE стартует с вычисления уникального набора слов, использованных в корпусе, после завершения нормализации и предварительной токенизации, а затем строится словарь из всех символов, которыми эти слова записаны.

Порядок действий выглядит так:

  1. Соберите корпус текстов.
  2. Если выбранный токенизатор использует нормализацию, примените его правила.
  3. Выполните предварительную токенизацию: разделите текст на слова.
  4. Составьте список уникальных слов.
  5. Разложите каждое слово на начальные символы.
  6. Посчитайте, сколько раз встречается каждая пара соседних символов внутри слов.

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

Возьмём полный учебный корпус из четырёх слов: ab ab ab ac. Исходные символы — a, b, c, а пробел служит разделителем слов. Внутри слов соседние пары дают такие частоты:

Пара Где встречается Частота
(a, b) в трёх словах ab 3
(a, c) в слове ac 1

Пары на стыке слов не считаются, поэтому комбинации вида «b и следующий a» в таблице отсутствуют. Эти два числа — весь вход для следующего шага.

Первое слияние ab на корпусе ab ab ab ac

Алгоритм на каждом шаге ищет самую частую пару среди существующих токенов. Документация Hugging Face формулирует это так: на любом шаге обучения токенизатора BPE ищет самую частую пару существующих токенов, где пара — два последовательных токена внутри слова.

В нашем корпусе частоты уже посчитаны: (a, b) встречается 3 раза, (a, c) — 1 раз. Самая частая пара — (a, b). Она и становится первым слиянием.

Что происходит дальше:

  • пара a + b объявляется новым токеном ab;
  • этот токен добавляется в словарь;
  • в записи всех слов корпуса вхождения a + b заменяются на ab;
  • счётчики пар пересчитываются с учётом нового токена.

После первого слияния три слова ab превращаются в один токен ab каждое, а слово ac остаётся разбитым на a и c. Список слияний на этом шаге содержит одну запись: ab.

Здесь стоит зафиксировать бюджет. Если вы задали ровно одно слияние, обучение на этом останавливается. Итоговый словарь содержит начальные символы a, b, c и добавленный токен ab. Число слияний — единственный гиперпараметр, и в этом примере он равен единице.

Второе слияние в этом корпусе уже нечего выбирать: после замены остаётся единственная пара a + c с частотой 1, и она стала бы следующим кандидатом при большем бюджете. Для учебного разбора мы останавливаемся на одном слиянии, чтобы дальше показать применение фиксированного списка.

Применение фиксированных слияний к abac и cab

Обученный список слияний применяется к новому тексту по правилам, зафиксированным при обучении. Работа Sennrich и соавторов описывает тестовый режим так: сначала слова разбиваются на последовательности символов, затем к ним применяются выученные операции, чтобы объединить символы в более крупные известные единицы.

Возьмём строку abac. Список слияний содержит одну запись — ab. Порядок применения:

  1. Разбиваем на символы: a, b, a, c.
  2. Ищем в записи пару a + b. Она есть в начале.
  3. Заменяем её на токен ab.
  4. Получаем ab, a, c.

Кодирование даёт три токена: [ab, a, c]. Декодирование склеивает их обратно в строку abac. Исходный текст восстановлен, число токенов — три.

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

  1. Разбиваем на символы: c, a, b.
  2. Ищем пару a + b — она есть в конце.
  3. Заменяем: c, ab.

Результат — [c, ab], два токена. Список слияний при этом не переобучается на новом вводе. Это принципиальный момент: кодирование нового текста использует уже обученный словарь и не меняет его.

Частая ошибка новичка — слить ac, потому что эти символы стоят рядом в текущем тексте. Так делать нельзя: слияние ac отсутствует в обученном списке, и его применение изменило бы уже обученный токенизатор. Кодирование обязано следовать фиксированному порядку слияний, полученному на корпусе.

Вход Список слияний Токены Декодирование
abac ab [ab, a, c] abac
cab ab [c, ab] cab

Обучение слияний и кодирование нового текста

Два режима работы BPE различаются тем, что разрешено менять. При обучении алгоритм пересчитывает частоты пар, выбирает самую частую и добавляет новое слияние в список. При кодировании список слияний заморожен, а новый текст только раскладывается по уже известным правилам.

Сравним по шагам:

Шаг Обучение Кодирование
Вход корпус текстов новый текст
Частоты пар считаются заново на каждом шаге не считаются
Список слияний растёт читается как есть
Словарь пополняется не меняется
Результат список слияний и словарь последовательность токенов

Документация Hugging Face описывает обучение как поиск самой частой пары на каждом шаге, а работа Sennrich и соавторов описывает тестовый режим как применение выученных операций к символам. Это два разных процесса с разными правами на изменение словаря.

При обычном кодировании фиксированной моделью без семплирования один текст получает одинаковую разбивку. Другой корпус и параметры могут привести к другому списку слияний. Для выбранной языковой модели используйте предназначенный ей токенизатор.

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

Символьный и byte-level BPE: что меняется для Unicode

Символьный BPE стартует с алфавита символов корпуса. Для английского текста это десятки знаков, для смешанного корпуса с кириллицей, иероглифами и эмодзи — тысячи. Каждый новый символ, которого не было при обучении, рискует попасть в разряд неизвестных.

Byte-level BPE решает это иначе. Документация Hugging Face описывает подход токенизаторов GPT-2 и RoBERTa: они работают с байтовым представлением слов. Базовый словарь при этом получает небольшой размер — 256, — и любой символ всё равно оказывается включён, не превращаясь в неизвестный токен.

Сравнение двух вариантов:

Свойство Символьный BPE Byte-level BPE
Базовая единица символ байт
Размер базового словаря зависит от алфавита корпуса 256
Незнакомый символ риск неизвестного токена покрыт байтовым представлением
Работа с Unicode требует символов в корпусе идёт через байты

Отдельный подход к Unicode предлагает SentencePiece от Google. В описании проекта сказано: SentencePiece обрабатывает входной текст как сырую последовательность Unicode-символов. Пробелы при этом экранируются метасимволом ▁ (U+2581) и включаются в токенизацию. Это снимает необходимость в отдельном шаге предварительной токенизации на слова.

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

Границы слов, специальные токены и разные словари

Границы слов влияют на подсчёт частот. В работе Sennrich и соавторов сказано: для эффективности пары, пересекающие границы слов, не рассматриваются. Поэтому слияние никогда не склеит конец одного слова с началом следующего.

Специальные токены добавляются отдельно от слияний. Документация Hugging Face указывает: специальные токены, используемые моделью, добавляются в начало словаря. Это служебные метки для начала текста, конца текста, разделителей и заполнителей. Они не появляются из частотного анализа корпуса.

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

Почему словари моделей различаются — теперь понятно из устройства алгоритма:

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

Документация Microsoft по Microsoft.ML.Tokenizers описывает использование BPE и словари, привязанные к конкретной модели. Один текст в разных токенизаторах может дать разное число токенов. При работе с моделью используйте её словарь и правила сегментации.

Проверка для читателя: возьмите одну строку и прогоните её через два разных токенизатора. Сравните число токенов и границы. Различия словарей могут объяснять расхождение; само по себе оно ещё не указывает на ошибку токенизатора.

Частые вопросы

Что такое BPE простыми словами?
BPE — алгоритм построения словаря частотными слияниями пар символов. Он многократно находит самую частую пару соседних токенов внутри слов и объявляет её новым токеном. Частые последовательности становятся едиными единицами, редкие слова собираются из знакомых фрагментов.

Как BPE разбивает слово на токены?
Слово раскладывается на начальные символы, затем применяется обученный список слияний в заданном порядке. Каждое слияние заменяет пару токенов на один. Декодер переводит токены обратно в текст; точное совпадение с исходной строкой зависит от нормализации и конфигурации.

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

Что даёт byte-level BPE для Unicode?
Byte-level BPE стартует с байтов, поэтому базовый словарь получает размер 256 и покрывает любой символ. Текст с эмодзи, иероглифами и смешением алфавитов не упирается в неизвестный токен. Символьный вариант зависит от того, какие символы были в корпусе.

Почему у разных моделей разные словари?
Словарь зависит от корпуса, бюджета слияний, правил нормализации, набора специальных токенов и стартовой единицы. Разные модели могут использовать разные токенизаторы. Число токенов одной строки может различаться, поэтому для каждой модели проверяйте её конфигурацию.

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

3 материала