minbpe: токенизатор BPE с нуля

Урок 14 из 16 курса «Нейросети с нуля: по открытому коду Андрея Карпати»: неофициальный курс AI University по открытому коду (MIT). Урок входит в платный доступ; первые уроки курса бесплатно.

О чём урок

Мы уже научили GPT-подобную модель обучаться на уровне символов, но настоящие большие языковые модели почти никогда не работают с отдельными символами напрямую. Между текстом и нейросетью стоит токенизатор: он превращает строку в последовательность целых чисел и обратно. В этом уроке вы разберёте алгоритм Byte Pair Encoding (BPE) на байтах и построите собственный токенизатор по коду minbpe: от подсчёта пар до сохранения словаря на диск. После урока вы сможете обучить BPE-токенизатор на любом тексте, объяснить, почему русский текст «дороже» английского в токенах, и понять, как именно encode воспроизводит порядок слияний, выученный на этапе train.

Неофициальный курс AI University по открытому коду (MIT). В уроке приводится код из karpathy/minbpe © Andrej Karpathy, лицензия MIT; комментарии переведены на русский, объяснения написаны нашей командой. Курс не связан с автором кода и не одобрен им.

Нейросеть умеет работать только с числами. У символьной модели из уроков про makemore и nanoGPT словарь маленький: несколько десятков букв, цифр и знаков препинания, поэтому каждому символу просто присваивается индекс. Такой подход работает, но крайне неэффективен для больших моделей: средняя английская «мысль» занимает сотни символов, и модели приходится тратить вычисления и память контекста на кодирование каждой буквы по отдельности, вместо того чтобы сразу оперировать кусками смысла вроде "tion" или "ing".

Альтернатива на другом конце спектра: токенизация по словам. Берём словарь из топ-50000 самых частых слов, каждому даём число. Проблема очевидна: язык не исчерпывается конечным списком слов. Встретится опечатка, неологизм, имя собственное или слово на другом языке, и модель упрётся в токен «неизвестно» (<unk>), теряя информацию.

Компромисс, который использует GPT-2, GPT-3 и большинство современных LLM, это подсловная токенизация (subword tokenization) поверх байтов UTF-8. Идея в двух частях:

  1. Любой текст в любом алфавите можно представить как последовательность байтов (чисел от 0 до 255) через кодировку UTF-8.
  2. Поверх этих 256 байтовых токенов алгоритм BPE «выучивает» на обучающем тексте, какие последовательности байтов встречаются часто…

План урока

  1. Зачем вообще нужен токенизатор
  2. Алгоритм BPE на пальцах
  3. Вспомогательные функции: подсчёт пар, слияние и печать токенов
  4. Печать токенов без поломки терминала
  5. Класс Tokenizer: общий каркас
  6. BasicTokenizer: обучение, кодирование, декодирование
  7. train.py: обучение на реальном тексте
  8. Свойства кодирования и коэффициент сжатия

Урок входит в полный доступ. Полный текст и видео открываются после оплаты. Первые уроки каждого курса бесплатны.

Полезные гиды