Токенизация

Материал из MachineLearning.

(Различия между версиями)
Перейти к: навигация, поиск
Строка 1: Строка 1:
-
{{well|Статья написана с использованием LLM '''Claude Opus 4.8''' и проверена участником [[Участник:Iaroslav Lyakhov|Iaroslav Lyakhov]] 21:38, 1 июля 2026 (MSD)}}
+
{{well|Статья написана с использованием LLM '''Claude Opus 4.8''' и проверена участником [[Участник:Iaroslav Lyakhov|Iaroslav Lyakhov]] 19:15, 5 июля 2026 (MSD)}}
{{TOCright}}
{{TOCright}}
-
'''Токениза́ция''' (англ. ''tokenization'') в [[Обработка естественного языка|обработке естественного языка]] - это разбиение текста на элементарные единицы (''токены''), которыми оперирует модель. Токенизация - первый шаг любого конвейера работы с текстом: именно токены, а не символы или слова, [[Большая языковая модель|языковая модель]] кодирует в числа и предсказывает. От выбора способа токенизации зависят размер словаря, длина последовательности, скорость и качество модели.
+
'''Токениза́ция''' (англ. ''tokenization'') в [[Обработка естественного языка|обработке естественного языка]] - это разбиение текста на элементарные единицы (''токены''), которыми оперирует модель. Токен может быть словом, частью слова, отдельным символом или даже байтом. Токенизация - это самый первый шаг любого конвейера работы с текстом: именно последовательность токенов, а не сам текст, [[Большая языковая модель|языковая модель]] превращает в числа, обрабатывает и предсказывает. От того, как устроена токенизация, зависят размер словаря, длина входа, скорость работы, стоимость запроса и даже то, какие задачи модели даются легко, а какие - с трудом.
-
== Зачем нужна ==
+
== Зачем она нужна ==
-
[[Нейронная сеть|Нейросеть]] не работает с текстом напрямую - ей нужны числа. Токенизатор переводит строку в последовательность целочисленных идентификаторов из фиксированного ''словаря''. Возникает противоречие:
+
[[Нейронная сеть|Нейросеть]] не умеет работать с буквами напрямую - ей нужны числа. Токенизатор решает две задачи: разбивает строку на токены и сопоставляет каждому токену целочисленный номер из заранее построенного ''словаря''. Дальше номер превращается в [[Embedding|вектор]], и уже с векторами работает модель.
-
* '''словарь из слов''' - компактные последовательности, но огромный словарь и проблема неизвестных слов (out-of-vocabulary): любое опечатанное или редкое слово нельзя закодировать;
+
-
* '''словарь из символов''' - крошечный словарь без OOV, но очень длинные последовательности, что дорого для [[Трансформер|трансформера]] с его квадратичной сложностью.
+
-
Компромисс - '''токенизация по подсловам''' (subword), которая стала стандартом.
+
Ключевой вопрос - что считать токеном. Здесь есть противоречие между двумя крайностями.
 +
 
 +
* '''Словами.''' Словарь из целых слов даёт короткие последовательности, но получается огромным (сотни тысяч и миллионы форм), а любое незнакомое слово - опечатка, неологизм, редкий термин - выпадает из словаря (проблема ''out-of-vocabulary'', OOV) и не может быть закодировано.
 +
* '''Символами.''' Словарь из букв крошечный и OOV не бывает, но последовательности становятся очень длинными. Для [[Трансформер|трансформера]], у которого вычислительная сложность растёт квадратично с длиной входа, это дорого.
 +
 
 +
Практически все современные модели используют компромисс - '''токенизацию по подсловам''' (subword tokenization).
== Подсловная токенизация ==
== Подсловная токенизация ==
-
Идея: частые слова остаются целыми токенами, а редкие дробятся на осмысленные части (морфемы, корни). Так словарь остаётся ограниченным (обычно десятки тысяч токенов - от ~30 000 до 100 000 и более), а неизвестных слов не возникает - в худшем случае слово соберётся из отдельных символов. Например, частотное «дом» останется одним токеном, а редкое «токенизация» может быть разбито на несколько частей вроде «токен» + «из» + «ация».
+
Идея простая: частые слова остаются целыми токенами, а редкие дробятся на осмысленные куски - приставки, корни, окончания. Так словарь остаётся ограниченным (обычно от 30 до 100 и более тысяч токенов), OOV не возникает вообще (в самом плохом случае слово соберётся из отдельных символов или байтов), а типичный текст кодируется недлинной последовательностью. Например, частотное слово «дом» будет одним токеном, а редкое «токенизация» распадётся на несколько частей, условно «токен» + «из» + «ация».
 +
 
 +
=== BPE ===
 +
'''BPE''' (Byte Pair Encoding) строит словарь снизу вверх. Сначала все слова разбиты на отдельные символы. Затем алгоритм много раз находит самую частую пару соседних токенов и объединяет её в один новый токен, добавляя его в словарь. Так постепенно «склеиваются» частые буквосочетания, слоги и целые слова, пока словарь не достигнет заданного размера. BPE лёг в основу большинства современных токенизаторов.
 +
 
 +
=== WordPiece ===
 +
'''WordPiece''' очень похож на BPE, но выбирает для слияния не самую частую пару, а ту, что сильнее всего увеличивает правдоподобие обучающих данных. Применяется в модели [[BERT]].
 +
 
 +
=== Unigram ===
 +
'''Unigram''' действует наоборот - сверху вниз: стартует с заведомо большого словаря и постепенно выбрасывает из него токены, потеря которых меньше всего вредит правдоподобию. Реализован в популярной библиотеке SentencePiece.
 +
 
 +
=== Byte-level BPE ===
 +
'''Byte-level BPE''' применяет тот же BPE, но не к символам, а к байтам представления UTF-8. Благодаря этому словарь гарантированно покрывает вообще любой текст - любые языки, эмодзи, спецсимволы - и OOV становится невозможным в принципе. Этот вариант используют модели семейства [[Большая языковая модель|GPT]].
-
Основные алгоритмы:
+
== Специальные токены ==
-
* '''BPE''' (Byte Pair Encoding) - итеративно объединяет самую частую пару соседних токенов в новый токен, пока не достигнут заданный размер словаря. Лёг в основу многих современных токенизаторов.
+
Кроме «содержательных» токенов, словарь обычно включает служебные:
-
* '''WordPiece''' - близок к BPE, но пары выбираются по максимуму правдоподобия, а не частоты. Применяется в BERT.
+
* маркеры начала и конца текста (например, ''<bos>'', ''<eos>'');
-
* '''Unigram LM''' - стартует с большого словаря и удаляет токены, наименее влияющие на правдоподобие. Реализован в библиотеке SentencePiece.
+
* разделители и метки для BERT-подобных моделей (''[CLS]'', ''[SEP]'');
-
* '''Byte-level BPE''' - применяет BPE к байтам UTF-8, что гарантирует отсутствие OOV для любых символов и языков, включая эмодзи. Используется в моделях семейства [[Большая языковая модель|GPT]].
+
* токен-заполнитель (''padding'') для выравнивания длин в батче;
 +
* иногда - специальные токены для ролей в диалоге и вызова инструментов.
== Особенности и подводные камни ==
== Особенности и подводные камни ==
-
* '''Неравномерность по языкам.''' Словари обучаются преимущественно на английском, поэтому текст на русском, арабском или китайском обычно дробится на большее число токенов. Это удорожает запросы и «съедает» [[Контекстное обучение|контекстное окно]].
+
* '''Неравномерность по языкам.''' Словари обучаются в основном на английских текстах, поэтому русский, арабский или китайский обычно дробятся на большее число токенов. Одна и та же по смыслу фраза на русском может стоить в полтора-два раза больше токенов, чем на английском. Это и удорожает запросы, и быстрее «съедает» [[Контекстное обучение|контекстное окно]].
-
* '''Токены - не слова.''' Одно слово может стать несколькими токенами, а пробел часто включается в токен. Это объясняет, почему модели плохо считают буквы в слове или решают задачи вида «сколько букв „р“».
+
* '''Токен - это не слово.''' Одно слово нередко становится несколькими токенами, а ведущий пробел часто входит в токен как его часть. Именно поэтому модели плохо решают задачи вида «сколько букв „р“ в слове» или «переверни строку»: они видят не буквы, а куски.
-
* '''Стоимость и длина.''' Тарификация API и ограничение длины контекста измеряются в токенах, а не в словах или символах.
+
* '''Числа и код.''' Длинные числа и фрагменты кода токенизируются неинтуитивно (число может распасться на произвольные куски), что напрямую влияет на арифметические способности модели.
-
* '''Числа и код''' токенизируются неинтуитивно, что влияет на арифметические способности модели.
+
* '''Стоимость и лимиты.''' И тарификация API, и ограничение длины контекста измеряются в токенах, а не в словах или символах.
== Связь с другими понятиями ==
== Связь с другими понятиями ==
-
После токенизации каждый токен отображается в [[Embedding|векторное представление]] (эмбеддинг): именно с обучаемой векторизации токенов начинают работу модели [[Дистрибутивная семантика|дистрибутивной семантики]], [[Метод главных компонент|матричные разложения]] текстов и [[Трансформер|трансформеры]]. Качество токенизации опосредованно влияет на все последующие этапы: от предобучения до [[Цепочки рассуждений|пошаговых рассуждений]].
+
После токенизации каждый токен превращается в [[Embedding|векторное представление]] (эмбеддинг). Именно с обучаемой векторизации токенов начинается работа моделей [[Дистрибутивная семантика|дистрибутивной семантики]], [[Метод главных компонент|матричных разложений]] текстов и [[Трансформер|трансформеров]]. Таким образом, токенизация задаёт «алфавит», в котором модель вообще воспринимает язык, и её качество опосредованно влияет на всё, что происходит дальше - от предобучения до [[Цепочки рассуждений|пошаговых рассуждений]].
== См. также ==
== См. также ==
Строка 33: Строка 49:
* [[Embedding|Векторное представление (эмбеддинг)]]
* [[Embedding|Векторное представление (эмбеддинг)]]
* [[Трансформер]]
* [[Трансформер]]
 +
* [[BERT]]
* [[Обработка естественного языка]]
* [[Обработка естественного языка]]
Строка 38: Строка 55:
* {{статья |автор=Sennrich R., Haddow B., Birch A. |часть=Neural Machine Translation of Rare Words with Subword Units |заглавие=Proc. of ACL |год=2016 |ссылка=https://arxiv.org/abs/1508.07909}}
* {{статья |автор=Sennrich R., Haddow B., Birch A. |часть=Neural Machine Translation of Rare Words with Subword Units |заглавие=Proc. of ACL |год=2016 |ссылка=https://arxiv.org/abs/1508.07909}}
* {{статья |автор=Kudo T., Richardson J. |часть=SentencePiece: A simple and language independent subword tokenizer and detokenizer for Neural Text Processing |заглавие=Proc. of EMNLP (System Demonstrations) |год=2018 |ссылка=https://arxiv.org/abs/1808.06226}}
* {{статья |автор=Kudo T., Richardson J. |часть=SentencePiece: A simple and language independent subword tokenizer and detokenizer for Neural Text Processing |заглавие=Proc. of EMNLP (System Demonstrations) |год=2018 |ссылка=https://arxiv.org/abs/1808.06226}}
 +
* {{статья |автор=Kudo T. |часть=Subword Regularization: Improving Neural Network Translation Models with Multiple Subword Candidates |заглавие=Proc. of ACL |год=2018 |ссылка=https://arxiv.org/abs/1804.10959}}
[[Категория:Машинное обучение]]
[[Категория:Машинное обучение]]
[[Категория:Анализ текстов]]
[[Категория:Анализ текстов]]

Версия 15:15, 5 июля 2026

Статья написана с использованием LLM Claude Opus 4.8 и проверена участником Iaroslav Lyakhov 19:15, 5 июля 2026 (MSD)


Содержание

Токениза́ция (англ. tokenization) в обработке естественного языка - это разбиение текста на элементарные единицы (токены), которыми оперирует модель. Токен может быть словом, частью слова, отдельным символом или даже байтом. Токенизация - это самый первый шаг любого конвейера работы с текстом: именно последовательность токенов, а не сам текст, языковая модель превращает в числа, обрабатывает и предсказывает. От того, как устроена токенизация, зависят размер словаря, длина входа, скорость работы, стоимость запроса и даже то, какие задачи модели даются легко, а какие - с трудом.

Зачем она нужна

Нейросеть не умеет работать с буквами напрямую - ей нужны числа. Токенизатор решает две задачи: разбивает строку на токены и сопоставляет каждому токену целочисленный номер из заранее построенного словаря. Дальше номер превращается в вектор, и уже с векторами работает модель.

Ключевой вопрос - что считать токеном. Здесь есть противоречие между двумя крайностями.

  • Словами. Словарь из целых слов даёт короткие последовательности, но получается огромным (сотни тысяч и миллионы форм), а любое незнакомое слово - опечатка, неологизм, редкий термин - выпадает из словаря (проблема out-of-vocabulary, OOV) и не может быть закодировано.
  • Символами. Словарь из букв крошечный и OOV не бывает, но последовательности становятся очень длинными. Для трансформера, у которого вычислительная сложность растёт квадратично с длиной входа, это дорого.

Практически все современные модели используют компромисс - токенизацию по подсловам (subword tokenization).

Подсловная токенизация

Идея простая: частые слова остаются целыми токенами, а редкие дробятся на осмысленные куски - приставки, корни, окончания. Так словарь остаётся ограниченным (обычно от 30 до 100 и более тысяч токенов), OOV не возникает вообще (в самом плохом случае слово соберётся из отдельных символов или байтов), а типичный текст кодируется недлинной последовательностью. Например, частотное слово «дом» будет одним токеном, а редкое «токенизация» распадётся на несколько частей, условно «токен» + «из» + «ация».

BPE

BPE (Byte Pair Encoding) строит словарь снизу вверх. Сначала все слова разбиты на отдельные символы. Затем алгоритм много раз находит самую частую пару соседних токенов и объединяет её в один новый токен, добавляя его в словарь. Так постепенно «склеиваются» частые буквосочетания, слоги и целые слова, пока словарь не достигнет заданного размера. BPE лёг в основу большинства современных токенизаторов.

WordPiece

WordPiece очень похож на BPE, но выбирает для слияния не самую частую пару, а ту, что сильнее всего увеличивает правдоподобие обучающих данных. Применяется в модели BERT.

Unigram

Unigram действует наоборот - сверху вниз: стартует с заведомо большого словаря и постепенно выбрасывает из него токены, потеря которых меньше всего вредит правдоподобию. Реализован в популярной библиотеке SentencePiece.

Byte-level BPE

Byte-level BPE применяет тот же BPE, но не к символам, а к байтам представления UTF-8. Благодаря этому словарь гарантированно покрывает вообще любой текст - любые языки, эмодзи, спецсимволы - и OOV становится невозможным в принципе. Этот вариант используют модели семейства GPT.

Специальные токены

Кроме «содержательных» токенов, словарь обычно включает служебные:

  • маркеры начала и конца текста (например, <bos>, <eos>);
  • разделители и метки для BERT-подобных моделей ([CLS], [SEP]);
  • токен-заполнитель (padding) для выравнивания длин в батче;
  • иногда - специальные токены для ролей в диалоге и вызова инструментов.

Особенности и подводные камни

  • Неравномерность по языкам. Словари обучаются в основном на английских текстах, поэтому русский, арабский или китайский обычно дробятся на большее число токенов. Одна и та же по смыслу фраза на русском может стоить в полтора-два раза больше токенов, чем на английском. Это и удорожает запросы, и быстрее «съедает» контекстное окно.
  • Токен - это не слово. Одно слово нередко становится несколькими токенами, а ведущий пробел часто входит в токен как его часть. Именно поэтому модели плохо решают задачи вида «сколько букв „р“ в слове» или «переверни строку»: они видят не буквы, а куски.
  • Числа и код. Длинные числа и фрагменты кода токенизируются неинтуитивно (число может распасться на произвольные куски), что напрямую влияет на арифметические способности модели.
  • Стоимость и лимиты. И тарификация API, и ограничение длины контекста измеряются в токенах, а не в словах или символах.

Связь с другими понятиями

После токенизации каждый токен превращается в векторное представление (эмбеддинг). Именно с обучаемой векторизации токенов начинается работа моделей дистрибутивной семантики, матричных разложений текстов и трансформеров. Таким образом, токенизация задаёт «алфавит», в котором модель вообще воспринимает язык, и её качество опосредованно влияет на всё, что происходит дальше - от предобучения до пошаговых рассуждений.

См. также

Литература

  • Sennrich R., Haddow B., Birch A. Proc. of ACL. — 2016.
  • Kudo T., Richardson J. Proc. of EMNLP (System Demonstrations). — 2018.
  • Kudo T. Proc. of ACL. — 2018.