"**Byte Pair Encoding (BPE)** — это алгоритм, изначально предложенный для *сжатия данных*, однако впоследствии он был адаптирован для решения задач *токенизации текстов* в NLP-моделях.\n",
"\n",
"В контексте обработки естественного языка BPE позволяет представлять текст в виде ограниченного набора токенов, сохраняя при этом способность выразить любые слова, включая редкие или не встречавшиеся ранее (out-of-vocabulary).\n",
"\n",
"---\n",
"\n",
"## Основная идея\n",
"\n",
"Главная идея BPE заключается в **итеративном объединении наиболее часто встречающихся пар символов** в новые, более крупные единицы — *токены*.\n",
"Этот процесс постепенно строит иерархию от отдельных символов до целых подслов и слов, формируя тем самым *оптимальный словарь токенов* для данного корпуса текста.\n",
"Рассмотрим пошагово, как работает классический алгоритм BPE:\n",
"\n",
"1. **Инициализация.**\n",
" Текстовый корпус разбивается на отдельные символы.\n",
" Например, слово `lower` представляется как `l o w e r`.\n",
" Каждый уникальный символ добавляется в словарь токенов — это гарантирует, что любая последовательность текста может быть декодирована обратно.\n",
"\n",
"2. **Подсчёт частот пар.**\n",
" Для каждой последовательности токенов в корпусе подсчитываются частоты всех возможных *соседних пар токенов*.\n",
" Например, если в корпусе часто встречается пара `('t', 'h')`, то она имеет высокий приоритет для объединения.\n",
"\n",
"3. **Объединение самой частой пары.**\n",
" Находится наиболее часто встречающаяся пара токенов, например `('t', 'h')`, и заменяется на новый токен `('th')`.\n",
" Этот новый токен добавляется в словарь.\n",
"\n",
"4. **Обновление корпуса.**\n",
" Все вхождения выбранной пары заменяются новым токеном.\n",
" После этого подсчёт частот повторяется на обновлённом тексте.\n",
"\n",
"5. **Итерации.**\n",
" Процесс продолжается до тех пор, пока:\n",
"\n",
" * не будет достигнут желаемый размер словаря (например, 50 000 токенов);\n",
" * или частоты оставшихся пар перестанут иметь практическое значение.\n",
"\n",
"В итоге получаем словарь, в котором одни токены представляют отдельные символы, другие — подслова или целые слова.\n",
"\n",
"Это компромисс между избыточностью (символьная токенизация) и излишней обобщённостью (словная токенизация).\n",
"\n",
"---\n",
"\n",
"## Byte-Level BPE\n",
"\n",
"В токенизаторах, используемых, например, OpenAI, применяется **Byte-Level BPE** — модификация, работающая не с текстовыми символами, ас их *байтовыми представлениями*.\n",
"\n",
"Преимущества этого подхода:\n",
"\n",
"* Полная языковая универсальность — один и тот же словарь способен обрабатывать тексты на любом языке, включая редкие и смешанные языки.\n",
"* Поддержка любых Unicode-символов и эмодзи.\n",
"* Компактность: итоговый словарь можно ограничить примерно 50 000 токенами без потери выразительности.\n",
"\n",
"---\n",
"\n",
"## Современные модификации\n",
"\n",
"Оригинальный BPE сегодня практически не используется в чистом виде.\n",
"Каждая крупная модель или библиотека имеет свои вариации алгоритма токенизации, адаптированные под конкретные цели.\n",
"\n",
"Некоторые отличия в промышленных реализациях:\n",
"\n",
"* **GPT-2:** запрещалось объединять токены разных типов (например, букву и знак препинания `a?`). Это сохраняло читаемость текста.\n",
"* **GPT-3:** снято ограничение на смешивание типов токенов, но введено правило: нельзя объединять более трёх цифр подряд в один токен.\n",
"* **GPT-4:** применяется нормализация некоторых редких Unicode-символов — например, разные типы кавычек приводятся к стандартному виду `\"`.\n",
"* **LLaMA:** запрещено создавать токены, состоящие только из пробелов или управляющих символов (например, `\"\\n\\n\"`).\n",
"\n",
"Таким образом, несмотря на общие принципы, **каждый токенизатор уникален**, отражая баланс между эффективностью, универсальностью и удобством декодирования.\n",
"\n",
"---\n",
"\n",
"\n",
"## Итог\n",
"\n",
"Byte Pair Encoding — это не просто алгоритм токенизации, а компромисс между чисто символьным и чисто словарным представлением текста.\n",
"Он обеспечивает:\n",
"\n",
"* компактный словарь фиксированного размера,\n",
"* возможность обработки любых текстов, включая ранее невиданные слова,\n",
"* эффективность при обучении языковых моделей, где баланс между размером словаря и длиной последовательностей критичен.\n",