dimhold.by
← Статьи

GPT-3 читает беларусский в 6,5 раза дороже английского

Я из Беларуси и каждый пост в этом блоге выходит ещё и на беларусском. GPT-3 сейчас очевидный помощник для такой работы, а платить за него приходится по токенам. Прежде чем им пользоваться, я хотел знать, сколько там стоит беларусский.

На странице помощи OpenAI про токены есть примерное правило: 1 токен это примерно 4 символа английского текста. Я взял это правило и в уме перенёс его на русский с поправкой. Кириллическая буква в UTF-8 занимает 2 байта, токенизатор работает с байтами, значит русский должен стоить примерно вдвое дороже, может, чуть больше. На той же странице есть пример на испанском и фраза о том, что другие языки бывают дороже. Я её пропустил и ни один из двух языков так и не посчитал.

Перед подсчётом я записал свою догадку: русский примерно в 4 раза дороже английского, беларусский примерно в 5. Она всё равно оказалась заниженной.

Как мерил

Корпус это FLORES-101 devtest, который Facebook выложил в июне прошлого года. В нём 1012 предложений, переведённых людьми с английского на 100 других языков, так что смысл одинаковый и меняется только язык. Я взял английский, русский, беларусский, а для сравнения украинский и польский. Каждое предложение кодируется отдельно, без служебных токенов. Налог это число токенов на языке, делённое на число токенов на английском на том же токенизаторе.

В статье про GPT-3 сказано, что модель использует токенизацию GPT-2. Это BPE на уровне байтов и его словарь открыт с 2019 года. Кроме него я взял ещё 4 токенизатора. ruGPT-3 от Сбера обучен на русском. mBERT, XLM-R и mT5 многоязычные и беларусский был в их обучающих данных. Считал я библиотеками tokenizers 0.12.1 и sentencepiece 0.1.96.

Для mBERT это считали до меня. Ács в 2019 году разобрала его словарь и измерила, как он режет слова в 54 из его 104 языков. Rust и соавторы в прошлом году сравнили его с одноязычными токенизаторами, русский там тоже есть. Я не нашёл никого, кто прогнал бы беларусский через токенизатор GPT-3 или сравнил бы его на кириллице и на латинице на одних и тех же предложениях.

В 6,47 раза

На GPT-2 английский корпус занимает 27044 токена. Русский в 5,68 раза больше, беларусский в 6,47. Украинский 5,71, почти как русский. Польский, который пишется латиницей с диакритикой, 2,68.

По цене Davinci, 0,06 доллара за 1000 токенов, английский корпус стоит 1,62 доллара, а беларусский 10,50. Базовая модель Davinci принимает 2048 токенов на запрос и ответ вместе. Среднее английское предложение здесь занимает 27 токенов, беларусское 173, поэтому в окно контекста влезает 76 английских предложений и 11 беларусских.

Многоязычные токенизаторы гораздо мягче: на XLM-R русский в 1,16 раза дороже английского, беларусский в 1,45, на mBERT беларусский в 1,99.

токены на GPT-2, во сколько раз больше английского, цена Davinci английский ×1 $1,62 польский ×2,68 $4,35 беларусский, лацинка ×2,98 $4,84 русский ×5,68 $9,21 украинский ×5,71 $9,27 беларусский ×6,47 $10,50
Одни и те же 1012 предложений FLORES-101 devtest на токенизаторе GPT-2. Цена 0,06 доллара за 1000 токенов, Davinci.

Потом я захотел посмотреть на сам словарь. По первому подсчёту выходило, что кириллицы в GPT-2 нет вообще. Так быть не может, потому что у русского вышло 1,08 токена на символ, а не около 1,8, по числу его байтов на символ. Я забыл перевести байтовые куски обратно в текст перед поиском. Второй подсчёт нашёл 18 записей с кириллицей из 50257. 17 из них это одиночные строчные буквы: о, а, е, и, т и другие частые в русском. Любая другая буква это 2 токена, по одному на каждый её байт. Заглавные тоже по 2 токена.

Выходит, GPT-2 читает кириллицу по буквам, а беларусский чаще пользуется дорогими буквами. Буквы ў и і в эти 17 не входят, вместе это 7,4% всех беларусских букв. Вместе с з, ц, ч, ш, заглавными и остальными по 2 токена стоят 29,1% беларусских букв против 17,0% русских. К тому же в беларусском переводе примерно на 4% больше букв. Подсчёт одних только букв, по 1 или 2 токена на каждую, объясняет примерно 90% из тех 21598 токенов, которые беларусский тратит сверх русского.

Латиница

У беларусского есть своя латиница, лацинка (łacinka), с č, š, ž, ŭ и ł. Если цена идёт от алфавита, то те же слова лацинкой должны выйти на GPT-2 намного дешевле. Я написал грубый конвертер с классическими правилами для ł/l, ia/ja и мягкого ś перед мягким согласным. Исключений для заимствований в нём нет. Беларусский читатель найдёт в его результате ошибки, но слова остаются теми же, меняются только буквы.

На GPT-2 лацинка стоит в 2,98 раза больше английского, а не в 6,47, то есть счёт падает на 54%. “навукоўцы” (учёные) это 12 токенов на кириллице и 5 в виде “navukoŭcy”. Эта часть совпала с ожиданием, я заранее записал: минимум на 30% дешевле.

GPT-2, кириллица ␣½н ½н а в у к о ½ў ½ў ½ц ½ц ы 12 GPT-2, лацинка ␣nav uko ½ŭ ½ŭ cy 5 XLM-R, кириллица ▁навук оўцы 2
Слово навукоўцы, учёные. Половина буквы это один из её 2 байтов в UTF-8. Отдельно н это 1 токен, здесь пробел впереди забирает её первый байт. Английское scientists на GPT-2 это 1 токен, русское учёные 9.

Потом я прогнал то же преобразование на остальных 4 токенизаторах и на каждом вышло наоборот. На mBERT лацинка на 6% дороже кириллицы, на ruGPT-3 на 52%, mT5 и XLM-R между ними. Все 3 многоязычных токенизатора видели беларусский на кириллице во время обучения. Думаю, они выучили его куски, а латинское написание тех же слов в их данных встречалось редко, особенно с ŭ. На XLM-R “навукоўцы” это 2 токена, на один меньше, чем русское “учёные”. Лацінкой это слово занимает 4. В словаре ruGPT-3 всего 2 записи с буквой ў, но там, вероятно, работает то же самое. Он выучил кириллические куски на русском, а лацинка их выбрасывает.

токены лацинкой / токены кириллицей ← дешевле дороже → GPT-2 0,46 mBERT 1,06 mT5 1,12 XLM-R 1,31 ruGPT-3 1,52
Те же беларусские предложения, переписанные лацинкой моим грубым конвертером. Дешевле становится только на GPT-2.

Токенизатор соседа

ruGPT-3 устроен так же, как GPT-2: BPE на уровне байтов на 50257 записей, только слияния он выучил на русском. С русского Сбер снял большую часть налога: русский корпус занимает на нём 29833 токена, это 1,10 от английского на GPT-2.

Я ожидал, что беларусскому это тоже поможет: языки близкие и большинство букв общие. На ruGPT-3 беларусский в 2,12 раза дороже русского. На GPT-2 разрыв был всего 1,14, потому что оба языка там обслуживались одинаково плохо. 78% русских слов на ruGPT-3 укладываются в один токен, а беларусских 27%. “навукоўцы” занимает 5 токенов, “учёные” 1.

Снова казалось, что виноваты 2 буквы. Я заменил букву ў на у, а і на и во всём беларусском корпусе. На GPT-2 это закрывает 42% разрыва с русским и это сходится с чтением по буквам. На ruGPT-3 только 16%. Там в словаре целые русские слова, а беларусские слова просто другие и замена букв не делает их русскими. Думаю, именно это даёт большую часть тех 2,12, но отдельно я этот вклад не считал.

Чего я не проверял

  • Только цену в токенах. Хуже ли GPT-3 отвечает на беларусском, я не измерял.
  • Мой конвертер в лацинку грубый. В первой версии не было ji после гласных и мягкого ś. С ними результат GPT-2 сдвинулся с 2,91 до 2,98, а остальные 4 остались дороже кириллицы. Аккуратная ручная транслитерация может сдвинуть числа ещё немного.
  • FLORES это тексты из проектов Викимедиа вроде Викиновостей, переведённые с английского. Текст, изначально написанный по-беларусски, может токенизироваться иначе.
  • OpenAI может сменить токенизатор в новых моделях. Я считал на словаре GPT-2, про который сама статья о GPT-3 пишет, что он “разработан для почти полностью английского обучающего набора”.