Fine-tuning: SFT, LoRA, PEFT
Как дообучить готовую LLM под свою задачу: когда это вообще нужно, почему полный файнтюн стоит как самолёт и как LoRA обучает доли процента параметров почти без потери качества.
Интуиция
После претрейнинга модель знает «всё», но говорит как интернет. Дообучение (fine-tuning) — это короткая специализация: научить её нужному стилю, формату, домену или манере отвечать. Аналогия: выпускник университета (base model) проходит стажировку в компании — общие знания уже есть, осталось привить рабочие привычки.
Классический рецепт — SFT (supervised fine-tuning): собираем пары «промпт → эталонный ответ» и учим модель тем же next token prediction, но с одной тонкостью — лосс считается только по токенам ответа. Токены промпта маскируются: мы не хотим учить модель генерировать вопросы пользователей, мы учим её отвечать.
Почему полный файнтюн дорог
При полном файнтюне (full fine-tuning) обновляются все веса. Память при этом — совсем не «размер модели»: для обучения с Adam нужно держать веса, градиенты и два состояния оптимизатора на каждый параметр:
Для 7 млрд параметров это уже ~112 ГБ — не влезает ни в одну одиночную GPU. Вторая беда — катастрофическое забывание (catastrophic forgetting): агрессивно дообучая на узком домене, легко испортить общие способности модели.
PEFT и LoRA: учим мало, получаем много
Идея PEFT (parameter-efficient fine-tuning) — заморозить базовую модель и обучать лишь небольшую добавку. Самый популярный метод — LoRA (Low-Rank Adaptation). Вместо того чтобы менять матрицу весов W размера d×k напрямую, изменение представляют низкоранговым произведением:
Обучаются только A и B: это r·(d+k) параметров вместо d·k. При d = k = 4096 и r = 16 — это 131 тысяча вместо 16,8 миллиона на одну матрицу, меньше процента. После обучения ΔW можно влить в W (просто сложить матрицы) — на инференсе никакого оверхеда, модель неотличима по скорости от исходной. QLoRA идёт дальше: замороженную базу квантуют в 4 бита, а LoRA-адаптеры учат поверх — так 70-миллиардные модели дообучают на одной GPU.
Поиграй с рангом: даже r = 64 — это меньше процента параметров модели, а типичные r = 8–16 дают на большинстве задач качество, близкое к полному файнтюну. Обрати внимание, как мало меняется память от роста r: почти всю её съедает хранение замороженной базы, поэтому 4-битная квантизация в QLoRA даёт главный выигрыш.
Когда файнтюн не нужен
Любимый вопрос собеседований: «клиент хочет дообучить модель — что уточнишь?» Правильный рефлекс — сначала исчерпать дешёвые варианты. Свежие или приватные факты — это RAG, а не файнтюн: знания в весах быстро устаревают, а SFT на новых фактах провоцирует галлюцинации. Формат и тон часто решаются промптингом и few-shot примерами за час вместо недель. Файнтюн оправдан, когда нужен устойчивый специфический стиль/формат на большом потоке запросов, узкий домен с особым языком, или когда длинный промпт с примерами стал слишком дорогим и его хочется «вжечь» в веса.
- «Промптинг, RAG или файнтюн?» — по порядку стоимости: сначала промпт и few-shot, для фактов — RAG, файнтюн — когда нужен стабильный стиль/формат/домен и есть данные и бюджет на оценку качества.
- «Как работает LoRA и почему она не замедляет инференс?» — ΔW = A·B ранга r учится отдельно, после обучения складывается с W — архитектура и латентность не меняются.
- «Сколько памяти на полный файнтюн 7B?» — ~16 байт на параметр с Adam и mixed precision: порядка 112 ГБ, отсюда и популярность PEFT.
- «Что такое catastrophic forgetting и как смягчить?» — потеря общих навыков при узком дообучении; помогают маленький learning rate, подмешивание общих данных, LoRA вместо полного FT.