中文翻译暂不可用,显示俄语原文。
Как вы комбинируете реальные и синтетические данные для максимального качества?
Краткий тезис
Комбинирование реальных и синтетических данных — ключевой приём для повышения качества моделей при ограниченном объёме размеченных примеров. Оптимальная стратегия: 10–30% реальных данных и 70–90% синтетических. Сначала модель обучается на большом объёме синтетики (pre-training или первый этап fine-tuning), затем дообучается на реальных данных (fine-tuning). В каждом батче поддерживается смесь real + synthetic в соотношении 1:3, а валидация проводится исключительно на real holdout, чтобы избежать переобучения на артефакты синтетики.
1. Зачем комбинировать реальные и синтетические данные?
Реальные данные (real data) — это примеры, собранные от пользователей, экспертов или из production-логов. Они дороги в сборе и разметке, но максимально репрезентативны. Синтетические данные (synthetic data) генерируются автоматически (LLM, шаблоны, симуляторы) — дёшево, масштабируемо, но могут содержать систематические ошибки и не покрывать редкие сценарии.
Комбинирование решает дилемму «качество vs количество»:
- Синтетика даёт объём и разнообразие, помогает модели изучить общие паттерны.
- Реальные данные корректируют смещение (bias) синтетики и «приземляют» модель к истинному распределению.
Без реальных данных модель может отлично работать на синтетических тестах, но проваливаться в production. Без синтетики — не хватит примеров для обобщения.
2. Типы синтетических данных
| Тип | Описание | Пример |
|---|---|---|
| Self-instruct | Модель генерирует инструкции и ответы на основе промптов | LLM пишет вопросы по документации и отвечает на них |
| Back-translation | Перевод текста на другой язык и обратно для получения парафраз | Английский → Французский → Английский |
| Template-based | Заполнение шаблонов с переменными | «Как {действие} в {инструмент}?» → «Как настроить CI/CD в Jenkins?» |
| Adversarial | Генерация сложных/граничных примеров для улучшения робастности | Вопросы с опечатками, противоречиями |
| Data augmentation | Модификация существующих реальных примеров (синонимы, перестановка) | Замена слов на синонимы в запросах |
Для Agentic RAG синтетические данные часто генерируют с помощью симуляции агента: задаётся сценарий, агент выполняет действия (retrieval, вызов инструментов), и записывается траектория (запрос → контекст → ответ). Это даёт пары (вход, выход) для обучения.
3. Стратегии смешивания: двухэтапное обучение
3.1 Первый этап: обучение на синтетике (pre-training / large-scale fine-tuning)
- Используется 100% синтетических данных (или 90% синтетики + 10% real для стабильности).
- Цель: модель учится общей структуре задачи, формату ответов, базовым паттернам.
- Объём: десятки/сотни тысяч примеров.
- Риск: модель может выучить артефакты синтетики (повторяющиеся фразы, логические ошибки).
3.2 Второй этап: дообучение на реальных данных (fine-tuning)
- Используются только реальные данные (или смесь с сильным перевесом real).
- Цель: скорректировать смещение, улучшить точность на реальных запросах.
- Объём: несколько тысяч примеров (10–30% от общего датасета).
- Важно: learning rate на втором этапе обычно ниже (1e-5 vs 1e-4), чтобы не разрушить выученные паттерны.
4. Стратегии смешивания: совместное обучение (joint training)
В каждом батче смешиваются real и synthetic примеры. Соотношение — гиперпараметр.
Рекомендуемое соотношение: 1 часть real : 3 части synthetic (25% real, 75% synthetic). Почему?
- Слишком много real → модель переобучается на малом объёме, теряет обобщение.
- Слишком много synthetic → модель игнорирует реальное распределение.
Пример батча (batch_size=32):
- 8 real примеров
- 24 synthetic примера
Можно использовать динамическое соотношение: на ранних эпохах больше synthetic, на поздних — больше real (curriculum learning).
5. Валидация: только на real holdout
Критическое правило: никогда не валидируйтесь на синтетических данных. Синтетика может быть сгенерирована той же моделью, что обучается, или содержать скрытые паттерны, которые модель выучит, но которые не переносятся на реальность.
Holdout — это отложенная выборка реальных данных (обычно 10–20% от всех real), которая не участвовала в обучении. Метрики считаются только на ней.
Если метрики на real holdout падают при добавлении синтетики — значит синтетика вредит (например, слишком шумная или нерепрезентативная). В таком случае нужно улучшать качество генерации синтетики или уменьшать её долю.
6. Метрики качества при комбинировании
| Метрика | На чём считается | Цель |
|---|---|---|
| Accuracy / F1 | Real holdout | Основная метрика задачи |
| Perplexity | Real holdout | Проверка, не переобучилась ли модель на синтаксис синтетики |
| Diversity (distinct n-grams) | Synthetic train | Синтетика должна быть разнообразной, иначе модель заучит шаблоны |
| Faithfulness (для RAG) | Real holdout | Ответы должны соответствовать контексту, а не выдумкам синтетики |
| Human evaluation | Real sample | Финальная проверка качества |
7. Инструменты для генерации и смешивания
- LangChain / LlamaIndex — пайплайны генерации синтетических данных для RAG (синтез вопросов по документам).
- Hugging Face Datasets — удобное смешивание датасетов (
concatenate_datasets,interleave_datasets). - Weights & Biases / MLflow — отслеживание экспериментов с разными соотношениями.
- NVIDIA NeMo / Google T5X — фреймворки для масштабного fine-tuning с поддержкой смешанных данных.
Пример кода на Python для смешивания батчей:
from datasets import Dataset, interleave_datasets
import torch
from torch.utils.data import DataLoader
real_ds = Dataset.from_dict({"text": real_texts})
synth_ds = Dataset.from_dict({"text": synth_texts})
# Соотношение 1:3 -> probabilities [0.25, 0.75]
mixed_ds = interleave_datasets([real_ds, synth_ds], probabilities=[0.25, 0.75])
dataloader = DataLoader(mixed_ds, batch_size=32, shuffle=True)
8. Риски и как их избежать
| Риск | Причина | Решение |
|---|---|---|
| Переобучение на синтетику | Синтетика однообразна | Использовать несколько источников генерации, добавлять шум |
| Смещение (bias) | Синтетика копирует bias LLM-генератора | Фильтровать синтетику, балансировать по демографическим группам |
| Ухудшение на реальных данных | Синтетика не покрывает реальные сценарии | Увеличивать долю real, улучшать качество синтетики (human-in-the-loop) |
| Концептуальный дрейф | Реальные данные меняются со временем | Периодически обновлять real датасет, перегенерировать синтетику |
9. Best practices
- Начинайте с синтетики: сначала обучите baseline на большом объёме синтетических данных.
- Добавляйте real постепенно: увеличивайте долю real от 0% до 30% на втором этапе.
- Используйте real для валидации и early stopping: останавливайте обучение, когда метрика на real holdout перестаёт расти.
- Генерируйте синтетику с контролем качества: применяйте фильтры (длина, логическая непротиворечивость, разнообразие).
- Экспериментируйте с соотношением: запустите grid search по долям real (5%, 10%, 20%, 30%) на небольшом подмножестве.
- Документируйте происхождение данных: real и synthetic должны быть чётко размечены в датасете.
10. Пример из практики: fine-tuning агента для RAG
Допустим, мы обучаем агента, который по запросу пользователя ищет документы, вызывает API и формирует ответ. У нас есть 500 реальных диалогов (дорогие) и возможность сгенерировать 10 000 синтетических.
План:
- Сгенерировать 10 000 синтетических траекторий с помощью симуляции (LLM-агент + набор документов).
- Обучить модель на всех 10 000 синтетических примерах (3 эпохи, lr=1e-4).
- Смешать 500 real + 2000 synthetic (выборка из 10 000) в соотношении 1:4 (20% real).
- Дообучить ещё 2 эпохи с lr=5e-5, валидируясь на 100 real holdout.
- Если метрика (например, успешность выполнения задания) на holdout > 85% — стоп.
Результат: модель показывает 90% успешности на real тестах против 70% без синтетики и 80% только на real.
Пет-проект для закрепления
Задача: Обучить небольшую модель (например, DistilBERT или TinyLLaMA) отвечать на вопросы по технической документации, используя комбинацию real и synthetic данных.
Инструменты:
- Hugging Face Transformers, Datasets, TRL (для fine-tuning).
- LangChain для генерации синтетических Q&A пар по документам.
- Weights & Biases для логирования.
Шаги:
- Собрать 200 реальных вопросов от коллег или из логов чата.
- Сгенерировать 2000 синтетических вопросов по той же документации с помощью LLM (GPT-4 или Llama 3).
- Создать датасет с меткой
source(real/synthetic). - Обучить модель в два этапа: сначала на всех synthetic (5 эпох), затем на смеси 1:3 (real:synthetic) ещё 3 эпохи.
- Оценить на real holdout (50 примеров) после каждого этапа.
- Сравнить с baseline (только real, только synthetic).
Ожидаемый результат: модель, обученная на смеси, покажет лучший F1 на real holdout, чем любая из моно-стратегий.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 680 | Fine-tuning LLM: стратегии и гиперпараметры |
| 690 | Data augmentation для NLP |
| 695 | Оценка качества генерации текста |
| 705 | Синтетические данные для RAG: генерация и фильтрация |
| 710 | Как избежать переобучения при fine-tuning |
| 720 | Human-in-the-loop для улучшения датасета |
Навигация
- Предыдущий: 699
- Следующий: 701
- Индекс: 00. Индекс разборов