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. Эффективное представление редких слов
|
1. Эффективное представление редких слов
|
||||||
|
|||||||
Reference in New Issue
Block a user