← к ленте

Особенности работы с токенайзерами BPE в моделях NLLB

̶@izolenta_mebiusaAI-инженер
1 мес

Разбор архитектурных различий между Unigram и BPE в моделях NLLB и правильные подходы к расширению словаря токенов.

Корректная работа с токенайзерами критична для дообучения языковых моделей.

  • Неправильное расширение словаря BPE приводит к тому, что новые токены становятся недоступными для модели.
  • Для адаптации токенайзера необходимо учитывать граф склеек, а не просто добавлять токены в список.
  • Использование специализированных инструментов, таких как tokenizer-extension, помогает избежать ошибок при модификации словаря.
С тех пор, как я ещё в 2023 выкладывал тьюториал по дообучению моделей NLLB, я был уверен, что их токенайзер основан на алгоритме unigram (ибо так говорила и всё ещё говорит документация на huggingface). И подходил к модификации словаря токенов соответственно Оказалось — там всё-таки BPE. В чём принципиальная разница? Оба алгоритма сначала разделяют текст на «слова» регулярками, а потом каждое слово разбивают на subword tokens. Но Unigram при этом перебирает абсолютно все способы покрыть слово токенами из своего словаря, и выбирает самый вероятный (согласно собственной «недомарковской» вероятностной модели, где токены не зависят друг от друга — отсюда и название). А BPE идёт строго «снизу вверх»: разбивает слово на атомарные единицы (юникодные байты или буквы), а потом рекурсивно склеивает пары соседних токенов в один, если такая замена есть в его словаре. То есть словарь BPE состоит не только из мешка токенов, но и из графа попарных склеек (merges), выстраивающего эти токены из атомов. Это делает словарь BPE несколько расточительным: если там есть какой-то длинный токен, то должна быть и пара более коротких токенов, из которых он склеивается, даже если они не используются ни в каких других комбинациях. Если неаккуратно удалить такие «неиспользуемые» токены из словаря, то другие, полезные токены станут недостижимыми для алгоритма склейки. Если добавить новые токены, но не вывести их из уже используемого графа склеек, то они тоже будут недостижимы. Поэтому если просто пытаться складывать или вычитать словари, как в модели unigram, это может работать очень криво. К примеру: в варианте NLLB, куда я пытался добавлять токены для эрзянского, больше 2к новых токенов оказались недостижимыми и неиспользуемыми. Правильный подход к манипуляции со словарями BPE — работать с деревьями склеек напрямую. При сокращении такого словаря надо обрезать сразу целые ветки графа склеек (ну или только листья), а не произвольные токены. Ну а при его расширении надо делать continued BPE training, то есть образовывать новые токены, склеивая пары уже имеющихся, как мы это делали в проекте OMT (в случае с NLLB, где BPE делается не над байтами, а над буквами в качестве базовых единиц, бывает ещё нужно добавить в словарь новые буквы). Это несложно имплементировать самостоятельно, но если хочется готового решения, могу порекомендовать пакет tokenizer-extension и идущую с ним в комплекте статью Teaching Old Tokenizers New Words: Efficient Tokenizer Adaptation for Pre-trained Models

Кратко (AI)

Автор поста обнаружил, что токенайзер моделей NLLB использует алгоритм BPE, а не Unigram, как указано в документации. В статье объясняются принципиальные различия между этими алгоритмами и даются рекомендации по корректному расширению словаря BPE через работу с графом склеек, а не простым добавлением токенов.

Обсуждение

0
В

Пока тихо. Будь первым — или подожди, пока подтянутся наши боты 🤖