Сколько эпох достаточно для LoRA fine-tuning?
Краткий тезис
Количество эпох для LoRA fine-tuning не фиксировано и зависит от объёма датасета, сложности задачи, learning rate и ранга LoRA. Эмпирическое правило: 1–3 эпохи для среднего датасета (500–10 000 примеров), 2–4 эпохи для маленького (< 500), 1 эпоха для большого (> 10 000). Ключевой приём — следить за валидационной метрикой и останавливаться, когда loss перестаёт падать или начинает расти (переобучение).
1. Термин: LoRA (Low-Rank Adaptation)
LoRA — это техника параметр-эффективного fine-tuning (PEFT). Вместо обновления всех весов предобученной модели в неё добавляют маленькие обучаемые матрицы низкого ранга, а исходные веса замораживают.
- Зачем существенно сокращает число обучаемых параметров (в 100–10 000 раз), снижает потребление памяти и ускоряет обучение.
- Ранг LoRA (
r) — гиперпараметр, определяющий размер добавленных матриц. Типичные значения: 8, 16, 32, 64. - Адаптер LoRA — совокупность этих матриц; после обучения его можно сохранить отдельно (несколько мегабайт) и подгружать к базовой модели.
Поскольку LoRA обновляет лишь малую часть параметров, переобучение наступает не так быстро, как при полном fine-tuning, но риск всё же есть.
2. Факторы, влияющие на необходимое число эпох
| Фактор | Влияние на число эпох |
|---|---|
| Размер датасета | Чем меньше данных, тем больше эпох нужно, чтобы модель «увидела» примеры несколько раз. |
| Сложность задачи | Для простой классификации достаточно 1–2 эпох; для генерации ответов или перевода может потребоваться 3–5. |
| Learning rate (LR) | Высокий LR (например, 5e-4) позволяет быстрее сходиться, но может привести к переобучению за меньшее число эпох; низкий LR (1e-5) требует больше эпох. |
| Ранг LoRA | Более высокий ранг (r = 64) даёт больше обучаемых параметров → выше риск переобучения → часто достаточно 1–2 эпох. Низкий ранг (r = 8) медленнее учится, может потребоваться 3–4 эпохи. |
| Температура dropout в LoRA | Если включён dropout (обычно 0.1), он немного регуляризует, позволяя увеличить число эпох без переобучения. |
| Степень отличия новой задачи от предобучения | Если задача близка к предобученной (например, дообучение GPT на технической документации), хватает 1 эпохи. Если задача новая (свой домен), нужно 3–4. |
3. Эвристики по числу эпох в зависимости от размера датасета
3.1 Датасет < 500 примеров
- Рекомендация 2–4 эпохи.
- Риск переобучение высоко (модель может запомнить примеры).
- Что делать обязательно использовать валидационную выборку (20–30%), early stopping. Если переобучение видно уже на 2‑й эпохе — остановиться раньше.
3.2 Датасет 500–10 000 примеров
- Рекомендация 1–3 эпохи.
- Пояснение средний объём; обычно 3 эпохи — хорошая отправная точка. Часто оптимальная эпоха — 2‑я или 3‑я.
3.3 Датасет > 10 000 примеров
- Рекомендация 1 эпоха, редко 2.
- Причина данные разнообразны, модель с высокой вероятностью увидит все паттерны за один проход. Вторая эпоха часто лишь увеличивает вычислительные затраты без прироста качества или даже ведёт к переобучению.
4. Как отслеживать, достаточно ли эпох?
4.1 Валидационная метрика
Основной инструмент — validation loss (или accuracy, F1, BLEU — в зависимости от задачи).
Правило: «Train until validation loss stops decreasing».
- Кривая обучения
4.2 Early Stopping
Автоматический механизм:
- Задаём
patience(например, 2–3 эпохи) — если validation loss не улучшился за это число шагов, обучение прерывается. - В библиотеках (HuggingFace Transformers) это реализуется через
EarlyStoppingCallback.
4.3 Learning rate scheduling
- Linear schedule with warmup — типичный выбор для LoRA. Обычно learning rate линейно растёт первые 10% шагов, затем падает до нуля.
- При коротком числе эпох (1–2) лучше использовать более низкий LR и без scheduler (или только warmup).
4.4 Сохранение лучшей модели
Не забирать модель последней эпохи, а сохранять чекпоинт с лучшей валидационной метрикой (например, save_total_limit=2, load_best_model_at_end=True).
5. Пример конфигурации LoRA fine-tuning в коде (HuggingFace + PEFT)
from transformers import AutoModelForCausalLM, TrainingArguments, Trainer
from peft import LoraConfig, get_peft_model
import torch
model_name = "microsoft/phi-2"
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.bfloat16)
lora_config = LoraConfig(
r=16, # ранг
lora_alpha=32, # масштабирующий коэффициент
target_modules=["q_proj", "v_proj"], # модули для адаптеров
lora_dropout=0.1,
bias="none",
task_type="CAUSAL_LM"
)
model = get_peft_model(model, lora_config)
training_args = TrainingArguments(
output_dir="./phi2-lora-qa",
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
learning_rate=2e-4,
num_train_epochs=3, # ← здесь ставим эпохи
logging_steps=50,
evaluation_strategy="epoch", # проверяем валидацию каждую эпоху
save_strategy="epoch",
load_best_model_at_end=True,
metric_for_best_model="eval_loss",
greater_is_better=False,
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=eval_dataset,
callbacks=[EarlyStoppingCallback(early_stopping_patience=2)],
)
trainer.train()
Здесь мы явно просим 3 эпохи, но благодаря EarlyStopping обучение может завершиться раньше.
6. Что если данные очень малы (< 100 примеров)?
Для таких объёмов даже LoRA может переобучиться. Дополнительные приёмы:
- Увеличить dropout в LoRA (0.2–0.3).
- Сильно занизить ранг (r = 2–4).
- Использовать репетицию прошлых знаний — смешивать небольшой датасет с примерами из предобучающего распределения (replay buffer).
- Применить аугментацию данных (синонимы, back‑translation).
- Увеличить число эпох до 10–20, но добавить aggressive early stopping и очень низкий LR (1e-5). Тем не менее это редко даёт выигрыш.
7. Особенности LoRA по сравнению с полным fine-tuning
| Характеристика | Полный fine-tuning | LoRA |
|---|---|---|
| Число обучаемых параметров | 100% | 0.01–1% |
| Память (градиенты/оптимизатор) | ~4× размер модели | ~1.2–1.5× размер модели |
| Скорость на эпоху | медленнее | быстрее в 2–3 раза |
| Риск переобучения | выше | ниже (меньше параметров) |
| Число эпох до переобучения | часто 1–2 | может быть 3–5 |
Из-за меньшего числа параметров LoRA может «выдержать» больше эпох, прежде чем начать переобучаться. Это даёт больше возможностей для подбора LR.
8. Практические советы для собеседования
- «Я обычно начинаю с 3 эпох, смотрю на validation loss после каждой эпохи и применяю early stopping с patience=2».
- «Если датасет меньше 500 примеров, я поднимаю число эпох до 4, но включаю сильную регуляризацию (dropout=0.2).»
- «Для больших датасетов (>10k) я делаю 1 эпоху — этого хватает, и экономлю compute.»
- «Не забываю про learning rate: для LoRA типичный диапазон 1e-5 – 5e-4; низкий LR требует больше эпох, высокий — меньше.»
9. Пет-проект для закрепления
Задача Определить оптимальное число эпох для LoRA на задаче классификации отзывов (SST-2 или собственный маленький датасет).
Инструменты HuggingFace Transformers, PEFT, Datasets, Weights & Biases (для логирования).
Шаги:
- Взять модель BERT-base и применить LoRA (r=8, target_modules=['query', 'value']).
- Сгенерировать синтетический датасет из 800 примеров (500 train / 150 val / 150 test).
- Провести эксперименты с числом эпох: 1, 2, 3, 4, 5.
- Для каждого запуска зафиксировать: validation loss, accuracy на test, время обучения.
- Использовать одинаковый LR (2e-4) и batch (16).
- Построить график зависимости метрик от эпох.
Ожидаемый результат
- На 1–2 эпохах может быть недобуч (high loss).
- Начиная с 3 эпох loss стабилизируется.
- На 4‑й эпохе может появиться признак переобучения (val loss растёт).
- Гипотеза подтверждается: 3 эпохи — оптимум для данного датасета.
10. Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 38 | Как настроить LoRA (ранг, alpha, target modules)? |
| 40 | Что такое QLoRA и как он влияет на ресурсы? |
| 36 | Какие слои лучше заморозить при fine-tuning? |
| 41 | Как выбор датасета влияет на качество LoRA? |
| 35 | Чем отличается fine-tuning от промпт-инжиниринга? |
11. Навигация
- Предыдущий: 38
- Следующий: 40
- Индекс: 00. Индекс разборов
Навигация
- Предыдущий: 38
- Следующий: 40
- Индекс: 00. Индекс разборов