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.
- Лимит модели считается в токенах, а не в словах.