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

12.2 Словарь задаёт значение номера

На предыдущей странице: буква, байты и токен — не одно и то же.

Номер обозначает запись в конкретном словаре. Если словарь изменился, прежняя таблица представлений уже не обязана подходить.

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

Индекс — адрес, а не смысл

Vocabulary задаёт отображение token↔ID. Для размераV допустимы целые IDs от0доV−1. Номер используется для выбора строки embedding matrix; арифметическое расстояние между IDs не является семантическим расстоянием.

В нашем byte-BPE исходный словарь содержит все256байт. ID97 соответствует байту ASCII a, ID98 — b, ID32 — пробелу. ID0 здесь означает байт0, не padding и не unknown. Специальные BOS/EOS токены потребовали бы отдельного контракта; сейчас их нет.

После merge новый token хранит последовательность байт родителей и получает новый ID. Байтовая последовательность одного token не обязана быть законченной UTF-8 строкой. Например, один байт многобайтной буквы нельзя честно назвать отдельным символом. Inspector показывает hex и текст только там, где отдельное декодирование допустимо.

Эксперимент. Найдите исходные bytes кириллической буквы в таблице. Затем включите merges и найдите token, содержащий несколько bytes. Важно различать размер словаря, количество токенов конкретного текста и число уникальных токенов, встретившихся в нём.

Граница. Полное покрытие256байт позволяет кодировать новые корректные Unicode-строки без <unk>, но не означает, что модель умеет их понимать. Embedding для редкой byte-комбинации может быть плохо обучен. Tokenizer и нейросеть — связанные, но разные части системы.

assert list('ab '.encode('utf-8'))==[97,98,32]
assert bytes([97,98,32]).decode('utf-8')=='ab '

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

Начальные IDs0..255 соответствуют самим байтам; специальные tokens не добавлены.

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

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