Что такое P-tuning и Prefix Tuning? Как они отличаются от LoRA (обучаемые векторы на входе vs матрицы внутри слоев)?
Краткий тезис
Prefix Tuning и P‑tuning — это методы PEFT, которые не модифицируют веса исходной модели, а добавляют обучаемые непрерывные векторы (soft prompts) во входное пространство. Prefix Tuning вставляет виртуальные токены перед каждым слоем (или только перед первым), а P‑tuning внедряет обучаемые эмбеддинги на всех слоях. Главное отличие от LoRA в том, что LoRA добавляет низкоранговые адаптеры внутрь слоёв (матрицы весов), изменяя архитектуру, тогда как Prefix/P‑tuning работают только с входными представлениями, не затрагивая веса модели. Преимущество — ещё меньше параметров, но потенциально меньшая выразительная способность.
2. P‑tuning: обучаемые векторы на всех слоях
P‑tuning (Liu et al., 2022) развивает идею мягких промптов, но в отличие от Prefix Tuning, обучаемые векторы вставляются не только перед слоями, но и внутри них.
Основные варианты:
- P‑tuning v1: добавляет виртуальные токены во входной эмбеддинг (как hard prompt, но непрерывные).
- P‑tuning v2: вставляет обучаемые векторы на каждом слое transformer (похоже на Prefix Tuning, но с более гибким размещением — обычно только для ключей/значений).
Механизм:
Для каждого слоя l создаётся матрица P_l размера prefix_length × hidden_dim. Эти векторы добавляются к ключам и значениям (или только к ключам) в механизме внимания.
Таким образом, P‑tuning не просто расширяет вход, а модифицирует представления на каждом уровне абстракции.
Параметры: num_layers * 2 * prefix_length * hidden_dim (если отдельно для ключей и значений).
3. Отличие от LoRA: не меняют веса, только вход
| Характеристика | Prefix Tuning / P‑tuning | LoRA |
|---|---|---|
| Что обучается | Виртуальные токены (векторы) на входе/слоях | Низкоранговые матрицы A, B для каждого слоя |
| Куда вставляется | Внимание (конкатенация или сумма с hidden states) | Параллельно линейным слоям (обычно Q, V) |
| Изменение архитектуры модели | Нет, только расширение входных последовательностей | Да, добавляются адаптивные слои |
| Число параметров на слой | prefix_length * hidden_dim (обычно 0.1–1% от полной модели) | r * (hidden_in + hidden_out) (обычно 0.5–2%) |
| Влияние на инференс | Требуется пересчёт внимания с prefix (немного замедляет) | Mergeable: после обучения можно слить в исходные веса |
| Чувствительность к гиперпараметрам | Длина prefix и его расположение | Ранг r и какой модуль адаптировать |
Ключевое различие:
- Prefix/P‑tuning — это input‑level дообучение: мы учим, как лучше «подсказывать» модели через новые эмбеддинги.
- LoRA — weight‑level дообучение: мы учим новые веса, которые корректируют существующие линейные преобразования.
4. Меньше параметров, но может быть менее мощно
Преимущества Prefix/P‑tuning:
- Очень экономно по параметрам (иногда в 10 раз меньше, чем LoRA).
- Не требует модификации весов модели — легко использовать в закрытых API (можно хранить только soft prompts).
- Подходит для многозадачности (разные префиксы для разных задач).
Недостатки:
- Производительность (per‑task accuracy) часто ниже, чем у LoRA, особенно на сложных задачах (например, математика, кодинг).
- Склонность к переобучению при малом объёме данных.
- Сложность оптимизации (нужно правильно инициализировать префиксы).
Сравнительные эксперименты:
На бенчмарке GLUE с моделями RoBERTa:
- Полный fine‑tune: 88.5
- LoRA (r=8): 88.1
- Prefix Tuning (len=50): 87.4
- P‑tuning v2: 87.8
То есть разрыв до 1‑2 пунктов, но экономия памяти — до 90%.
Пет-проект для закрепления
Задача: Сравнить Prefix Tuning, P‑tuning и LoRA на задаче классификации тональности с использованием предобученного BERT из Hugging Face.
Инструменты:
- Python 3.10+, PyTorch, Transformers, PEFT библиотека (поддерживает LoRA и P‑tuning, но не Prefix‑tuning напрямую — нужно использовать
peft.LoraConfigилиpeft.PromptEncoderConfig). - Датасет: IMDB (50k отзывов).
Шаги:
- Загрузить BERT‑base (bert‑base‑uncased) и токенизатор.
- Заморозить все веса модели.
- Для LoRA:
LoraConfig(r=8, target_modules=["query", "value"]). - Для Prefix Tuning: самостоятельно реализовать класс
PrefixEncoder, который добавляет prefix‑векторы к hidden states первого слоя (или ко всем — если хочется). - Для P‑tuning: используйте
peft.PromptEncoderConfig(он реализует soft‑prompts на входном эмбеддинге — это v1; для v2 нужно писать кастомный код). - Обучить каждый метод на IMDB (1 эпоха, lr=1e‑4, batch=8).
- Сравнить точность и число обучаемых параметров.
Ожидаемый результат:
- LoRA: ~92‑93% accuracy, параметры ~0.5% от полной модели.
- Prefix Tuning: ~89‑91% accuracy, параметры ~0.1%.
- P‑tuning v1: ~90‑91% accuracy.
Вы наглядно увидите, что при меньшем числе параметров quality может снижаться, но экономия памяти значительна.
Связь с другими вопросами
Навигация
- Предыдущий: 955
- Следующий: 957
- Индекс: 00. Индекс разборов