Токенизация
Материал из MachineLearning.
| (1 промежуточная версия не показана) | |||
| Строка 1: | Строка 1: | ||
| - | {{well|Статья написана с использованием LLM '''Claude Opus 4.8''' и проверена участником [[Участник:Iaroslav Lyakhov|Iaroslav Lyakhov]] | + | {{well|Статья написана с использованием LLM '''Claude Opus 4.8''' и проверена участником [[Участник:Iaroslav Lyakhov|Iaroslav Lyakhov]] 19:15, 5 июля 2026 (MSD)}} |
{{TOCright}} | {{TOCright}} | ||
| - | '''Токениза́ция''' (англ. ''tokenization'') в [[Обработка естественного языка|обработке естественного языка]] - это разбиение текста на элементарные единицы (''токены''), которыми оперирует модель. Токенизация - первый шаг любого конвейера работы с текстом: именно | + | '''Токениза́ция''' (англ. ''tokenization'') в [[Обработка естественного языка|обработке естественного языка]] - это разбиение текста на элементарные единицы (''токены''), которыми оперирует модель. Токен может быть словом, частью слова, отдельным символом или даже байтом. Токенизация - это самый первый шаг любого конвейера работы с текстом: именно последовательность токенов, а не сам текст, [[Большая языковая модель|языковая модель]] превращает в числа, обрабатывает и предсказывает. От того, как устроена токенизация, зависят размер словаря, длина входа, скорость работы, стоимость запроса и даже то, какие задачи модели даются легко, а какие - с трудом. |
| - | == Зачем нужна == | + | == Зачем она нужна == |
| - | [[Нейронная сеть|Нейросеть]] не | + | [[Нейронная сеть|Нейросеть]] не умеет работать с буквами напрямую - ей нужны числа. Токенизатор решает две задачи: разбивает строку на токены и сопоставляет каждому токену целочисленный номер из заранее построенного ''словаря''. Дальше номер превращается в [[Embedding|вектор]], и уже с векторами работает модель. |
| - | + | ||
| - | + | ||
| - | + | Ключевой вопрос - что считать токеном. Здесь есть противоречие между двумя крайностями. | |
| + | |||
| + | * '''Словами.''' Словарь из целых слов даёт короткие последовательности, но получается огромным (сотни тысяч и миллионы форм), а любое незнакомое слово - опечатка, неологизм, редкий термин - выпадает из словаря (проблема ''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, и ограничение длины контекста измеряются в токенах, а не в словах или символах. | |
== Связь с другими понятиями == | == Связь с другими понятиями == | ||
| - | После токенизации каждый токен | + | После токенизации каждый токен превращается в [[Embedding|векторное представление]] (эмбеддинг). Именно с обучаемой векторизации токенов начинается работа моделей [[Дистрибутивная семантика|дистрибутивной семантики]], [[Метод главных компонент|матричных разложений]] текстов и [[Трансформер|трансформеров]]. Таким образом, токенизация задаёт «алфавит», в котором модель вообще воспринимает язык, и её качество опосредованно влияет на всё, что происходит дальше - от предобучения до [[Цепочки рассуждений|пошаговых рассуждений]]. |
== См. также == | == См. также == | ||
| Строка 33: | Строка 49: | ||
* [[Embedding|Векторное представление (эмбеддинг)]] | * [[Embedding|Векторное представление (эмбеддинг)]] | ||
* [[Трансформер]] | * [[Трансформер]] | ||
| + | * [[BERT]] | ||
* [[Обработка естественного языка]] | * [[Обработка естественного языка]] | ||
== Литература == | == Литература == | ||
| - | * {{статья |автор=Sennrich R., Haddow B., Birch A. | | + | * {{статья |автор=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. | | + | * {{статья |автор=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}} | ||
| + | |||
[[Категория:Машинное обучение]] | [[Категория:Машинное обучение]] | ||
[[Категория:Анализ текстов]] | [[Категория:Анализ текстов]] | ||
Текущая версия
| | Статья написана с использованием 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, и ограничение длины контекста измеряются в токенах, а не в словах или символах.
Связь с другими понятиями
После токенизации каждый токен превращается в векторное представление (эмбеддинг). Именно с обучаемой векторизации токенов начинается работа моделей дистрибутивной семантики, матричных разложений текстов и трансформеров. Таким образом, токенизация задаёт «алфавит», в котором модель вообще воспринимает язык, и её качество опосредованно влияет на всё, что происходит дальше - от предобучения до пошаговых рассуждений.
См. также
- Большая языковая модель
- Векторное представление (эмбеддинг)
- Трансформер
- BERT
- Обработка естественного языка
Литература
- Sennrich R., Haddow B., Birch A. Neural Machine Translation of Rare Words with Subword Units // Proc. of ACL. — 2016.
- Kudo T., Richardson J. SentencePiece: A simple and language independent subword tokenizer and detokenizer for Neural Text Processing // Proc. of EMNLP (System Demonstrations). — 2018.
- Kudo T. Subword Regularization: Improving Neural Network Translation Models with Multiple Subword Candidates // Proc. of ACL. — 2018.

