Чем отличается 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 FT | 1.0x | 100% |
| 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
Шаги:
- Загрузить предобученный
bert-base-uncased. - Реализовать два варианта PEFT:
- LoRA: ранг r=8, применён к
queryиvalueво всех слоях. - Adapter: bottleneck=64, вставлен после каждого attention и FFN.
- LoRA: ранг r=8, применён к
- Обучить оба варианта на 10% данных (для скорости) с одинаковым learning rate.
- Замерить:
- Сравнить результаты.
Ожидаемый результат:
- LoRA покажет сопоставимую точность с Adapter при меньшем числе параметров.
- Latency LoRA после слияния будет равна latency базовой модели; Adapter — на 10–20% выше.
- Вывод: LoRA предпочтительнее для продакшена, где важна скорость; Adapter может быть полезен, если нужно модифицировать нелинейные части архитектуры.
Связь с другими вопросами
Навигация
- Предыдущий: 953
- Следующий: 955
- Индекс: 00. Индекс разборов