Alterna · учебный материал
12.2 Словарь задаёт значение номера
Номер обозначает запись в конкретном словаре. Если словарь изменился, прежняя таблица представлений уже не обязана подходить.
Что в этом материале
- Индекс — адрес, а не смысл
Содержание и основные понятия
На предыдущей странице: буква, байты и токен — не одно и то же.
Номер обозначает запись в конкретном словаре. Если словарь изменился, прежняя таблица представлений уже не обязана подходить.
Разбиение задаётся конкретным словарём и правилами. Байт, символ, слово и токен не обязаны совпадать. Полученный номер — адрес, а не числовой смысл слова.
Для изменения рисунка включитеJavaScript; расчёт и теория доступны далее.
Индекс — адрес, а не смысл
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
Академическая база →