Эксперимент, который заставил меня пересмотреть подход
Вы дообучаете языковую модель под задачу следования инструкциям. Вбиваете команду, запускаете SFT (Supervised Fine-Tuning) на популярном датасете вроде SlimOrca. Через несколько часов модель готова. Вы гоните тесты — и с ужасом обнаруживаете: метрика IFEval упала. Не выросла, а рухнула. На 5.75 пункта. Ваша 1B-модель стала хуже отвечать на инструкции, чем базовая. Знакомая история?
Я решил проверить это системно. Взял три модели: 1B, 2B, 3B (на базе Qwen2.5 и Gemma 3). Обучал SFT с одинаковым рецептом: 3 эпохи, learning rate 2e-5, LoRA rank=16, датасет SlimOrca (10k примеров). Измерял IFEval (Prompt Strict Accuracy) до и после. Результаты меня взбесили.
| Размер модели | IFEval до SFT | IFEval после SFT | Дельта |
|---|---|---|---|
| 1B | 45.12 | 39.37 | -5.75 |
| 2B | 52.30 | 56.00 | +3.70 |
| 3B | 55.80 | 61.20 | +5.40 |
Почему 1B сливает? Три железобетонных причины
1 Узкое горлышко ёмкости
1B-модель — это как студент-первокурсник с тонкой тетрадкой. Базовые знания из претрейна уже занимают почти весь объём. SFT пытается впихнуть новые паттерны следования инструкциям, но тетрадка кончается. Модель начинает вытеснять старые знания — она слишком мала, чтобы хранить и то, и другое. В результате теряет общее понимание языка, которое критически важно для точного выполнения инструкций (особенно сложных).
В теории это работает так: у большой модели (3B+) есть запас прочности — redundant нейроны. Она может выделить отдельный подпространство для новых навыков. У 1B такой роскоши нет. Каждый новый паттерн перезаписывает старые. И если формат датасета SlimOrca отличается от претрейн-распределения, коллапс неминуем.
2 Отравление узким датасетом
SlimOrca — классный датасет, но у него есть перекос: много коротких диалогов с простыми запросами. 1B-модель быстро выучивает типовые конструкции и начинает на них «зацикливаться». Она забывает, что инструкция может быть многошаговой, с условиями, с требованием формата. Тесты IFEval содержат такие замороченные промпты: «напиши ответ в формате JSON, ключ должен быть name, значение в кавычках, и добавь поле age».
2B и 3B могут использовать свою ёмкость, чтобы обобщать эти паттерны, а 1B просто вызубривает типовые ответы. Как только задача выходит за рамки датасета — провал.
Есть способ это проверить: посмотрите на loss на валидации. Если он падает, но IFEval падает — классический случай переобучения. Модель выучила датасет, но не навык.
3 Катастрофическое забывание (Catastrophic Forgetting)
Это бич любого тонкого тюнинга, но для 1B он фатален. Модель теряет способность следовать инструкциям не потому, что она переучилась, а потому что забыла общий контекст. SFT на маленькой модели — это как дать хоккеисту клюшку и заставить его месяц играть только в гольф. Он вернётся на лёд и будет клюшкой забивать шайбу как мячик.
В моём эксперименте я дополнительно померил perplexity на датасете wikitext-2 до и после SFT. У 1B она выросла с 12.3 до 18.7 — наглядное свидетельство забывания. У 2B рост с 11.1 до 11.8, у 3B вообще не изменилась.
Что делать? Чек-лист для спасения маленьких моделей
Не бросайте SFT на моделях до 2B. Его можно настроить так, чтобы он не убивал IFEval. Вот что сработало в моих последующих тестах.
- Уменьшите ранг LoRA. Rank=8 вместо 16. Меньше новых параметров — меньше вероятность затереть претрейн. Да, скорость обучения упадёт, но качество останется.
- Используйте replay buffer — смешивайте примеры из SFT с 10–20% претрейн-данных (кода, книг). Это тормозит забывание. Я добавлял 15% данных из FineWeb-edu.
- Сократите число эпох. Одна, максимум две. Третья эпоха на 1B — гарантированный слив IFEval.
- Следите за loss на холостом тесте. Если validation loss начал расти — стоп. Это сигнал, что модель уже не обобщает.
- Попробуйте DPO вместо SFT. Как показал опыт коллег, RL-методы (особенно DPO) меньше затирают базу, потому что учатся на предпочтениях, а не на жёстких ответах.
Главная ошибка: использовать тот же рецепт, что для 7B модели. Для 1B он токсичен. Статья по стабилизации SFT для маленьких трансформеров подтверждает: аккуратный выбор гиперпараметров критичен.
Практический рецепт: как я обучил 1B без слива
Вот конкретный конфиг, который дал прирост +1.2 пункта IFEval на той же 1B модели (вместо падения).
# huggingface training arguments
model_name: Qwen/Qwen2.5-1.5B-Instruct
dataset: slimorca
batch_size: 4
gradient_accumulation_steps: 8
learning_rate: 1e-4 (cosine scheduler)
num_epochs: 1
lora:
r: 8
alpha: 16
dropout: 0.1
target_modules: [q_proj, v_proj, o_proj, gate_proj] # не трогаем mlp
optimizer: adamw_bnb_8bit
# replay buffer
replay_data: fineweb-edu
replay_ratio: 0.2 # 20% претрейн-примеров в каждом батче
Ключевое изменение — replay ratio 0.2. Без него loss рос с каждой итерацией. С ним — стабилизировался. Да, обучение идёт дольше, но результат стоит того. Пример с медицинской тонкой настройкой показывает ту же проблему: датасет слишком специфичен, и без претрейн-регуляризации модель коллапсирует.
Когда малая модель — зло?
Не хочу рубить сплеча. 1B-модели имеют право на жизнь — они быстрые, дешёвые, работают на CPU. Но SFT на них — это игра с огнём. Если ваша задача — чёткое следование сложным инструкциям (как в моём IFEval-тесте), лучше взять 3B+ или использовать промпт-инжиниринг. Статья про промпт «думай вслух» показывает, что иногда правильно составленный промпт даёт больше, чем дообучение.
Этот эксперимент чётко обозначил границу: модели меньше 2B не стоит пытаться учить следованию инструкций через SFT — они либо не вывезут, либо деградируют. Выбирайте размер осознанно, а не по принципу «чем меньше, тем быстрее». Иначе получите минус 5.75 к IFEval и потраченное время.