doc: update bpe algorithm

This commit is contained in:
Sergey Penkovsky
2025-07-12 11:19:54 +03:00
parent 362a7483e6
commit 26f173cc16

View File

@@ -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. Эффективное представление редких слов