English translation is not available yet. Showing Russian content.
Как вы подбираете гиперпараметры для LoRA?
Краткий тезис
LoRA (Low-Rank Adaptation) — эффективный метод fine-tuning, который вводит обучаемые низкоранговые матрицы в слои модели. Подбор гиперпараметров LoRA — это поиск баланса между качеством дообучения, объёмом памяти и скоростью. Ключевые параметры: ранг (r), масштабирование (alpha), dropout и целевые модули (target_modules). Практическое правило для LLaMA: r=16, alpha=32, dropout=0.1, target_modules = q_proj, v_proj, k_proj, o_proj. Однако оптимальные значения зависят от задачи, объёма данных и базовой модели.
1. Введение: что такое LoRA и зачем подбирать гиперпараметры
LoRA (Low-Rank Adaptation) — метод из семейства PEFT (Parameter-Efficient Fine-Tuning). Вместо обновления всех весов модели LoRA добавляет к выбранным слоям (обычно к проекциям внимания) пару низкоранговых матриц A и B. Обновление весов происходит как W' = W + BA, где B — матрица размера d × r, A — r × k, а r << min(d, k). Таким образом, число обучаемых параметров резко сокращается.
Гиперпараметры LoRA напрямую влияют на:
- Выразительную способность адаптера (насколько сильно он может изменить поведение модели);
- Потребление памяти (GPU RAM, размер checkpoint);
- Скорость обучения и инференса;
- Устойчивость к переобучению (особенно на маленьких датасетах).
Подбор гиперпараметров — это эмпирический процесс, который часто требует нескольких экспериментов.
2. Ранг (r) — компромисс между качеством и памятью
Ранг r определяет размерность низкорангового пространства, в котором происходит адаптация. Чем больше r, тем больше обучаемых параметров и тем выше потенциальная ёмкость адаптера.
| r | Число параметров (пример для LLaMA-7B, q_proj+v_proj) | Память (пример) | Качество |
|---|---|---|---|
| 4 | ~1.2M | ~5 MB | Низкое на сложных задачах |
| 8 | ~2.4M | ~10 MB | Хорошее для многих задач |
| 16 | ~4.8M | ~20 MB | Рекомендуемый старт |
| 32 | ~9.6M | ~40 MB | Высокое, но возможен оверфит |
| 64 | ~19.2M | ~80 MB | Избыточно для большинства сценариев |
Практические рекомендации
- Начинайте с r=8 или r=16.
- Если задача сложная (например, генерация кода или следование сложным инструкциям) и данных много, попробуйте r=32.
- Если данных мало (сотни примеров) или базовая модель уже хорошо справляется, r=4 может быть достаточно.
- Увеличение r выше 32 редко даёт прирост качества, но заметно увеличивает память.
Экспериментальный подход проведите grid search по r = [4, 8, 16, 32] на небольшом валидационном наборе и выберите минимальное r, дающее приемлемое качество.
3. Alpha (масштабирование) — баланс между LoRA и предобученными весами
Alpha (α) — коэффициент масштабирования, который умножает обновление от LoRA перед сложением с исходными весами. Формально: W' = W + (α / r) * BA. Множитель α / r контролирует, насколько сильно адаптер влияет на выход слоя.
| α / r | Эффект |
|---|---|
| < 1 | Ослабление влияния LoRA (консервативная адаптация) |
| = 1 | Нейтральное масштабирование (часто используется по умолчанию) |
| > 1 | Усиление влияния LoRA (агрессивная адаптация) |
Рекомендации
- Обычно α выбирают равным r или 2r.
- Если α слишком мала, адаптер может не успевать обучаться.
- Если α слишком велика, градиенты могут стать нестабильными, и модель может «забыть» предобученные знания.
- Для задач с большим объёмом данных (например, инструктивный fine-tuning на 10k+ примеров) можно увеличить α до 2r или даже 4r.
Практический совет фиксируйте r и варьируйте α в диапазоне [r/2, r, 2r, 4r]. Оценивайте loss на валидации.
4. Dropout — регуляризация и предотвращение переобучения
Dropout в LoRA применяется к выходу матрицы A (или к самому адаптеру). Он случайно обнуляет часть нейронов во время обучения, что снижает переобучение.
| Dropout | Когда использовать |
|---|---|
| 0.0 | Данных много (>100k), модель большая |
| 0.05 | Стандартный старт для большинства задач |
| 0.1 | Данных мало (<10k) или задача склонна к оверфиту |
| 0.2 | Очень маленький датасет (<1k) |
Важно dropout замедляет сходимость, но улучшает обобщение. Если вы замечаете, что train loss падает, а val loss растёт — увеличьте dropout.
Эксперимент попробуйте dropout = [0.0, 0.05, 0.1, 0.2] и выберите лучший по val loss.
5. Target modules — выбор слоёв для адаптеров
Target modules — это имена слоёв (обычно линейных проекций в механизме внимания), к которым добавляются LoRA-адаптеры. Выбор модулей влияет на то, какие части модели будут адаптироваться.
| Модули | Эффект |
|---|---|
q_proj, v_proj | Классический выбор для многих задач (баланс качества и памяти) |
q_proj, v_proj, k_proj, o_proj | Все проекции внимания — лучшее качество, больше параметров |
| Все линейные слои (включая FFN) | Максимальная ёмкость, но близко к full fine-tuning по памяти |
Только q_proj | Минимальное вмешательство, быстро, но качество может страдать |
Практические рекомендации
- Для моделей семейства LLaMA (и других decoder-only) стандарт:
q_proj, v_proj, k_proj, o_proj. - Для encoder-only (BERT) часто добавляют
query, value, key. - Если память критична, начните с
q_proj, v_proj. - Если качество неудовлетворительное, расширьте до всех проекций внимания, затем до FFN.
Эксперимент сравните конфигурации [q_proj, v_proj] и [q_proj, v_proj, k_proj, o_proj] на валидации.
6. Дополнительные параметры: bias, use_rslora, init_lora_weights
Помимо основных, в библиотеке PEFT есть несколько важных параметров:
- bias: может быть
'none','all'или'lora_only'. Обучать bias-веса вместе с LoRA — увеличивает параметры, но иногда улучшает качество. По умолчанию'none'. - use_rslora: включает Rank-Stabilized LoRA, где масштабирование
α / sqrt(r)вместоα / r. Помогает при больших r. Экспериментально. - init_lora_weights: способ инициализации.
'gaussian'(по умолчанию) — матрица A инициализируется нормальным распределением, B — нулями.'loftq'— инициализация на основе данных (LOFTQ), может ускорить сходимость.
Эти параметры стоит пробовать, если базовые настройки не дают желаемого результата.
7. Стратегия подбора: от простого к сложному
Рекомендуемый процесс подбора гиперпараметров LoRA:
- Baseline: full fine-tuning (если возможно) или LoRA с параметрами по умолчанию (r=8, alpha=8, dropout=0.05, target_modules=q_proj,v_proj).
- Сетка по r и alpha: зафиксируйте dropout и target_modules, переберите r=[4,8,16,32] и alpha=[r/2, r, 2r]. Оцените метрику (accuracy, F1, perplexity).
- Оптимизация dropout: выберите лучшие r и alpha, переберите dropout=[0.0,0.05,0.1,0.2].
- Расширение target_modules: добавьте k_proj, o_proj, затем FFN, если нужно.
- Тонкая настройка: попробуйте bias='lora_only', use_rslora=True, init_lora_weights='loftq'.
Для ускорения используйте Weights & Biases или TensorBoard для логирования.
8. Влияние на производительность: память, скорость, качество
| Параметр | Память | Скорость обучения | Качество |
|---|---|---|---|
| Увеличение r | ↑ | ↓ (больше параметров) | ↑ (до предела) |
| Увеличение alpha | — | — | ↑ (до стабильности) |
| Увеличение dropout | — | — | ↑ (регуляризация) |
| Добавление target_modules | ↑ | ↓ | ↑ |
Примерные цифры для LLaMA-7B (batch_size=4, seq_len=512):
| Конфигурация | Параметры | Память (train) | Время эпохи (1 GPU A100) |
|---|---|---|---|
| r=8, q,v | ~2.4M | ~14 GB | ~15 мин |
| r=16, q,v,k,o | ~9.6M | ~16 GB | ~18 мин |
| r=32, все слои | ~40M | ~24 GB | ~30 мин |
9. Примеры конфигураций для разных задач
| Задача | Модель | Рекомендуемые параметры |
|---|---|---|
| Классификация текстов (IMDb) | BERT-base | r=8, alpha=8, dropout=0.1, target_modules=['query','value'] |
| Инструктивный fine-tuning (Alpaca) | LLaMA-7B | r=16, alpha=32, dropout=0.05, target_modules=['q_proj','v_proj','k_proj','o_proj'] |
| Генерация кода (CodeAlpaca) | CodeLLaMA-7B | r=32, alpha=64, dropout=0.1, target_modules=['q_proj','v_proj','k_proj','o_proj','gate_proj','up_proj','down_proj'] |
| Перевод (WMT) | NLLB-600M | r=8, alpha=16, dropout=0.05, target_modules=['q_proj','v_proj'] |
10. Мониторинг и логирование при подборе
Обязательно логируйте:
Инструменты: WandB, MLflow, TensorBoard.
Пример кода для логирования с PEFT + Transformers:
from peft import LoraConfig, get_peft_model
from transformers import AutoModelForCausalLM, TrainingArguments, Trainer
import wandb
wandb.init(project="lora-hp-search")
lora_config = LoraConfig(
r=16,
lora_alpha=32,
target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],
lora_dropout=0.1,
bias="none",
task_type="CAUSAL_LM"
)
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")
model = get_peft_model(model, lora_config)
training_args = TrainingArguments(
output_dir="./lora-llama",
per_device_train_batch_size=4,
num_train_epochs=3,
logging_steps=10,
report_to="wandb"
)
trainer = Trainer(model=model, args=training_args, train_dataset=train_dataset)
trainer.train()
11. Типичные ошибки и как их избежать
| Ошибка | Последствие | Решение |
|---|---|---|
| Слишком большой r при малом датасете | Переобучение | Уменьшить r, увеличить dropout |
| alpha >> r | Нестабильное обучение, loss расходится | Уменьшить alpha до r или 2r |
| Забыли добавить dropout | Переобучение | Добавить dropout=0.05-0.1 |
| Выбрали только q_proj для сложной задачи | Низкое качество | Добавить v_proj, k_proj, o_proj |
| Не логируете эксперименты | Невозможно сравнить конфигурации | Использовать WandB или MLflow |
12. Связь с другими аспектами fine-tuning
LoRA — лишь один из методов PEFT. Гиперпараметры LoRA взаимосвязаны с выбором learning rate, scheduler, batch size и числом эпох. Например, при увеличении r может потребоваться уменьшить learning rate. Также стоит учитывать, что LoRA часто комбинируют с QLoRA (квантование базовой модели), что накладывает ограничения на выбор target_modules.
Пет-проект для закрепления
Задача Подобрать оптимальные гиперпараметры LoRA для дообучения DistilBERT на задаче анализа тональности (датасет SST-2).
Инструменты Python, Hugging Face Transformers, PEFT, Datasets, Weights & Biases.
Шаги:
- Загрузите модель
distilbert-base-uncasedи датасетsst2. - Определите сетку гиперпараметров: r=[4,8,16], alpha=[r/2, r, 2r], dropout=[0.0,0.1], target_modules=[['q_lin','v_lin'], ['q_lin','v_lin','k_lin','out_lin']].
- Для каждой комбинации обучите LoRA-адаптер на 2 эпохи, залогируйте accuracy на валидации.
- Выберите лучшую конфигурацию по accuracy.
- Сравните с full fine-tuning (2 эпохи) по качеству и памяти.
Ожидаемый результат Таблица с результатами, показывающая, что LoRA с r=8, alpha=8, dropout=0.1, target_modules=['q_lin','v_lin'] достигает 90% accuracy full fine-tuning при использовании в 10 раз меньше памяти.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 21 | Что такое LoRA и как она работает? |
| 22 | Как работает LoRA? (механизм) |
| 24 | Как вы сравниваете LoRA и full fine-tuning? |
| 25 | Что такое QLoRA и когда его использовать? |
| 26 | Как вы выбираете learning rate для fine-tuning? |
| 27 | Что такое PEFT и какие методы существуют? |
Навигация
- Предыдущий: 22
- Следующий: 24
- Индекс: 00. Индекс разборов