Byte-Level BPE и Tiktoken
Проблема алгоритма BPE
Стандартный алгоритм BPE формирует свой базовый словарь на основе уникальных символов, присутствующих в обучающем корпусе текстов. Этот подход демонстрирует высокую эффективность, однако обладает существенным недостатком при работе с реальными зашумленными и многоязычными данными.
Если в процессе применения модели встречается новый символ, который отсутствовал на этапе обучения (нап ример, редкий иероглиф, новый эмодзи или специфический математический символ), токенизатор не cможет его обработать. В таких случаях алгоритм вынужден заменять неизвестный символ на специальный токен [UNK] (out-of-vocabulary), что приводит к потере семантической информации.
При разработке многоязычных моделей, которые должны поддерживать десятки различных алфавитов, базовый словарь уникальных символов может разрастаться до десятков тысяч элементов еще до того, как будут сформированы первые правила слияния подсловных токенов. Это нерационально расходует вычислительные ресурсы.
Алгоритм Byte-Level BPE
Для решения описанной проблемы был предложен алгоритм BBPE (byte-level byte-pair encoding, [1]), который лег в основу большинства современных больших языковых моделей, таких как семейства GPT-2, GPT-3, GPT-4.
Алгоритм представляет собой обычный BPE, но вместо символов языка обрабатывает текст на уровне байтов в кодировке UTF-8. Начальный словарь составляет набор всех уникальных значений для одного байта и составляет всегда 256 элементов.
Любой текст на любом языке, эмодзи и даже произвольные бинарные данные в памяти компьютера в конечном итоге представляют собой просто последовательность байтов!
Использование байтов в качестве минимальной единицы гарантирует полное отсутствие проблемы неизвестных слов (out-of-vocabulary). Алгоритм всегда сможет разбить любую незнакомую последовательность символов на базовые байты, а модель попытается извлечь из них смысл, не теряя исходную информацию.
Библиотека Tiktoken
Tiktoken ([2]) представляет собой высокопроизводительную программную реализацию алгоритма BBPE с открытым исходным кодом, разработанную компанией OpenAI.
Важным преимуществом библиотеки является то, что она написана на языке программирования Rust, а не на Python, что обеспечивает существенное повышение скорости обработки больших объемов текстовых данных.
В Tiktoken значительно усовершенствованы регулярные выражения, применяемые для пре-токенизации (разделения текста на фрагменты перед применением правил слияния). Текст разделяется на следующие категории:
- Символы: стандартные последовательности букв.
- Цифры: группируются особым образом так, чтобы в одном токене содержалось не более трех цифр. Это целенаправленное ограничение упрощает способность языковой модели выполнять поразрядные математические операции.
- Пробелы: выделяются в самостоятельные группы. Это критически важно для корректной обработки форматирования кода, такого как отступы в языке Python.
- Прочие символы: знаки препинания и специальные символы группируются отдельно, чтобы не «приклеиваться» к словам.
Современные версии токенизаторов, реализованных в Tiktoken (например, для GPT-4), используют увеличенный размер словаря, достигающий примерно 100 000 токенов. Такое расширение словаря обеспечивает более сильное сжатие текста, поскольку частые длинные слова кодируются одним токеном. Также это ускоряет обработку данных и эффективно увеличивает размер доступного контекстного окна модели.
Для наглядного изучения того, как именно текст разбивается на токены в зависимости от выбранной версии модели, существует удобное онлайн-демо: https://tiktokenizer.vercel.app.