From 26f173cc16181af0ff95548e50cd7586d1a8fc32 Mon Sep 17 00:00:00 2001 From: Sergey Penkovsky Date: Sat, 12 Jul 2025 11:19:54 +0300 Subject: [PATCH] doc: update bpe algorithm --- doc/bpe_algorithm.md | 77 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/doc/bpe_algorithm.md b/doc/bpe_algorithm.md index 4219e74..2be0046 100644 --- a/doc/bpe_algorithm.md +++ b/doc/bpe_algorithm.md @@ -117,6 +117,83 @@ def train_bpe(text, vocab_size): **Результирующий словарь** (частично): ['м', 'а', ' ', 'ы', 'л', 'р', 'у', 'ма', 'ма ', 'мы'] +## Алгоритм энкодинга (токенизации) + +После обучения BPE-модели (создания словаря), энкодинг текста происходит по следующему алгоритму: + +```mermaid +graph TD + A[Начало] --> B[Разбить текст на символы] + B --> C[Инициализировать пустой список токенов] + C --> D[Установить i=0 'начало последовательности'] + D --> E{i < длины текста?} + E -->|Нет| F[Заменить токены на их ID] + E -->|Да| G[Найти все токены в словаре, начинающиеся с text_i] + G --> H[Выбрать самый длинный подходящий токен] + H --> I[Добавить токен в результат] + I --> J[Увеличить i на длину токена] + J --> E + F --> K[Конец] +``` + +Пошаговое описание: +1. **Инициализация**: + - Исходный текст разбивается на символы + - Создается пустой список для результата + - Указатель `i` устанавливается в 0 + +2. **Основной цикл**: + - Для текущей позиции `i` находим все токены в словаре, которые: + - Начинаются с символа `text[i]` + - Совпадают с подстрокой `text[i:i+len(token)]` + - Из подходящих токенов выбираем самый длинный + - Добавляем найденный токен в результат + - Сдвигаем указатель `i` на длину добавленного токена + +3. **Завершение**: + - Когда весь текст обработан, заменяем токены на их ID из словаря + +Пример: +```python +Словарь: ['ма', 'мама', ' ', 'мыл', 'а', 'раму'] +Текст: "мама мыла раму" + +Энкодинг: +1. Находим самый длинный токен, начинающийся с 'м' -> 'мама' +2. Добавляем 'мама', i += 4 +3. Токен ' ' (пробел), i += 1 +4. Токен 'мыл', i += 3 +5. Токен 'а', i += 1 +6. Токен ' ', i += 1 +7. Токен 'раму', i += 4 + +Результат: ['мама', ' ', 'мыл', 'а', ' ', 'раму'] +``` + +## Алгоритм декодирования + +### Принцип работы +1. Преобразование списка ID обратно в текст +2. Замена каждого ID на соответствующий токен +3. Обработка неизвестных ID (`[UNK]`) + +```mermaid +flowchart TD + A[Список ID] --> B{ID ∈ словарь?} + B -->|Да| C[Добавить токен] + B -->|Нет| D[Добавить UNK] + C --> E[Следующий ID] + D --> E + E --> F{Конец списка?} + F -->|Нет| B + F -->|Да| G[Объединить токены] +``` + +Пример: +```python +decode([0,1,2]) → "абра" # Для словаря {0:"а", 1:"б", 2:"ра"} +``` + ## Применение в языковых моделях 1. Эффективное представление редких слов