Subword и BPE

Разбираемся, как современные токенизаторы кодируют даже невиданные слова.

BPE (Byte Pair Encoding) — алгоритм subword-токенизации, который строит словарь, итеративно объединяя самые частые пары символов.

Проблема неизвестных слов

Если токенизировать текст по словам, словарь должен содержать все возможные слова — это нереально (миллионы форм, опечатки, неологизмы). А любое незнакомое слово превратится в <unk>, и смысл потеряется. Subword-подход решает это: редкое слово разбивается на знакомые куски.

слово:  "токенизация"
токены: ["токен", "иза", "ция"]

слово:  "кот"
токены: ["кот"]   (частое — целиком)

Как строится словарь BPE

Алгоритм начинает с отдельных символов и многократно объединяет самую частую соседнюю пару в новый токен. Сделаем мини-демонстрацию на чистом Python:

from collections import Counter

words = ["low", "low", "low", "lower", "newest", "newest"]

def pair_counts(words):
    pairs = Counter()
    for w in words:
        symbols = list(w)
        for a, b in zip(symbols, symbols[1:]):
            pairs[(a, b)] += 1
    return pairs

pairs = pair_counts(words)
best = max(pairs, key=pairs.get)
print("Самая частая пара:", best, "->", pairs[best], "раз")
print("Сольём её в один токен:", best[0] + best[1])

Вывод:

Самая частая пара: ('l', 'o') -> 4 раз
Сольём её в один токен: lo

На следующих шагах «lo» соединится с «w» и так далее, пока частые слова не станут целыми токенами. Так BPE автоматически выучивает, какие куски встречаются часто.

Почему это удобно

BPE и его родственники (WordPiece у BERT, Unigram у некоторых моделей) дают компактный словарь и при этом покрывают любой текст: незнакомое слово просто разложится на части, иногда вплоть до отдельных символов. Поэтому <unk> почти не встречается.

Как работает под капотом

Обученный BPE хранит упорядоченный список «слияний» (merges). При кодировании слово сначала разбивается на символы, а затем к нему применяют слияния в том же порядке, в каком они были выучены. Префиксы продолжения слова часто помечаются специальным знаком (например, ## в WordPiece или Ġ для пробела в BPE), чтобы при декодировании корректно собрать слова обратно.

Частые ошибки

  • Считать токены как слова при оценке длины. Лимит модели измеряется в токенах, а одно слово может быть несколькими токенами.
  • Думать, что русский и английский токенизируются одинаково плотно. Кириллица часто даёт больше токенов на слово, чем латиница.
  • Ждать одинакового разбиения у разных моделей. BPE, WordPiece и Unigram дробят по-разному.

Итог

  • Subword-токенизация дробит редкие слова на знакомые части, избегая <unk>.
  • BPE строит словарь, итеративно сливая самые частые пары.
  • Родственные алгоритмы — WordPiece (BERT) и Unigram.
  • Лимит модели считается в токенах, а не в словах.
Проверьте себя
1. Какую проблему решает subword-токенизация?
AУскоряет GPU
BПозволяет закодировать незнакомые слова, разбивая их на части
CПереводит текст
DСжимает веса модели
2. Как BPE строит словарь?
AБерёт случайные слова
BИтеративно объединяет самые частые пары символов
CИспользует готовый список из интернета
DДелит текст по пробелам
3. Почему важно мерить длину текста в токенах, а не в словах?
AСлова считать сложнее
BЛимит модели задан в токенах, а слово может быть несколькими токенами
CТокены короче букв
DЭто требование лицензии