Содержание курса 25 / 37

25 / 37 · Адаптация и эффективные модели

Параметрически эффективное дообучение

Заморозить предобученные веса и обучать небольшой набор новых параметров в правильном месте: адаптеры между слоями, поправку низкого ранга к матрицам весов в LoRA или выученный промпт. На той же задаче тональности LoRA не уступает полному дообучению, обучая 0.24% параметров; настройка промпта уступает, и заметка объясняет почему.

На этой странице 12

Полное дообучение в предыдущей заметке дало 0.890 на SST-2 и заплатило за это градиентами и состояниями оптимизатора для всех 124 млн параметров и полной копией модели на каждую задачу. Линейное зондирование не заплатило почти ничего и дало 0.737. Вопрос в том, можно ли обучать немного параметров и всё же получить число полного дообучения. Можно, и главный метод опирается на одно наблюдение о том, что на самом деле меняет дообучение.

Обозначения. Предобученная матрица весов W∈Rdout×dinW \in \mathbb R^{d_{\text{out}} \times d_{\text{in}}} (заморожена); её дообученная версия W+ΔWW + \Delta W; вход слоя xx и выход hh. rr — ранг; σ\sigma — сигмоида.

Отправная точка: всё или ничего#

Пока есть два режима. Обучать всё (ΔW\Delta W свободна, doutdind_{\text{out}} d_{\text{in}} параметров на матрицу, сотни матриц) или обучать только выходной слой (ΔW=0\Delta W = 0 везде). Первое дорого, второе недообучается. Методы ниже лежат между ними: они ограничивают форму ΔW\Delta W или добавляют небольшой модуль, параметры которого — единственные обучаемые.

Рисунок

Где каждый метод PEFT добавляет обучаемые параметры

Места параметров адаптеров, LoRA и настройки промптаСнизу вверх: токены входа, эмбеддинги с приписанными слева виртуальными токенами настройки промпта, внимание с ветвью LoRA справа, адаптер, полносвязный блок, второй адаптер, выход к следующему блоку. Эмбеддинги, внимание и полносвязный блок заморожены; виртуальные токены, ветвь LoRA и адаптеры обучаются.токены входаэмбеддингиp₁ … pₖнастройка промптавниманиепроекции Q, K, V, OB ALoRAадаптерполносвязный блокадаптерк следующему блокузамороженообучаетсяМеста параметров адаптеров, LoRA и настройки промптаСнизу вверх: токены входа, эмбеддинги с приписанными слева виртуальными токенами настройки промпта, внимание с ветвью LoRA справа, адаптер, полносвязный блок, второй адаптер, выход к следующему блоку. Эмбеддинги, внимание и полносвязный блок заморожены; виртуальные токены, ветвь LoRA и адаптеры обучаются.токены входаэмбеддингиp₁ … pₖнастройка промптавниманиепроекции Q, K, V, OB ALoRAадаптерполносвязный блокадаптерк следующему блокузамороженообучается
Один блок трансформера (остаточные связи и нормализация опущены). Серые части — предобученные и замороженные, оранжевые — единственное, что обучается. Настройка промпта приписывает к эмбеддингам входа k выученных векторов и не трогает ничего внутри. LoRA добавляет параллельно матрицам проекций внимания низкоранговую ветвь B A, которую после обучения можно влить в W. Адаптеры вставляют после подслоёв небольшие слои с узким местом, которые остаются в модели и при инференсе. Во всех трёх случаях копия на задачу — только оранжевые части.

Адаптеры#

Houlsby et al. (2019) вставляют небольшой модуль с узким местом после каждого подслоя каждого блока: проецируют dd-мерную активацию вниз до m≪dm \ll d, применяют нелинейность, проецируют обратно вверх и прибавляют результат к активации (остаточная связь). Обучаются только веса адаптеров (2dm2dm на адаптер плюс смещения) и нормализации слоёв. При d=768d = 768 и m=64m = 64 в адаптере около 100 тыс. параметров, и 12-блочная модель с двумя адаптерами на блок получает 2.4 млн — 2% BERT-base — при точности в пределах пункта от полного дообучения на задачах GLUE из статьи. Цена — при инференсе: адаптеры — дополнительные слои, которые работают на каждом прямом проходе и не могут быть убраны.

LoRA: обновление низкого ранга#

Hu et al. (2022) построили низкоранговую адаптацию (LoRA) на наблюдении — эмпирическом и сделанном раньше Aghajanyan, Zettlemoyer and Gupta (2021), — что обновление, которое нужно предобученной модели для прикладной задачи, имеет низкий внутренний ранг (intrinsic rank): бо́льшая часть направлений в ΔW\Delta W не важна. Слой вычисляет

h=Wx+ΔWx=Wx+BAx=Wx+B (Ax),h = W x + \Delta W x = W x + B A x = W x + B\,(A x),

справа налево: AxAx — это rr чисел, B(Ax)B(Ax) — снова doutd_{\text{out}} измерений. AA инициализируется маленькими гауссовскими значениями, а BB — нулями, так что на первом шаге ΔW=0\Delta W = 0, и обучение начинается ровно с предобученной модели. Множитель α/r\alpha / r масштабирует поправку, чтобы изменение rr не меняло эффективный шаг обучения.

Рисунок

LoRA: замороженная матрица весов плюс обучаемая поправка низкого ранга

Перепараметризация LoRAБольшой синий квадрат W, замороженный, а справа от него короткий широкий оранжевый прямоугольник A над высоким узким оранжевым прямоугольником B. Вход x снизу идёт в обе ветви; выходы W и B A складываются в h наверху.xd чиселWзаморожена, d × dA: r × dB: d × rобучаютсяB = 0 в начале+h = W x + B A xПерепараметризация LoRAБольшой синий квадрат W, замороженный, а справа от него короткий широкий оранжевый прямоугольник A над высоким узким оранжевым прямоугольником B. Вход x снизу идёт в обе ветви; выходы W и B A складываются в h наверху.xd чиселWзаморожена, d × dA: r × dB: d × rобучаютсяB = 0 в начале+h = W x + B A x
Предобученная матрица W (d × d, синяя) никогда не обновляется. Вместо неё обучаются две небольшие матрицы: A, которая отображает d-мерный вход в r чисел, и B, которая отображает их обратно в d. Их произведение B A — матрица d × d ранга не больше r, и слой вычисляет h = W x + B A x. A начинается случайной, а B — нулевой, поэтому на первом шаге поправка равна нулю и слой ведёт себя ровно как предобученный. В двух тонких матрицах 2dr параметров против d² у W; при d = 768 и r = 8 это 12 288 против 589 824.

Разобранный пример#

din=dout=4d_{\text{in}} = d_{\text{out}} = 4, r=1r = 1. Полное обновление — 16 чисел; LoRA обучает A=(1,0,−1,0)A = (1, 0, -1, 0) (4 числа) и B=(2,0,0,1)⊤B = (2, 0, 0, 1)^\top (4 числа). Их произведение

BA=(2001)(10−10)=(20−200000000010−10),BA = \begin{pmatrix} 2 \\ 0 \\ 0 \\ 1 \end{pmatrix}\begin{pmatrix} 1 & 0 & -1 & 0 \end{pmatrix} = \begin{pmatrix} 2 & 0 & -2 & 0 \\ 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 \\ 1 & 0 & -1 & 0 \end{pmatrix},

— матрица 4×44 \times 4 ранга 1: каждая строка кратна AA. Для x=(1,1,0,1)x = (1, 1, 0, 1) получаем Ax=1Ax = 1 и BAx=(2,0,0,1)BAx = (2, 0, 0, 1): поправка добавляет направление BB, масштабированное тем, насколько xx сонаправлен с AA. Восемь обученных чисел задают матрицу из 16 элементов ценой того, что матрица может указывать только в одном направлении. С rr направлениями — в rr.

Число параметров#

На матрицу: r(din+dout)r(d_{\text{in}} + d_{\text{out}}) против dindoutd_{\text{in}} d_{\text{out}}. Для слитой проекции внимания GPT-2 (768→2 304768 \to 2\,304, дающей Q,K,VQ, K, V сразу) при r=8r = 8: 8×(768+2 304)=24 5768 \times (768 + 2\,304) = 24\,576 на блок, 294 912 на 12 блоков, плюс выходной слой на 1536 параметров: 296 448 обучаемых параметров, 0.24% модели. Исходная статья применяет LoRA только к проекциям запросов и значений; здесь она применяется к слитой проекции GPT-2, которая покрывает запросы, ключи и значения, потому что GPT-2 вычисляет их одной матрицей.

Результат#

РежимОбучаетсяДоля верных (валидация)Потери (валидация)
Полное дообучение124 млн (100%)0.8900.277
Линейное зондирование1536 (0.001%)0.7370.541
LoRA, r=8r = 8 на внимании296 тыс. (0.24%)0.8990.271
Настройка промпта, 12 токенов10.8 тыс. (0.009%)0.6630.656
LP-FT124 млн0.9000.258

LoRA не уступает полному дообучению (разница в пункт — шум на 872 примерах), обучая в 400 раз меньше параметров, с шагом обучения 10−410^{-4} (новые матрицы начинают с нуля, поэтому осторожность с маленьким шагом из полного дообучения не нужна) и без состояний оптимизатора для замороженного тела. Адаптер задачи — файл из 296 тыс. чисел, который можно подключать к одной общей базовой модели и отключать.

Настройка промпта#

Lester, Al-Rfou and Constant (2021) не обучают ничего внутри модели. К эмбеддингам каждого входа приписывается последовательность из kk виртуальных токенов — свободных векторов размерности dd; модель заморожена; обучаются только эти k×dk \times d чисел (и здесь выходной слой). Метод опирается на наблюдение, что большими языковыми моделями можно управлять промптом, и заменяет написанные вручную промпты выученными. Инициализация виртуальных токенов эмбеддингами естественного предложения (Predict if sentiment of this review is positive or negative, 11 токенов, дополненных до 12) даёт оптимизатору разумную отправную точку.

Результат: 0.663 при 10 752 обучаемых параметрах — ниже линейного зондирования. Эксперименты статьи поставлены на моделях энкодер–декодер T5 на SuperGLUE, и там настройка промпта (prompt tuning) догоняет полное дообучение только около самого большого из опробованных размеров, примерно 11 млрд параметров, и сильно отстаёт на меньших (Lester et al., 2021, рисунок 1). Эта кривая — свидетельство о T5, а не правило для любой архитектуры, но она указывает в ту же сторону, что и этот прогон: GPT-2 на 124 млн параметров далеко от размера, на котором разрыв закрылся. Сами мягкие промпты не привязаны к одной архитектуре. Статья приписывает их ко входу модели энкодер–декодер, и тот же механизм применим к энкодеру и к модели из одного декодера; насколько хорошо он работает, зависит от модели и её размера и измеряется для каждой постановки. Его привлекательность — в размере: задача — это несколько тысяч чисел.

Более сильный родственник — настройка префикса (prefix tuning; Li and Liang, 2021): выученные векторы подставляются как дополнительные ключи и значения в каждый слой внимания, а не только на вход.

Дообучение квантизованной модели: QLoRA#

LoRA держит замороженное тело в памяти, и для модели на 7 млрд это 14 ГБ в 16 битах. Dettmers et al. (2023) хранят замороженное тело в 4 битах (формат NF4 из заметки о квантизации, 3.5 ГБ для 7 млрд), деквантуют каждую матрицу на лету для прямого прохода, держат матрицы LoRA в 16 битах и применяют вторую квантизацию к самим константам квантизации. Градиенты проходят через деквантованные веса только в AA и BB. Тот же рецепт работает и с моделью, квантованной методом GPTQ: для 4-битной Llama-2-7B LoRA с r=8r = 8 на четырёх проекциях внимания добавляет 8.4 млн обучаемых параметров, и десять шагов обучения на наборе цитат выполняются на одном потребительском GPU. В экспериментах статьи качество дообучения QLoRA близко к 16-битной LoRA; механизм, который это позволяет, в том, что замороженным весам никогда не нужны градиенты, поэтому формат их хранения может быть любым, лишь бы его мог прочитать прямой проход.

Компромиссы#

МетодОбучаетсяЦена при инференсеГде применимКачество (на этой задаче)
Полное дообучение100%нетвезде0.890
Адаптеры~2%дополнительные слоивезде≈ полное (литература)
LoRA0.1–1%нет после слияниялинейные слои0.899
Настройка промпта< 0.01%kk дополнительных токенов на входлюбые; конкурентна в большом масштабе (T5 в статье)0.663
QLoRALoRA на 4-битном теле4-битное телобольшие декодеры≈ LoRA (литература)

Практические решения: rr от 4 до 64 (статья обнаружила, что для GPT-3 на её задачах достаточно значений от r=1r = 1 до 88, а дальше качество не растёт); применять сначала к проекциям внимания, а при наличии бюджета — и к матрицам полносвязных слоёв; шаг обучения около 10−410^{-4} – 3×10−43 \times 10^{-4}; дропаут на пути LoRA.

Что изменилось#

Полное дообучениеLoRA
ΔW\Delta WСвободнаРанг ≤r\le r
Параметров на задачуВсеr(din+dout)r(d_{\text{in}} + d_{\text{out}}) на матрицу
Память оптимизатора2 состояния на вес2 состояния на вес LoRA
Артефакт задачиПолная модельФайл адаптера
ИнференсТот жеТот же, после слияния
Шаг обученияМаленькийБольше (новые веса)

Ограничения#

  • Ранг — это ставка. Задачам, которым могут понадобиться большие изменения высокого ранга (новый язык, долгое продолжение предобучения на новой области), малый rr может подходить хуже. Это компромисс ёмкости и оптимизации, который измеряют в каждом случае, а не правило, по которому LoRA не может выучить содержание области.
  • Замороженное тело — ограниченная ёмкость. Всё новое хранится в ΔW\Delta W. Это обновление обучается и меняет выходы модели, в том числе факты; малый rr ограничивает, насколько сильно оно может их изменить. Адаптацию к задаче от продолжения предобучения отличают в основном цель и данные (размеченные примеры задачи против большого объёма сырого текста), и то и другое можно проводить низкоранговыми обновлениями.
  • Зависимость от масштаба. Полезность настройки промпта зависит от размера модели; гиперпараметры LoRA (rr, целевые модули, α\alpha) зависят от модели и задачи и подбираются эмпирически.
  • Адаптеры добавляют задержку, LoRA — нет; QLoRA обменивает вычисления на деквантование на память.
  • Шум. Сравнения выше опираются на один запуск каждого метода на 872 примерах; разница в пункт — не вывод.

Что нужно запомнить#

  • LoRA: h=Wx+BAxh = Wx + BAx, где WW заморожена, AA случайна, а B=0B = 0 в начале; r(din+dout)r(d_{\text{in}} + d_{\text{out}}) обучаемых параметров на матрицу; для инференса BABA вливается в WW.
  • На SST-2 с GPT-2 small LoRA (r=8r = 8, внимание) даёт 0.899 против 0.890 у полного дообучения при обучении 0.24% параметров.
  • Адаптеры добавляют небольшие слои с узким местом (лишняя цена инференса); настройка промпта выучивает входные векторы, в экспериментах Lester et al. на T5 догнала полное дообучение только около 11 млрд параметров, а на GPT-2 small здесь дала 0.663.
  • QLoRA хранит замороженное тело в 4 битах и обучает поверх LoRA, что позволяет дообучать модели на 7 млрд параметров на одном GPU.
  • Ранг — гипотеза о том, насколько задача должна изменить модель. Для адаптации к задаче обычно хватает малого ранга; большим изменениям, например новой области, может понадобиться больший rr, больше целевых модулей или полное обучение, и выбор проверяют на валидационных данных.

Ноутбук#

week10_PEFT.ipynb. Номера ячеек считают все ячейки, включая текстовые, начиная с 1. Приведённые числа взяты из прогона, сохранённого в курсе; у ячеек, изменённых с тех пор под текущие версии библиотек, сохранённого выхода нет.

  • Ячейки 35–39 настраивают LoraConfig(task_type=SEQ_CLS, r=8, lora_dropout=0.1, target_modules=['c_attn']), где c_attn — слитая проекция запросов, ключей и значений GPT-2, и оборачивают модель в get_peft_model; ячейка 39 насчитывает 296 448 обучаемых параметров. В сохранённом выходе ячейки 38 нет строки print_trainable_parameters; вместе с матрицами LoRA в модели 124 738 560 параметров, так что обучаемая доля — 0.24%.
  • Ячейки 40–43 обучают с AdamW при 10−410^{-4} 1000 шагов и приводят функцию потерь на валидации 0.2708 и долю правильных ответов 0.8991.
  • Ячейки 45–49 настраивают PromptTuningConfig с 12 виртуальными токенами, инициализированными приведённым выше предложением (num_virtual_tokens=12, token_dim=768), и печатают 10 752 обучаемых параметра, а ячейки 52–54 обучают и приводят функцию потерь 0.6560 и долю правильных ответов 0.6628.

week12_pt1_Distillation_and_GPTQ_Quantization.ipynb, ячейки 41–51: 4-битная GPTQ-модель Llama-2-7B подготавливается prepare_model_for_kbit_training, оборачивается LoraConfig(r=8, lora_alpha=32, target_modules=["k_proj","o_proj","q_proj","v_proj"], lora_dropout=0.05), что печатает 8 388 608 обучаемых параметров, и обучается 10 шагов через Trainer; напечатанное там число «all params» (270 млн) считает упакованные 4-битные веса как отдельные параметры int32 и не равно настоящему размеру модели.

week12_pt0_Torch_and_ONNX_Quantization_+_PEFT.ipynb, ячейки 71–76: конфигурация QLoRA (load_in_4bit, nf4, двойная квантизация, вычисления в bfloat16) и LoraConfig(r=16, target_modules="all-linear") для базовой Mistral-7B, то есть LoRA ставится и на матрицы полносвязных слоёв, а не только на проекции внимания; эти ячейки — шаблон и до конца не запускаются.

Дальше#

До сих пор адаптация означала размеченную задачу: тональность, тему. Модели, с которыми люди действительно взаимодействуют, адаптированы к чему-то более широкому — к поведению «отвечать на инструкцию», и следующая заметка описывает этот процесс: обучение с учителем на парах «инструкция — ответ», затем оптимизацию по предпочтениям людей, причём LoRA и QLoRA — обычный способ себе это позволить.

Литература#