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

Что такое 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‑tuningLoRA
Что обучаетсяВиртуальные токены (векторы) на входе/слояхНизкоранговые матрицы 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 отзывов).

Шаги:

  1. Загрузить BERT‑base (bert‑base‑uncased) и токенизатор.
  2. Заморозить все веса модели.
  3. Для LoRA: LoraConfig(r=8, target_modules=["query", "value"]).
  4. Для Prefix Tuning: самостоятельно реализовать класс PrefixEncoder, который добавляет prefix‑векторы к hidden states первого слоя (или ко всем — если хочется).
  5. Для P‑tuning: используйте peft.PromptEncoderConfig (он реализует soft‑prompts на входном эмбеддинге — это v1; для v2 нужно писать кастомный код).
  6. Обучить каждый метод на IMDB (1 эпоха, lr=1e‑4, batch=8).
  7. Сравнить точность и число обучаемых параметров.

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

  • LoRA: ~92‑93% accuracy, параметры ~0.5% от полной модели.
  • Prefix Tuning: ~89‑91% accuracy, параметры ~0.1%.
  • P‑tuning v1: ~90‑91% accuracy.

Вы наглядно увидите, что при меньшем числе параметров quality может снижаться, но экономия памяти значительна.


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

ВопросТема
952LoRA: низкоранговые адаптеры
——

Навигация

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