Языковая модель получает не слова и даже не буквы, а целые идентификаторы токенов. Токенизатор решает, сколько шагов займёт фраза, какие части слов разделят один embedding и сколько вычислений получат разные языки.

Одна строка, четыре разбиения

Возьмём электромагнитный. Возможны разные единицы:

  • байты UTF-8;
  • Unicode-символы;
  • целое слово;
  • подслова: электро | магнит | ный.

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

Токенизатор задаёт функцию

T:строка(i1,,in),T:\text{строка}\longrightarrow(i_1,\ldots,i_n),

а detokenizer должен восстановить исходную строку. Модель видит только индексы и embeddings eite_{i_t}.

Если контекст ограничен 4096 токенами, туда помещается разное число символов на русском, английском и в коде. Значит, токенизация влияет не только на скорость, но и на доступную память.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Одна русская фраза разбита на байты символы слова и подслова
Рис. 75.1. Цена разбиения одной фразы

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

BPE как последовательное сжатие

Byte Pair Encoding начинает с базовых единиц и многократно сливает самую частую соседнюю пару. Пусть corpus после посимвольного разбиения содержит:

н и з к и й — 5 раз,
н и з и н а — 3 раза.

Пара н и встречается 8 раз и становится новым символом ни. Затем может слиться низ. Каждое правило добавляет единицу словаря и сокращает корпус.

Обученный список merge-правил применяют в фиксированном порядке. Это жадный алгоритм: раннее слияние меняет частоты поздних, а глобально оптимальный словарь он не обещает.

При словаре VV и размерности dd только таблица embeddings содержит VdVd параметров. Увеличение VV укорачивает текст, но делает входной и выходной слои тяжелее, а редкие токены получают мало обновлений.

Пробел — часть математики

Во многих токенизаторах пробел включается в начало токена: дом отличается от дом. Так модель различает начало слова без отдельного маркера. Начальный пробел строки и неразрывный пробел могут вести к другому разбиению.

Unicode добавляет сложность. Буква й может быть одним code point или сочетанием и с комбинируемым знаком. Визуально строки одинаковы, байты различны. Нормализация NFC приводит их к общей форме, но менять Unicode бездумно нельзя: в некоторых языках различия значимы.

Emoji могут состоять из нескольких символов, соединённых zero-width joiner. Символьное «один видимый знак — один токен» не выполняется.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Unicode разбор букв и emoji по code points bytes и токенам
Рис. 75.2. Видимый знак и последовательность кодов

Для трёх визуальных фрагментов показаны code points, UTF-8 bytes и итоговые токены до и после NFC. Стрелки отмечают места, где одинаковый вид не означает одинаковые данные, а один glyph состоит из нескольких кодов.

Лаборатория слияний

Слияния BPE, длина строки и неизвестные слова

Загружается живая иллюстрация…

Добавляйте merge-правила по одному и следите, какие слова сокращаются. Сравните маленький литературный корпус с корпусом программного кода. Частоты пар различаются, поэтому один словарь экономит токены в прозе, другой — в идентификаторах и знаках.

Проверьте редкую фамилию, формулу и строку с опечаткой. Хороший подсловный токенизатор не выдаёт <UNK>, но может разложить объект на много мелких единиц. Это корректность представления без эффективности.

Следующий токен и сдвиг цели

После токенизации строка (i1,,in)(i_1,\ldots,i_n) создаёт пары:

(i1,,it)it+1.(i_1,\ldots,i_t)\longrightarrow i_{t+1}.

Языковая модель минимизирует

L=t=1n1logpθ(it+1it).\mathcal L=-\sum_{t=1}^{n-1} \log p_\theta(i_{t+1}\mid i_{\le t}).

Loss измеряется на токен. Сравнивать perplexity моделей с разными токенизаторами напрямую некорректно: единицы отличаются. Можно перейти к bits per byte:

BPB=1Blog2tlogpθ(iti<t),\operatorname{BPB} =-\frac1{B\log2}\sum_t\log p_\theta(i_t\mid i_{<t}),

где BB — число байтов текста.

Здесь начинается путь к attention и трансформеру: архитектура будет предсказывать индекс, но смысл этого индекса уже выбран токенизатором.

Как выбирать продолжение

Модель выдаёт логиты ziz_i, затем

pi=exp(zi/τ)jexp(zj/τ).p_i=\frac{\exp(z_i/\tau)} {\sum_j\exp(z_j/\tau)}.

Температура τ\tau меняет резкость. Greedy decoding берёт максимум и детерминирован, sampling сохраняет разнообразие. Top-kk оставляет kk вариантов, nucleus sampling выбирает минимальное множество с суммарной вероятностью не меньше pp.

Эти операции применяются к токенам. Редкое слово из пяти частей имеет пять моментов, где генерация может свернуть. Однотокенное частое слово выбирается одним решением. Токенизация влияет на вероятность целых строк и типичные ошибки.

Многоязычная арифметика

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

Оценим fertility:

F=число токеновчисло слов или символов.F=\frac{\text{число токенов}} {\text{число слов или символов}}.

Сравнивать следует на параллельных предложениях или сопоставимых жанрах. Высокая fertility не доказывает низкое качество модели, но является измеримой инфраструктурной асимметрией.

OSCAR и mC4 дают многоязычные корпуса, однако язык определяется автоматическим классификатором, а web-источники неоднородны. Ошибки сбора и смешивания корпуса переходят в словарь ещё до обучения модели. Считать токены нужно после той же нормализации, что будет в модели.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Число токенов параллельных предложений на восьми языках
Рис. 75.3. Один смысл расходует разный контекст

Для каждого языка показано распределение числа токенов на 1 000 параллельных предложениях. Горизонтальная ось — токены на 100 Unicode-символов, точки — медианы, полосы — 10–90 процентили. Отдельным цветом отмечены языки, плохо представленные в обучающей смеси словаря.

Реальный аудит токенизатора

Возьмите тексты четырёх типов: школьная проза, новости, Python-код и русские научные термины. Для двух открытых токенизаторов измерьте:

  • tokens per byte и tokens per word;
  • долю слов, разбитых на 1, 2, 3 и более частей;
  • самые длинные токенизации;
  • обработку чисел, URL, фамилий и опечаток;
  • время encode/decode;
  • точность обратного восстановления байтов.

Свяжите наблюдение с последствиями. Если числа дробятся по одной цифре, арифметическая закономерность и длина числа представлены иначе, чем при токенах по три цифры. Если https:// один токен, модель часто видела этот шаблон.

Мини-исследование: токенизация чисел

Составьте строки чисел от 0 до 999 999 и изучите два токенизатора. Для каждого числа измерьте количество токенов, разбиение по цифрам и устойчивость к ведущим нулям. Затем сформируйте пары вроде 123 + 7 = и проверьте, совпадают ли границы разрядов у слагаемых.

Если 123456 — один редкий токен, соседние числа могут иметь несвязанные embeddings. Если число разбито на отдельные цифры слева направо, разряды смещаются при разной длине. Группы по три цифры дают иной inductive bias. Ни одна схема сама не гарантирует арифметику, но задача, которую должен выучить трансформер, меняется.

Постройте histogram tokens per number и отметьте скачки. Затем оцените простую next-token модель на последовательностях счёта: умеет ли она продолжать внутри знакомого диапазона и после границы, где разбиение меняется? Не делайте вывод о reasoning из десяти примеров; нужна сетка чисел и accuracy по длине.

Бюджет контекста как языковая величина

Возьмите сто параллельных абзацев на русском и английском. Обрежьте оба до одинаковых 512 токенов и посчитайте долю исходных символов и предложений, которая сохранилась. Если один язык систематически расходует больше токенов, downstream summarization получает меньше содержания ещё до модели.

Свяжите fertility с реальной ценой: при full attention число элементов карты растёт как n2n^2. Удвоение tokens per sentence может почти учетверить attention work. Это мост к квадратичной цене внимания, а не только лингвистическая статистика.

До модели уже сделан выбор

Токенизатор — часть модели и часть датасета. BPE сокращает частые последовательности, но фиксирует статистику корпуса. Unicode, пробелы и языковая смесь меняют разбиение. Метрики требуют общей единицы вроде bits per byte. Прежде чем обсуждать миллиарды параметров, полезно посмотреть, какие именно кусочки текста они получают.

Задачи