Узнайте ключевые различия между токенизацией и эмбеддингами в больших языковых моделях (LLM), таких как GPT. Поймите, как токенизация разбивает текст на управляемые единицы, а эмбеддинги создают богатые векторные представления этих токенов. Понимание этих процессов необходимо для раскрытия потенциала LLM в задачах обработки естественного языка.
Введение
Токенизация и эмбеддинги — фундаментальные компоненты больших языковых моделей (LLM), таких как GPT, играющие ключевую роль в понимании и генерации текста. Токенизация заключается в разбиении исходного текста на управляемые единицы, называемые токенами, а эмбеддинги предоставляют богатые векторные представления этих токенов. Понимание различий между токенизацией и эмбеддингами необходимо для осознания тонкостей того, как LLM обрабатывают языковые данные.
Что такое токенизация
Токены часто упоминаются в исследованиях ИИ, например, в статье о Llama 2, где авторы отмечают обучение на 2 триллионах токенов данных. Токены служат фундаментальной единицей, своего рода «атомом», для больших языковых моделей (LLM). Токенизация включает преобразование строк (т.е. текста) в последовательности токенов и обратно.
В области машинного обучения токен обычно не равен отдельному слову. Вместо этого он может представлять собой более мелкую единицу, например символ или часть слова, или более крупную, например целую фразу. Размер токенов зависит от используемого подхода к токенизации.
Токенизация обычно выполняется компонентом, известным как «Токенизатор». Этот модуль работает независимо от большой языковой модели и использует собственный обучающий набор текстовых данных, который может полностью отличаться от обучающих данных LLM.
Почему токенизация важна?
Токенизация часто лежит в основе многих странностей, наблюдаемых в больших языковых моделях (LLM). Некоторые проблемы, которые на первый взгляд могут показаться связанными с архитектурой нейронной сети или самой LLM, на самом деле могут быть обусловлены токенизацией. Вот неполный список проблем, которые можно проследить до токенизации:
- Неточности в правописании
- Трудности с простыми операциями обработки строк, например переворот строки
- Более низкая производительность на неанглийских языках, например японском
- Плохая производительность в базовых арифметических операциях
- Проблемы с задачами программирования, например с Python, с которыми сталкивался GPT-2
- Проблемы, такие как завершающие пробелы
- Случаи, когда ранние версии GPT демонстрировали нестабильное поведение при упоминании «SolidGoldMagikarp»
- Предпочтение YAML перед JSON при работе со структурированными данными
В этом посте мы подробнее рассмотрим, как токенизация способствует этим проблемам.
Детали токенизации
Ниже приведен обзор шагов, включенных в токенизацию. Хотя некоторые из этих шагов могут быть не сразу понятны, мы углубимся в них по ходу поста.
Предварительное обучение: формирование словаря
- Сбор обучающих данных: Соберите большой корпус текстовых данных, на которых будет учиться модель.
- Начальная токенизация: Используйте начальные методы токенизации для разделения текста на фундаментальные единицы, такие как слова, подслова или символы.
- Создание словаря: Выберите алгоритм токенизации, например BPE (Byte Pair Encoding), WordPiece или SentencePiece, для создания управляемого и эффективного набора токенов.
- Применение алгоритма: Реализуйте выбранный алгоритм на начальных токенах для получения набора подсловесных токенов или символов, которые отражают лингвистические нюансы, присутствующие в обучающих данных.
- Присвоение ID: Присвойте каждому токену в полученном словаре уникальный целочисленный ID.
Процесс токенизации в реальном времени
- Преобразуйте входящий текст в токены на основе установленного словаря, обеспечивая полное покрытие всего текста.
- Свяжите каждый токен с его соответствующим целочисленным ID, определенным в предварительно созданном словаре.
- Вставьте в последовательность все необходимые специальные токены для удовлетворения требований обработки модели.
Понимание проблем токенизации
Вводите предложения и наблюдайте, как генерируются токены (а также отмечайте соответствующее увеличение количества токенов и цены за запрос).
Наведите указатель на текст в правой части после включения флажка «Показать пробелы», и вы увидите выделенные токены. Эти токены обычно состоят из «фрагментов», которые часто включают пробел в начале.

Вот еще один пример:

Обратите внимание, как фрагменты токенов и их числовые представления различаются в зависимости от:
- Наличия пробела перед словом
- Наличия знаков препинания
- Регистра букв
Большая языковая модель (LLM) должна учиться на необработанных данных, что, несмотря на эти различия в токенах, слова представляют одно и то же понятие или, по крайней мере, очень похожи. Эта изменчивость может снижать производительность.
Другие человеческие языки
Сравнивая размер фрагментов для английского с другими языками, вы часто заметите значительно большее количество токенов, используемых для языков, отличных от английского. Эта разница возникает из-за того, что фрагменты для других языков, как правило, более фрагментированы, что приводит к увеличению длины последовательности в документах.
В механизме внимания трансформеров машинного обучения вероятность исчерпания контекста для неанглийских языков выше. Даже при передаче одного и того же сообщения расходуется больше токенов, потому что фрагменты меньше. Это несоответствие обусловлено как обучающим набором, используемым для токенизатора, так и самим токенизатором.
В конечном итоге неэффективное использование окна контекста для неанглийских языков приводит к худшей производительности большой языковой модели (LLM) при обработке запросов на неанглийских языках.
Токенизация и код — Python
В случае Python кодировщик GPT-2 от OpenAI часто тратил множество токенов на отдельные пробельные символы, используемые для отступов в сегментах кода Python. Такое поведение, подобное проблемам, с которыми сталкиваются неанглийские языки, приводит к значительному раздуванию окна контекста ограниченной языковой модели (LLM) и, следовательно, к падению производительности.
Конфигурация: YAML vs. JSON
Было обнаружено, что YAML обладает более высокой плотностью по сравнению с JSON, требуя меньше токенов для выполнения той же задачи.
Вот простая иллюстрация:


JSON: 46 токенов
Увеличенное раздувание для JSON приводит к:
- Повышению сложности понимания для LLM (меньшая плотность, больше шансов превысить окно контекста).
- Увеличению расходов для пользователей (поскольку они платят за токен при вызовах API OpenAI).
Проблемы токенизации
Токенизация лежит в основе многих аномалий, наблюдаемых в больших языковых моделях (LLM). Некоторые проблемы, которые на первый взгляд могут показаться связанными с архитектурой нейронной сети или самой LLM, на самом деле можно проследить до токенизации. Например:
- LLM испытывают трудности с правописанием слов или выполнением простых задач обработки строк, таких как реверс строки.
- Производительность ухудшается для неанглийских языков.
- LLM демонстрируют плохую производительность при выполнении простых арифметических операций.
- GPT-2 сталкивался со значительными трудностями при выполнении задач по программированию на Python.
- Могут возникать странные предупреждения, касающиеся завершающих пробелов.
- Фраза «Solid Gold Magikarp» часто заставляет LLM уходить в несвязанные темы.
- YAML предпочтительнее JSON при работе с LLM.
Токенизация в больших языковых моделях
При обучении больших языковых моделей (LLM) процесс включает взятие строк и преобразование их в целые числа из предопределенного словаря. Затем эти целые числа используются для извлечения векторов из таблицы эмбеддингов, которые затем подаются в модель Transformer. Этот процесс становится сложным, поскольку требует поддержки не только базового английского алфавита, но и различных языков и специальных символов, таких как эмодзи.
Строки в Python и кодовые точки Unicode
В Python строки являются неизменяемыми последовательностями, состоящими из кодовых точек Unicode. Эти кодовые точки определяются Unicode Consortium в стандарте Unicode, который в настоящее время включает около 150 000 символов из 161 письменности. Стандарт Unicode активно поддерживается, последняя версия 15.1 была выпущена в сентябре 2023 года.
Чтобы получить кодовую точку Unicode для одного символа в Python, мы можем использовать функцию ord(). Например:

Однако использовать эти сырые целые числа кодовых точек для токенизации невозможно, так как это приведет к чрезмерно большому словарю (более 150 000), который также будет нестабильным из-за постоянного развития стандарта Unicode.
Байтовые кодировки Unicode
В поисках более эффективного решения токенизации мы обращаемся к байтовым кодировкам Unicode, таким как ASCII, UTF-8, UTF-16 и UTF-32. Эти кодировки определяют методы преобразования абстрактных кодовых точек Unicode в фактические байты, пригодные для хранения и передачи.
Байтовые кодировки Unicode, ASCII, UTF-8, UTF-16, UTF-32
Unicode Consortium описывает три типа кодировок: UTF-8, UTF-16 и UTF-32. Эти кодировки служат средствами преобразования текста Unicode в двоичные данные или потоки байтов.
Среди этих кодировок UTF-8 является наиболее распространенной. Она преобразует каждую кодовую точку Unicode в поток байтов длиной от одного до четырех байтов в зависимости от кодовой точки. Первые 128 кодовых точек (ASCII) требуют только один байт. Следующие 1 920 кодовых точек требуют двух байтов для кодирования, охватывая большинство алфавитов на основе латиницы. Три байта требуются для оставшихся 61 440 кодовых точек в основной многоязычной плоскости (BMP). Четыре байта охватывают другие плоскости Unicode, включая менее распространенные символы CJK, различные исторические письменности и математические символы.

Использование сырых байтов UTF-8 напрямую было бы крайне неэффективным для языковых моделей, приводя к чрезмерно длинным последовательностям с ограниченным размером словаря всего в 256 возможных значений байтов. Такое ограничение мешает модели обрабатывать достаточно длинные контексты.
Решение заключается в использовании алгоритма BPE (Byte Pair Encoding) для сжатия этих байтовых последовательностей с переменной длиной. Этот подход позволяет эффективно представлять текст с большим, но настраиваемым размером словаря.
В чем разница между токенизацией и эмбеддингами?
Токенизация и эмбеддинги — это отдельные, но взаимосвязанные процессы в больших языковых моделях (LLM), таких как GPT, которые способствуют тому, как эти модели понимают и генерируют текст. Вот краткий обзор каждого из них и их различий:
Токенизация LLM
Цель: Токенизация направлена на преобразование исходного текста в последовательность токенов, которые могут быть словами, подсловами или символами в зависимости от выбранного подхода к токенизации.
Процедура: Она включает разделение текста на управляемые сегменты, которые модель может интерпретировать. Это может включать первоначальное разделение текста по пробелам и знакам препинания с последующим дальнейшим разделением на подслова или символы, если они отсутствуют в предопределенном словаре модели.
Результат: Результатом является последовательность токенов, представляющая исходный текст в формате, пригодном для обработки моделью. Каждому токену присваивается уникальный целочисленный ID, соответствующий словарю модели.
Эмбеддинги
Цель: Эмбеддинги — это компактные, низкоразмерные, непрерывные векторные представления токенов. Они кодируют семантические и синтаксические значения, облегчая понимание языковых нюансов моделью.
Процедура: После токенизации каждый токен (представленный своим целочисленным ID) связывается с вектором эмбеддинга. Эти векторы приобретаются в процессе обучения модели и хранятся в матрице или таблице эмбеддингов.
Результат: Эмбеддинги служат входными данными для слоев нейронной сети LLM, позволяя модели выполнять вычисления над токенами и выявлять взаимосвязи и закономерности в наборе данных.
Более подробную информацию об эмбеддингах LLM можно найти в нашем блоге: Что такое эмбеддинги LLM: все, что нужно знать

Отличительные особенности
Этап обработки: Токенизация служит начальным этапом предварительной обработки, преобразующим текст в формат, понятный модели (токены), в то время как эмбеддинги происходят после токенизации, переводя токены в подробные векторные представления.
Функция: Токенизация в основном связана со структурным разложением и представлением текста, тогда как эмбеддинги сосредоточены на захвате и использовании семантических и синтаксических значений, заложенных в токенах.
Представление: Токенизация дает дискретные, целочисленные представления компонентов текста, в то время как эмбеддинги преобразуют эти целые числа в непрерывные векторы, которые кодируют лингвистическую информацию.
Заключение
В заключение, токенизация и эмбеддинги играют ключевую роль в функционировании больших языковых моделей. В то время как токенизация структурирует текст в токены, эмбеддинги придают этим токенам семантические и синтаксические значения через векторные представления. Понимая эти процессы, мы получаем представление о том, как LLM интерпретируют и генерируют текст, что способствует прогрессу в обработке естественного языка.
novita.ai — универсальная платформа для безграничного творчества, предоставляющая доступ к 100+ API. От генерации изображений и обработки языка до улучшения аудио и манипуляции видео, оплата по мере использования освобождает вас от забот по обслуживанию GPU при создании собственных продуктов. Попробуйте бесплатно.
Рекомендуемое чтение
Novita AI LLM Inference Engine: максимальная пропускная способность и самый дешевый инференс
