Aivaro
  • Оглавление
  • Вопросы
  • Практика
  • Вики
  • Материалы сообщества
  • Тесты
  • Поиск
✈Telegram @ai_varo
RUEN中文
…
Оглавление/Вопросы/#954

Чем отличается LoRA от Adapter-слоев (Houlsby et al.)?

Краткий тезис

LoRA и Adapter-слои (Houlsby et al.) — два подхода PEFT, которые решают задачу дообучения больших моделей с минимальным числом обучаемых параметров. Основное различие лежит в архитектурной вставке: Adapter добавляет последовательные bottleneck-слои между FFN и attention, а LoRA вносит низкоранговые аппроксимации непосредственно в матрицы весов. Это приводит к разным профилям задержки (latency) и возможности слияния с исходными весами.

2. LoRA: изменение матриц весов

LoRA (Low-Rank Adaptation, Hu et al., 2021) работает иначе: вместо вставки новых слоёв он аппроксимирует обновление весов ΔW как произведение двух низкоранговых матриц A и B.

  • Математика: W' = W + ΔW, где ΔW = B * A, B ∈ R^{d_out × r}, A ∈ R^{r × d_in}, ранг r << min(d_in, d_out).
  • Применение: обычно к матрицам W_q, W_k, W_v, W_o в attention и иногда к W_fc1, W_fc2 в FFN.
  • Обучаемые параметры: только A и B (инициализируются нулями или случайно). Обучается ~0.1–1% параметров.

Пример кода (упрощённо):

class LoRALinear(nn.Module):
    def __init__(self, original_linear, r=8, alpha=16):
        super().__init__()
        self.linear = original_linear  # заморожен
        self.lora_A = nn.Parameter(torch.randn(r, original_linear.in_features))
        self.lora_B = nn.Parameter(torch.zeros(original_linear.out_features, r))
        self.scaling = alpha / r
    
    def forward(self, x):
        base = self.linear(x)
        lora = (x @ self.lora_A.T) @ self.lora_B.T * self.scaling
        return base + lora

Ключевая особенность: LoRA не добавляет новых слоёв, а модифицирует существующие веса через низкоранговое обновление. При инференсе можно объединить ΔW с исходными весами, устранив дополнительную задержку.


3. Adapter: добавляет latency из-за последовательных слоёв

Поскольку Adapter-слои вставляются последовательно, каждый токен на инференсе проходит через дополнительный bottleneck. Это приводит к:

  • Увеличению времени инференса: на 5–30% в зависимости от размера bottleneck и количества адаптеров.
  • Невозможности слияния: Adapter нельзя "влить" в исходные веса, так как он содержит нелинейность и отдельную архитектуру.
  • Росту памяти: хотя параметров мало, активации адаптеров требуют дополнительной памяти при batch-инференсе.

Измерения (ориентировочно):

МетодLatency (отн.)Параметры
Full FT1.0x100%
Adapter (bottleneck=64)1.15–1.25x~2%
LoRA (r=8)1.0x (после слияния)~0.5%

4. LoRA: можно объединить с весами без оверхэда

LoRA позволяет после дообучения вычислить ΔW = B * A и добавить его к исходной матрице W:

# После обучения
merged_weight = original_weight + (lora_B @ lora_A) * scaling
# Далее используем только merged_weight, LoRA-ветка удаляется

Это даёт:

  • Нулевой оверхэд на инференсе: модель работает с той же скоростью, что и исходная.
  • Гибкость развёртывания: можно хранить базовую модель + несколько LoRA-адаптеров (для разных задач) и динамически подменять ΔW без перезагрузки.
  • Возможность комбинирования: несколько LoRA-адаптеров можно усреднять или суммировать (например, для мультизадачности).

Ограничение: LoRA эффективен только для линейных слоёв; для нелинейных преобразований (например, LayerNorm) он не применим напрямую.


5. Пет-проект для закрепления

Задача: Сравнить LoRA и Adapter на задаче классификации тональности отзывов (модель BERT-base). Измерить точность, число параметров и latency.

Инструменты:

  • Python, PyTorch, Hugging Face Transformers
  • Библиотеки: peft (для LoRA), adapter-transformers (для Adapter)
  • Датасет: IMDB или SST-2

Шаги:

  1. Загрузить предобученный bert-base-uncased.
  2. Реализовать два варианта PEFT:
    • LoRA: ранг r=8, применён к query и value во всех слоях.
    • Adapter: bottleneck=64, вставлен после каждого attention и FFN.
  3. Обучить оба варианта на 10% данных (для скорости) с одинаковым learning rate.
  4. Замерить:
    • Число обучаемых параметров.
    • Время одного forward pass (latency) до и после слияния LoRA.
    • Accuracy на тестовой выборке.
  5. Сравнить результаты.

Ожидаемый результат:

  • LoRA покажет сопоставимую точность с Adapter при меньшем числе параметров.
  • Latency LoRA после слияния будет равна latency базовой модели; Adapter — на 10–20% выше.
  • Вывод: LoRA предпочтительнее для продакшена, где важна скорость; Adapter может быть полезен, если нужно модифицировать нелинейные части архитектуры.

Связь с другими вопросами

ВопросТема
952. Какие бывают методы PEFTОбзор PEFT: LoRA, Adapter, Prefix Tuning, Prompt Tuning

Навигация

  • Предыдущий: 953
  • Следующий: 955
  • Индекс: 00. Индекс разборов