中文翻译暂不可用,显示俄语原文。

Как вы оцениваете, сколько синтетических данных нужно для fine-tuning (power analysis)?

Краткий тезис

Определение необходимого объёма синтетических данных для fine-tuning — это эмпирический процесс, основанный на построении кривой обучения (learning curve). Обычно для LoRA достаточно 500–2000 примеров, для full fine-tuning — 10k–50k. Закон убывающей отдачи (diminishing returns) показывает, что 10k примеров дают 90% максимального качества, а 100k — 98%. Для точной оценки проводят power analysis: обучают модель на разных подвыборках и отслеживают насыщение метрики.


1. Термин: Power analysis (анализ мощности) в контексте fine-tuning

Power analysis — это статистический метод, заимствованный из экспериментального дизайна, который позволяет определить минимальный размер выборки, необходимый для обнаружения эффекта заданной величины с заданной уверенностью. В контексте fine-tuning LLM мы адаптируем этот подход: вместо статистической мощности мы ищем точку насыщения (saturation) — объём данных, после которого добавление новых примеров перестаёт значимо улучшать целевую метрику (accuracy, F1, faithfulness и т.д.).

Зачем это нужно Синтетические данные стоят денег (вызовы LLM-генератора, валидация). Бесконечное наращивание объёма неэффективно. Power analysis помогает найти баланс между затратами и качеством.


2. Learning curve experiment (эксперимент с кривой обучения)

Кривая обучения — это график зависимости метрики качества (например, accuracy на валидации) от объёма обучающих данных. Для её построения:

  1. Генерируем большой пул синтетических данных (например, 100k примеров).
  2. Случайно выбираем подвыборки возрастающего размера: 1k, 5k, 10k, 50k, 100k.
  3. Для каждого размера обучаем модель (с одинаковыми гиперпараметрами) и замеряем метрику на фиксированном тестовом наборе.
  4. Строим график: ось X — объём данных, ось Y — метрика.

Пример графика (в текстовом виде):

Объём данныхAccuracy
1k0.72
5k0.81
10k0.85
50k0.87
100k0.88

Здесь насыщение наступает около 10k–50k: после 10k прирост менее 2 процентных пунктов.

Ключевой вывод если кривая выходит на плато, дальнейшее увеличение данных нецелесообразно.


3. Rule of thumb (эмпирические правила)

На основе практики сложились ориентиры:

Метод fine-tuningРекомендуемый объём синтетических данных
LoRA (Low-Rank Adaptation)500 – 2 000 примеров
QLoRA (Quantized LoRA)500 – 2 000 примеров
Full fine-tuning (все веса)10 000 – 50 000 примеров
Prefix tuning / Prompt tuning100 – 1 000 примеров

Почему LoRA требует меньше данных LoRA обновляет лишь небольшую часть параметров (ранг адаптеров), поэтому для хорошей аппроксимации нужно меньше примеров. Full fine-tuning меняет все веса — требуется больше данных, чтобы не переобучиться.

Важно правила приблизительны. Для сложных задач (юридические контракты, медицинские диагнозы) может понадобиться больше данных; для простых (классификация тональности) — меньше.


4. Diminishing returns (убывающая отдача)

Закон убывающей отдачи в fine-tuning проявляется в том, что каждый следующий блок данных даёт всё меньший прирост качества. Эмпирическое наблюдение:

  • 10k примеров → 90% от максимально достижимого качества (при 100k).
  • 50k примеров → 95–97%.
  • 100k примеров → 98–99%.

Математическая модель часто аппроксимируется степенным законом (power law):
метрика = a - b * (объём)^(-c), где c — показатель скорости насыщения. Чем больше c, тем быстрее насыщение.

Практическое следствие если ваша метрика после 10k выросла с 0.85 до 0.87, а на генерацию ещё 40k нужно потратить $2000, то, возможно, дешевле улучшить качество данных или архитектуру, чем наращивать объём.


5. Факторы, влияющие на необходимое количество данных

ФакторВлияние
Сложность задачиЧем сложнее (многошаговые рассуждения, редкие паттерны), тем больше данных нужно.
Размер моделиБольшие модели (70B) требуют больше данных для full fine-tuning, чем маленькие (7B).
Качество синтетических данныхЕсли данные шумные или нерепрезентативные, кривая обучения будет пологой — нужно больше примеров.
Разнообразие (diversity)Однотипные примеры быстро насыщают; разнообразие отодвигает точку насыщения.
Метод fine-tuningLoRA насыщается раньше full fine-tuning.
Базовые способности моделиЕсли модель уже хорошо знает домен (например, CodeLlama для кода), нужно меньше данных.

6. Методология power analysis: пошаговый план

  1. Определите целевую метрику (accuracy, F1, BLEU, faithfulness и т.д.).
  2. Сгенерируйте большой пул синтетических данных (например, 100k примеров). Убедитесь в их качестве (валидация человеком или автоматическими проверками).
  3. Разделите данные на обучающую и тестовую выборки (например, 80/20). Тестовая выборка фиксирована для всех экспериментов.
  4. Выберите размеры подвыборок (например, 500, 1k, 2k, 5k, 10k, 20k, 50k, 100k). Для каждого размера сделайте 3 запуска с разными seed для оценки дисперсии.
  5. Обучите модель на каждой подвыборке с одинаковыми гиперпараметрами (learning rate, batch size, число эпох). Используйте early stopping на валидации.
  6. Замерьте метрику на тестовой выборке.
  7. Постройте кривую обучения (среднее ± std). Определите точку, после которой прирост < 1% (или другого порога).
  8. Примите решение используйте объём, соответствующий началу плато.

7. Инструменты и библиотеки

  • Hugging Face Transformers + Datasets — для загрузки модели и данных.
  • Weights & Biases (wandb) — для логирования кривых обучения.
  • Scikit-learn — для разбивки на подвыборки и расчёта метрик.
  • Ray Tune / Optuna — для автоматизации экспериментов с разными объёмами.
  • LangChain / LlamaIndex — для генерации синтетических данных (если нужно).

8. Пример кода на Python (схематичный)

import numpy as np
from transformers import AutoModelForCausalLM, AutoTokenizer, Trainer, TrainingArguments
from datasets import Dataset, load_dataset

# Загрузка модели и токенизатора
model_name = "microsoft/phi-2"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)

# Загрузка синтетического датасета (100k примеров)
full_dataset = load_dataset("json", data_files="synthetic_data.jsonl")["train"]

# Фиксированный тестовый набор (20%)
test_dataset = full_dataset.select(range(20000))
train_pool = full_dataset.select(range(20000, 100000))

# Размеры подвыборок
sample_sizes = [500, 1000, 2000, 5000, 10000, 20000, 50000, 80000]
results = []

for size in sample_sizes:
    # Случайная подвыборка
    indices = np.random.choice(len(train_pool), size, replace=False)
    train_subset = train_pool.select(indices)
    
    # Обучение (упрощённо)
    training_args = TrainingArguments(
        output_dir=f"./checkpoints_{size}",
        num_train_epochs=3,
        per_device_train_batch_size=4,
        evaluation_strategy="steps",
        eval_steps=100,
        logging_dir=f"./logs_{size}",
    )
    trainer = Trainer(
        model=model,
        args=training_args,
        train_dataset=train_subset,
        eval_dataset=test_dataset,
        tokenizer=tokenizer,
    )
    trainer.train()
    
    # Оценка
    eval_results = trainer.evaluate()
    results.append({"size": size, "accuracy": eval_results["eval_accuracy"]})

# Построение кривой обучения
import matplotlib.pyplot as plt
sizes = [r["size"] for r in results]
accs = [r["accuracy"] for r in results]
plt.plot(sizes, accs, marker='o')
plt.xscale('log')
plt.xlabel('Number of training examples')
plt.ylabel('Accuracy')
plt.title('Learning Curve')
plt.show()

Примечание код упрощён; в реальности нужно учитывать LoRA, заморозку весов, токенизацию и т.д.


9. Оценка качества синтетических данных

Power analysis бессмысленна, если данные плохие. Перед экспериментом проверьте:

  • Репрезентативность — данные должны покрывать реальные сценарии использования.
  • Отсутствие галлюцинаций — факты в синтетических примерах должны быть верны.
  • Разнообразие формулировок — избегайте шаблонности.
  • Согласованность с целевой задачей — если fine-tuning для RAG, данные должны содержать контекст и ответ.

Методы валидации: ручная выборка (100–200 примеров), автоматические проверки (например, LLM-as-judge), сравнение распределений с реальными данными.


10. Связь с Agentic RAG

В контексте Agentic RAG fine-tuning часто применяется для:

  • Модели-планировщика (planner) — учить агента разбивать запрос на подзадачи.
  • Модели-выбора инструментов (tool selection) — классифицировать, какой инструмент (поиск, калькулятор, вызов API) использовать.
  • Модели-генератора ответов — улучшать стиль и точность.

Синтетические данные для таких агентов генерируются с помощью симуляции траекторий (например, ReAct-цепочки). Power analysis здесь особенно важна, потому что каждая траектория стоит дорого (много вызовов LLM). Насыщение может наступить быстрее из-за высокой структурированности задачи.


11. Пет-проект для закрепления

Задача Определить оптимальный объём синтетических данных для fine-tuning модели на задачу извлечения ответа из контекста (RAG-style).

Инструменты Python, Hugging Face Transformers, PEFT (LoRA), Weights & Biases, LangChain (для генерации данных).

Шаги:

  1. Сгенерируйте 50k синтетических примеров вида (вопрос, контекст, ответ) с помощью GPT-4 или другой LLM. Используйте шаблоны из вашего домена (например, техподдержка).
  2. Разделите на train (40k) и test (10k).
  3. Выберите небольшую модель (например, microsoft/phi-2 или TinyLlama).
  4. Настройте LoRA (rank=8, alpha=16).
  5. Проведите power analysis: обучите на подвыборках 200, 500, 1k, 2k, 5k, 10k, 20k, 40k.
  6. Для каждого размера замерьте ROUGE-L или F1 на тесте.
  7. Постройте кривую обучения и определите точку насыщения.
  8. Сравните с правилом thumb: совпало ли?

Ожидаемый результат Вы получите график, показывающий, что после 2k–5k примеров прирост качества минимален. Вы сможете обосновать, почему для вашей задачи достаточно, например, 3k примеров, и сэкономите ресурсы.


12. Связь с другими вопросами

ВопросТема
698Как генерировать синтетические данные для fine-tuning?
700Какие метрики использовать для оценки fine-tuning?
701Как избежать переобучения на синтетических данных?
695Что такое Agentic RAG и как он устроен?
697Как fine-tuning влияет на способность модели к обобщению?
710Как оценивать качество синтетических данных?

13. Навигация


Навигация