Токен и токенизация
Как нейросеть понимает человеческие буквы.
А начать надо с обязательной сущности, которая лежит в основе функционирования нейросети.
Может слышали — перед анализом вычислительной машиной, любой программный язык компилируется в машинный. Вместо написанной функции на Питоне, процессор получает её битовую интерпретацию из нулей и единиц. Всё верно. Именно такой формат является самым эффективным для обработки машиной.
Само значение бита может быть 1️ или 0. Поэтому этот формат называется бинарным и при кодировке UTF-8 имеет вид:
11010000 10011100 11010000 10110000 11010000 10111001 11010000 10111010 11010000 10111110 11010000 10111111
Ровно тоже самое происходит с любым текстом, который попадает в большую языковую модель. Он переводится в цифры для повышения эффективности использования GPU, скорости обучения и генерации нейросети.
Токенизация.
В направлении Глубокого Обучения (Deep Learning) это называется токенизацией. Есть разные подходы к токенизации, обычно слово делится на части, а потом эта часть токенизируется до уровня байтов. После чего осуществляется парное кодирование байтов с целью дальнейшего повышения эффективности.
Для простоты понимая и чтоб вы не засыпали, давайте рассмотрим бинарную токенизацию предложения, потом переведём его в байты десятичного вида и уже на нём сделаем парное кодирование.
— Может звучать страшно, но поверь, скоро станет понятнее.
Итак.
Берём какую-то текстовую фразу. Этой фразой может быть запрос к нейросети, который отправил человек. Открываем Питон и даём газу, переводим её в бинарный вид по 8 бит. Йоу!
Получили следующее:
11010000 10100101 11010000 10110010 11010000 10110000 11010001 10000010 11010000 10111000 11010001 10000010 00100000 11010001 10001111 11010000 10111001 11010001 10000110 11010000 10110000 00100000 11010001 10000111 11010000 10110101 11010001 10000001 11010000 10110000 11010001 10000010 11010001 10001100 00101100 00100000 11010000 10110010 11010001 10000000 11010000 10110101 11010000 10111100 11010001 10001111 00100000 11010000 10111101 11010000 10110101 11010000 10111001 11010001 10000000 11010000 10111110 11010001 10000001 11010000 10110101 11010001 10000010 11010000 10111000 00100000 11010000 10111000 11010000 10110111 11010001 10000011 11010001 10000111 11010000 10110000 11010001 10000010 11010001 10001100
Перевод в байты и парное кодирование.
Мы получили биты, сгруппированные по 8 штук. А что такое 8 бит?
Это 1 байт.
В десятичном виде, какие значения может принимать байт?
От 0 до 255.
— Те, кто работают с визуальными редакторами, могут заметить – такой же диапазон имеет настройка цвета формата RGB. Видишь, это не просто так.
Для наглядности, давайте переведём наше предложение из бинарного вида вот в этот десятичный, чтоб получить значения байтов от 0 до 255. Теперь наша фраза имеет вид:
[208, 165, 208, 178, 208, 176, 209, 130, 208, 184, 209, 130, 32, 209, 143, 208, 185, 209, 134, 208, 176, 32, 209, 135, 208, 181, 209, 129, 208, 176, 209, 130, 209, 140, 44, 32, 208, 178, 209, 128, 208, 181, 208, 188, 209, 143, 32, 208, 189, 208, 181, 208, 185, 209, 128, 208, 190, 209, 129, 208, 181, 209, 130, 208, 184, 32, 208, 184, 208, 183, 209, 131, 209, 135, 208, 176, 209, 130, 209, 140]
Каждый байт в бинарном виде принял значение от 0 до 255 в десятичном виде.
Невооруженным глазом можно заметить повторения пар байтов. Посмотри первые 12 цифр. Самое время приступить к их кодированию. Суть подхода – заменяем повторяющуюся пару элементов на новое уникальное значение.
С текстом это выглядит так:
1. Изначальное предложение: aaabdaaabac. Вводим новый элемент Z, который равен двум буквам "а", идущим друг за другом. Z=aa
2. Новое предложение: ZabdZabac. Повторяем: Y = ab
3. Новое предложение: ZYdZYac. Повторяем X = ZY
4. Итог: XdXac. Закодированное предложение без повторяющихся элементов.
Токены в нейросети.
Возвращаемся к цифрам.
Находим наиболее повторяющиеся сочетание байтов и заменяем его на новый токен, начиная с 256.
В нашем примере видим, что комбинация пар [209, 130] повторяется чаще всего – 5 раз. Значит этой паре присваиваем токен 256 и заменяем в тексте.
Новое предложение:
[208, 165, 208, 178, 208, 176, 256, 208, 184, 256, 32, 209, 143, 208, 185, 209, 134, 208, 176, 32, 209, 135, 208, 181, 209, 129, 208, 176, 256, 209, 140, 44, 32, 208, 178, 209, 128, 208, 181, 208, 188, 209, 143, 32, 208, 189, 208, 181, 208, 185, 209, 128, 208, 190, 209, 129, 208, 181, 256, 208, 184, 32, 208, 184, 208, 183, 209, 131, 209, 135, 208, 176, 256, 209, 140]
Оно стало короче на 5 элементов и вместо сочетания [209, 130] теперь красуется новый токен [256].
Снова ищем повторяющиеся пары и продолжаем это упражнение, пока не получим желаемый результат. Следующие пары будут иметь номера 257, 258, 259 и т.д.
— И долго так делать? Можно и долго. Например, в ChatGPT использует словарь из 100277 уникальных токенов..
Итого.
Для простоты понимания, можно относиться к токенам как к неким уникальным айдишникам. Они могут хранить кусочек слова, букву или даже целое слово. Это зависит от типа токенизатора.
Именно токены используются для токенизации запроса пользователя и генерации ответа моделью.
Важно запомнить — большая языковая модель генерирует ответ именно токенами и только по одному токену за раз.
Почему это происходит и как выглядит, разберём в следующей статье про первый этап пре-обучения нейросети.
Читать далее
Базовая модель
Пре-обучение нейросети.