alterna ai
ALTERNA AI / ГЛАВА 12 · 03

12.3 Частые соседние кусочки объединяются

На предыдущей странице: словарь задаёт значение номера.

Начнём с байтов, посчитаем соседние пары и объединим выбранную пару. Частота пары и число непересекающихся замен могут различаться.

Разбиение задаётся конкретным словарём и правилами. Байт, символ, слово и токен не обязаны совпадать. Полученный номер — адрес, а не числовой смысл слова.

Считаем пары, затем заменяем

BPE итеративно объединяет частые соседние единицы. В оригинальной NMT-работе L02 это character/subword units внутри слов. Здесь используется упрощённый byte-level поток, включая пробелы: это реальный merge-алгоритм, но не точная копия production tokenizer.

На каждой итерации считаем все соседние пары текущих IDs. Выбираем максимальную частоту, при равенстве — меньшую numeric-пару (leftID,rightID). Новый token получает ID256+номер merge. Вхождения заменяем слева направо без перекрытий. Если частота лучшей пары меньше2, останавливаемся.

Для corpus banana banana пары(a,n) и(n,a) встречаются по4раза. Tie-break выбирает(97,110), новый ID256 означает bytes an. После первого merge banana представляется[98,256,256,97]. После четырёх merges всё выражение становится[259,32,259], где259 — banana.

Тонкость overlap. В aaa пара(a,a) имеет частоту2, но за проход можно сделать только одну неперекрывающуюся замену. Частота кандидата и число выполненных замен — разные поля трассы.

Исследовать. Повторите корпус и сравните первую пару, её count и фактические replacements. Смена tie-break может изменить IDs и последующую сегментацию. Поэтому список merges и их порядок являются частью сохраняемой модели tokenizer, а не случайным оформлением отчёта.

ids=list(b'banana')
result=[]; i=0
while i<len(ids):
    if ids[i:i+2]==[97,110]: result.append(256); i+=2
    else: result.append(ids[i]); i+=1
assert result==[98,256,256,97]

Код повторяет только что разобранные операции. Полный проверяемыйPython-пример главы доступен отдельным файлом; показанный короткий фрагмент не заменяет его реализацию.

В aaa пара aa имеет count2, но неперекрывающаяся замена одна.

Разбить и восстановить текст. Как этот вопрос продолжает полученный результат?

Python-примеры главы 12 Академическая база →