Sobes.tech
Назад к вопросам
Middle — Senior
12

Что такое LoRA и почему она работает (low-rank гипотеза)?

Компании, где спрашивали
НейроЛаб

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

LoRA — это способ дообучать большие модели, не изменяя все их веса, а добавляя небольшие обучаемые низкоранговые матрицы. Это сильно снижает требования к памяти, ускоряет обучение и упрощает хранение адаптаций для разных задач. Работает это потому, что для многих задач реальная “полезная” поправка к весам модели имеет низкую эффективную размерность.

Определение:

LoRA (Low-Rank Adaptation) — это метод параметр-эффективного fine-tuning, при котором исходные веса модели замораживаются, а вместо полного обновления матриц весов обучается их низкоранговая добавка.
Если в обычном fine-tuning обновляется вся матрица весов W, то в LoRA учатся две маленькие матрицы A и B, а итоговое изменение задаётся как ΔW = B @ A, где ранг этой аппроксимации значительно меньше размерности исходной матрицы.

Идея low-rank гипотезы в этом контексте такая: для адаптации к новой задаче не нужно менять все степени свободы модели, достаточно небольшой подпространственной поправки. Иными словами, оптимальное изменение весов часто лежит в низкоразмерной структуре.

Пример использования:

Допустим, есть большая языковая модель, и нужно адаптировать её под стиль поддержки клиентов компании. Полный fine-tuning дорог по памяти и времени, а LoRA позволяет обучить только небольшие адаптеры для слоёв внимания или MLP, сохранив базовую модель неизменной.

# Псевдокод: идея LoRA, а не конкретная библиотека
W_frozen = load_pretrained_weight()
A = init_small_matrix(rank=8, in_dim=W_frozen.in_dim)
B = init_small_matrix(out_dim=W_frozen.out_dim, rank=8)

def forward(x):
    # базовое преобразование
    base = x @ W_frozen
    # low-rank поправка
    delta = x @ (B @ A)
    return base + delta

При инференсе можно либо держать LoRA отдельно, либо “слить” ΔW в основной вес, если нужен один объединённый набор параметров.

Пояснение кода:

В этом примере код показывает принцип, а не точную реализацию из фреймворка.

  1. W_frozen — это исходный вес предобученной модели, который не обучается.
  2. A и B — маленькие обучаемые матрицы, размер которых определяется выбранным рангом r.
  3. x @ W_frozen — обычный проход через слой.
  4. x @ (B @ A) — добавка к выходу, которая и адаптирует модель под новую задачу.
  5. В процессе обучения меняются только A и B, а не вся большая матрица W.
  6. Так как r обычно маленький, число обучаемых параметров резко уменьшается.

Если говорить практично, это означает: можно дообучать большие модели на меньшем железе, быстрее экспериментировать и хранить много разных “надстроек” под разные задачи.

Ключевые моменты:

  • LoRA — это параметр-эффективный fine-tuning: база модели заморожена, обучается только низкоранговая добавка.
  • Экономия памяти и вычислений достигается за счёт того, что вместо полной матрицы учатся две маленькие.
  • Low-rank гипотеза: полезное изменение весов для новой задачи часто имеет низкую эффективную размерность.
  • LoRA удобно использовать для LLM, потому что можно иметь одну базовую модель и множество лёгких адаптеров.
  • Обычно LoRA проще хранить, распространять и комбинировать, чем полностью дообученные копии моделей.
  • Это не “магия”, а практическая аппроксимация: качество зависит от ранга, места вставки адаптеров и самой задачи.