mirror of
https://github.com/pese-git/simple-llm.git
synced 2026-01-23 21:14:17 +00:00
doc: update bpe algorithm
This commit is contained in:
@@ -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. Эффективное представление редких слов
|
||||
|
||||
Reference in New Issue
Block a user