Для чего используется LoRA (Low-Rank Adaptation) в глубоком обучении?

«Для чего используется LoRA (Low-Rank Adaptation) в глубоком обучении?» — вопрос из категории Нейронные сети и Deep Learning, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Зачем это нужно:

  • Резкое снижение вычислительных затрат и потребления памяти. Можно дообучать большие LLM (например, LLaMA 7B) на одном GPU с 24 ГБ памяти.
  • Возможность быстрого переключения задач. Обученные адаптеры для разных доменов (медицина, код, юридические тексты) весят несколько мегабайт и подгружаются поверх замороженной базовой модели.
  • Снижение риска катастрофического забывания. Так как основные веса заморожены, модель не забывает свои исходные знания.

Техническая суть: Для весового слоя W (размерности d x k) LoRA представляет его обновление как произведение двух низкоранговых матриц: ΔW = B * A, где B (d x r), A (r x k), и ранг r << min(d, k). В прямом проходе используется h = Wx + ΔWx = Wx + BAx.

Пример дообучения модели для генерации кода с использованием библиотеки PEFT:

from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model, TaskType
import torch

# Загрузка базовой модели (например, CodeGen)
model_name = "Salesforce/codegen-350M-mono"
tokenizer = AutoTokenizer.from_pretrained(model_name)
base_model = AutoModelForCausalLM.from_pretrained(model_name, load_in_8bit=True, device_map='auto')  # Используем 8-битную квантизацию

# Конфигурация LoRA
lora_config = LoraConfig(
    task_type=TaskType.CAUSAL_LM,
    r=8,                 # Ранг адаптеров
    lora_alpha=32,       # Коэффициент масштабирования
    lora_dropout=0.1,
    target_modules=["q_proj", "v_proj"],  # К каким слоям attention добавлять адаптеры
    bias="none",
)

# Обертывание модели
model = get_peft_model(base_model, lora_config)
model.print_trainable_parameters()  # Выведет: trainable params: 8,388,608 || all params: 350,000,000 || 0.24%

# Далее следует стандартный цикл обучения.
# Будет обновляться менее 1% параметров!

Итог: LoRA — это стандартный де-факто метод для адаптации LLM под конкретные задачи или домены с ограниченными ресурсами, широко используемый в индустрии и research.