Обновление метода generate в GPT

Основные изменения:
1. Добавлена поддержка различных стратегий генерации:
   - Жадный поиск (do_sample=False)
   - Вероятностное сэмплирование (do_sample=True)
   - Top-k сэмплирование (top_k параметр)
   - Nucleus (top-p) сэмплирование (top_p параметр)
   - Температурное сэмплирование (temperature параметр)

2. Добавлена валидация параметров:
   - Проверка temperature > 0
   - Проверка top_k > 0
   - Проверка top_p в диапазоне (0, 1]
   - Запрет одновременного использования top_k и top_p

3. Улучшена документация:
   - Подробное описание всех параметров
   - Примеры использования
   - Примечания о детерминированности
   - Описание исключений

4. Оптимизация кода:
   - Эффективное обрезание последовательности
   - Оптимизированные операции с тензорами
   - Четкое разделение логики для разных режимов
This commit is contained in:
Sergey Penkovsky
2025-07-22 10:53:57 +03:00
parent ae87faddc2
commit 5765eb3bd3
5 changed files with 441 additions and 219 deletions

View File

@@ -1,79 +1,140 @@
# Документация по GPT модели (рус)
# Документация по GPT модели
## 1. Общее описание
GPT (Generative Pre-trained Transformer) - это архитектура трансформера для генерации текста, основанная на механизме внимания.
GPT (Generative Pre-trained Transformer) - это авторегрессивная модель генерации текста на основе архитектуры трансформера.
**Основные характеристики:**
- Авторегрессивная генерация
- Многослойный декодер
- Самовнимание с маской
**Ключевые особенности реализации:**
- Поддержка различных режимов генерации (жадный поиск, сэмплирование)
- Многослойный декодер с механизмом самовнимания
- Оптимизированная работа на CPU/GPU
- Гибкая настройка параметров генерации
- Поддержка комбинированных стратегий (top-k + top-p)
## 2. Алгоритм работы
## 2. Архитектура и алгоритм
### 2.1 Архитектура
### 2.1 Полная блок-схема
```mermaid
graph TD
A[Входные токены] --> B[Токенные эмбеддинги]
A --> C[Позиционные эмбеддинги]
B --> D[Сумма эмбеддингов]
B --> D[Сумма эмбеддингов + Dropout]
C --> D
D --> E[Слой нормализации]
E --> F[Многоголовое внимание]
F --> G[Пропускная связь]
G --> H[FeedForward слой]
H --> I[Слой нормализации]
D --> E[Стек декодеров]
E --> F[Многоголовое самовнимание]
F --> G[Add & Norm]
G --> H[FeedForward]
H --> I[Add & Norm]
I --> J[Выходные логиты]
J --> K[Выбор следующего токена]
K --> L[Добавление к последовательности]
```
### 2.2 Процесс генерации
1. Токенизация входного текста
2. Вычисление эмбеддингов:
- Токенные + позиционные
3. Прохождение через N декодеров:
- Самовнимание с маской
- Полносвязные слои
4. Преобразование в вероятности
5. Выбор следующего токена
### 2.2 Режимы генерации
1. **Жадный поиск** (do_sample=False):
- Всегда выбирает токен с максимальной вероятностью
- Детерминированный результат
## 3. Использование
2. **Вероятностное сэмплирование** (do_sample=True):
- С температурой (temperature=0.5-1.5)
- Top-k (top_k=10-100)
- Nucleus sampling (top_p=0.7-0.95)
- Комбинированный режим (top_k + top_p)
### 3.1 Инициализация
## 3. Практическое использование
### 3.1 Инициализация модели
```python
from simple_llm.transformer.gpt import GPT
model = GPT(
vocab_size=10000,
max_seq_len=512,
emb_size=768,
num_heads=12,
head_size=64,
num_layers=6
vocab_size=10000, # Размер словаря
max_seq_len=512, # Макс. длина контекста
emb_size=768, # Размерность эмбеддингов
num_heads=12, # Число голов внимания
head_size=64, # Размерность головы
num_layers=6, # Количество слоев декодера
dropout=0.1, # Вероятность dropout
device='cuda' # 'cpu' или 'cuda'
)
```
### 3.2 Генерация текста
```python
output = model.generate(input_ids, max_new_tokens=50)
output = model.generate(
input_ids, # Входные токены [batch_size, seq_len]
max_new_tokens=50, # Макс. число новых токенов
do_sample=True, # Режим сэмплирования
temperature=0.9, # Контроль случайности (0.1-2.0)
top_k=50, # Ограничение по топ-k токенам
top_p=0.9, # Параметр nucleus sampling
repetition_penalty=1.2, # Штраф за повторения
stop_tokens=None # Токены для остановки генерации
)
```
## 4. Гиперпараметры
### 3.3 Примеры использования
| Параметр | Описание |
|----------------|-----------------------------------|
| vocab_size | Размер словаря |
| max_seq_len | Макс. длина последовательности |
| emb_size | Размерность эмбеддингов |
| num_heads | Количество голов внимания |
| head_size | Размерность головы внимания |
| num_layers | Количество слоев декодера |
**Базовый пример:**
```python
text = "Анализ данных - это"
input_ids = tokenizer.encode(text)
output_ids = model.generate(input_ids, max_new_tokens=100)
generated_text = tokenizer.decode(output_ids[0])
```
## 5. Примеры применения
- Генерация текста
- Дозаполнение форм
- Кодогенерация
- Чат-боты
**Креативная генерация:**
```python
output = model.generate(
input_ids,
max_new_tokens=100,
do_sample=True,
temperature=1.3,
top_k=60,
top_p=0.85
)
```
## 6. Ограничения
- Требует больших вычислительных ресурсов
- Ограничена максимальной длиной последовательности
- Может генерировать некорректный текст
## 4. Оптимизация и настройка
### 4.1 Рекомендуемые параметры
| Тип задачи | Параметры |
|------------------|-------------------------------|
| Точные ответы | temp=0.7, top_k=40, top_p=0.8 |
| Креативная письмо| temp=1.2, top_k=60, top_p=0.9 |
| Кодогенерация | temp=0.8, top_k=50, top_p=0.85|
### 4.2 Производительность
**Для CPU:**
```python
model = GPT(
emb_size=256,
num_layers=4,
num_heads=8,
device='cpu'
)
```
**Для GPU:**
```python
model = GPT(
emb_size=1024,
num_layers=12,
device='cuda'
)
```
## 5. Ограничения и решения
| Ограничение | Решение |
|---------------------------|------------------------------|
| Длинные последовательности| Чанкование входных данных |
| Высокая загрузка памяти | Уменьшение batch_size |
| Повторы в генерации | Настройка repetition_penalty |
| Медленная генерация | Кэширование ключей/значений |
## 6. Дополнительные материалы
- [Примеры использования](../example/example_gpt.py)
- [Тесты](../tests/test_gpt.py)
- [Оптимизация производительности](performance_guide.md)