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

Как вы подбираете гиперпараметры для 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:

  1. Baseline: full fine-tuning (если возможно) или LoRA с параметрами по умолчанию (r=8, alpha=8, dropout=0.05, target_modules=q_proj,v_proj).
  2. Сетка по r и alpha: зафиксируйте dropout и target_modules, переберите r=[4,8,16,32] и alpha=[r/2, r, 2r]. Оцените метрику (accuracy, F1, perplexity).
  3. Оптимизация dropout: выберите лучшие r и alpha, переберите dropout=[0.0,0.05,0.1,0.2].
  4. Расширение target_modules: добавьте k_proj, o_proj, затем FFN, если нужно.
  5. Тонкая настройка: попробуйте 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-baser=8, alpha=8, dropout=0.1, target_modules=['query','value']
Инструктивный fine-tuning (Alpaca)LLaMA-7Br=16, alpha=32, dropout=0.05, target_modules=['q_proj','v_proj','k_proj','o_proj']
Генерация кода (CodeAlpaca)CodeLLaMA-7Br=32, alpha=64, dropout=0.1, target_modules=['q_proj','v_proj','k_proj','o_proj','gate_proj','up_proj','down_proj']
Перевод (WMT)NLLB-600Mr=8, alpha=16, dropout=0.05, target_modules=['q_proj','v_proj']

10. Мониторинг и логирование при подборе

Обязательно логируйте:

  • Train/val loss
  • Метрику задачи (accuracy, BLEU, ROUGE)
  • Использование GPU памяти
  • Время обучения

Инструменты: 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.

Шаги:

  1. Загрузите модель distilbert-base-uncased и датасет sst2.
  2. Определите сетку гиперпараметров: 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']].
  3. Для каждой комбинации обучите LoRA-адаптер на 2 эпохи, залогируйте accuracy на валидации.
  4. Выберите лучшую конфигурацию по accuracy.
  5. Сравните с 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 и какие методы существуют?

Навигация