Результат первого дообучения почти всегда плохой, и первое желание — покрутить параметры. Проблема в том, что параметров пять, крутить их можно в любом порядке, а каждый прогон стоит времени и денег. Без порядка перебора вы потратите пять запусков там, где хватило бы двух.
Эта статья — про порядок. Стартовые значения в ней тоже есть, но они менее важны.
#Зачем это нужно и когда не нужно
Нужно, когда датасет уже почищен и первый прогон дал невнятный результат. Не нужно раньше: до чистки данных подбор гиперпараметров бессмыслен, потому что вы будете подгонять настройки под противоречия в наборе — а качество данных влияет на результат сильнее любого параметра ниже. Где этот шаг стоит в общем маршруте — в пилларе про свою модель и дообучение под себя.
#Что понадобится
- Почищенный датасет и отложенная выборка, отделённая после чистки.
- Записанный результат первого прогона: конкретные вопросы и ответы, а не «стало хуже».
- Готовность делать по одному изменению за прогон. Два одновременно — и вы не узнаете, что сработало.
#Стартовые значения
С них имеет смысл начинать первый прогон на компактной базе и датасете в несколько сотен примеров.
| Параметр | Старт | Что он делает |
|---|---|---|
| Число эпох | 1 | сколько раз модель увидит каждый пример |
| Скорость обучения | 2e-4 | насколько сильно смещаются адаптеры за шаг |
| Ранг адаптера | 16 | ёмкость: сколько поведения он вмещает |
alpha |
32 (то есть 2×ранг) | сила вклада адаптера |
| Размер батча | 1 | сколько примеров за шаг; на домашней карте почти всегда 1 |
| Накопление градиента | 16 | эффективный батч = 1 × 16 |
| Длина последовательности | 1024 | главный рычаг расхода памяти |
| Прогрев | 3% шагов | плавный вход в обучение |
| Расписание | косинусное | плавное затухание скорости к концу |
Именно такой набор стоит в скрипте обучения нашей «второй копии»: одна эпоха по умолчанию заменена на три, но в Colab-ноутбуке проекта для рассуждающей базы явно выставлена одна — и там же написано почему: тяжёлое дообучение на узких данных ломает способность рассуждать.
Оговорка: это стартовая точка, а не рекомендация «так правильно». Полный прогон с замеренным результатом мы не публиковали, и относиться к этим числам стоит как к разумному началу, проверенному практикой сообщества, а не как к нашему измерению.
#Порядок настройки при плохом результате
Главный раздел статьи. Сначала определите симптом, потом меняйте один параметр.
| Симптом | Что менять первым | Куда |
|---|---|---|
| Модель повторяет строки датасета дословно | Число эпох | вниз, до 1 |
| Модель поглупела на посторонних темах | Число эпох, затем ранг | вниз |
| Стиль не изменился вовсе | Датасет, затем ранг | больше эталонов, потом ранг вверх |
| Ответы стали бессвязными | Скорость обучения | вниз, в 2–5 раз |
| Обучение падает по памяти | Длина последовательности | вниз |
| Обучение идёт, потери не снижаются | Формат данных | проверить рендеринг, не параметры |
| Модель не останавливается вовремя | Шаблон чата | проверить, не параметры |
Две последние строки — не про гиперпараметры вовсе, и это принципиально: половина «плохих результатов» вызвана форматом данных, а не настройками. Прежде чем крутить параметры, распечатайте одну обучающую запись после применения шаблона чата и прочитайте её глазами: вы должны увидеть служебные маркеры ролей базовой модели и текст на своих местах.
#Разбор параметров по одному
Число эпох. Самый опасный параметр и самый первый в порядке настройки. На датасете в несколько сотен примеров три эпохи означают, что модель увидела каждую строку трижды, — и она начинает их заучивать. Начинайте с одной. Повышайте только если стиль не сдвинулся, а датасет уже достаточный.
Скорость обучения. Для LoRA типичный диапазон — от 1e-4 до 3e-4. Слишком высокая даёт бессвязность и «разваливание» ответов; слишком низкая — отсутствие изменений. Меняйте кратно, а не на проценты: разница между 2e-4 и 2.2e-4 неразличима.
Ранг. Ёмкость адаптера: он задаёт размер обучаемых матриц, а значит, сколько разного поведения адаптер способен вместить. Низкий ранг физически не может вместить сложное поведение; высокий на маленьком наборе заучивает набор. Для переноса стиля 8–16 достаточно.
alpha. Держите пропорционально рангу (обычно вдвое больше), иначе при изменении ранга вы незаметно меняете ещё и силу воздействия — и не поймёте, что именно повлияло.
Накопление градиента. Заменяет большой батч, которого нет на домашней карте. Эффективный батч = размер батча × число накоплений. Слишком маленький эффективный батч даёт шумные шаги; слишком большой — вялое обучение.
Длина последовательности. Ставьте по фактической длине ваших примеров, а не «побольше на всякий случай»: каждый лишний токен — это память. Посмотрите распределение длин в датасете и возьмите значение, покрывающее большинство.
#Проверка результата
После каждого изменения — одна и та же проверка, иначе сравнивать нечего:
- Десять вопросов на стиль, ответы на которые вы знаете наизусть.
- Пять вопросов из тем, которых в датасете не было — контроль деградации.
- Три вопроса, где модель должна честно отказаться отвечать или сказать «не знаю».
- Сравнение с базой вслепую: ответы обеих моделей в перемешанном порядке, без подписей.
Записывайте результат каждого прогона рядом с конфигурацией. Полный протокол — в статье про честную оценку дообученной модели.
#Что может пойти не так
- Меняете два параметра за прогон. Классика. Результат изменился, причина неизвестна, следующий шаг непонятен.
- Крутите ранг, когда проблема в датасете. Стиль не сдвигается чаще из-за недостатка эталонов вашего тона, чем из-за низкой ёмкости адаптера.
- Повышаете эпохи, чтобы «лучше выучило». Это прямая дорога к заучиванию — признаки в статье про переобучение и его лечение.
- Не фиксируете зерно случайности. Два прогона с одинаковой конфигурацией дают разные адаптеры, и вы принимаете шум за эффект настройки.
- Сравниваете не вслепую. Автор дообучения систематически видит улучшение там, где его нет.
- Забываете, что QLoRA и LoRA настраиваются одинаково. Метод сжатия базы на выбор гиперпараметров не влияет — разбор в статье про LoRA и QLoRA.
Как эти параметры задаются на практике в конкретных инструментах — в гайде по Unsloth и в разборе конфигурационного подхода Axolotl.
#Частые вопросы
#Сколько эпох брать для датасета в триста примеров?
Одну. Если после неё стиль не сдвинулся, добирайте примеры, а не эпохи: вторая и третья эпоха на трёхстах примерах дают заучивание раньше, чем перенос манеры. Повышать число эпох осмысленно на наборе в тысячи разнообразных примеров.
#Какая скорость обучения правильная?
Универсально правильной нет, есть рабочий диапазон около 1e-4 — 3e-4 для LoRA. Начинайте с середины и меняйте кратно при явных симптомах: бессвязность — вниз, полное отсутствие изменений при достаточном датасете — вверх.
#Ранг 64 лучше ранга 16?
Ёмче, но не лучше. На датасете в несколько сотен примеров высокий ранг успевает заучить набор до того, как выучит манеру. Повышайте ранг последним, когда датасет уже большой, эпох одна, а стиль всё ещё не переносится.
#Нужно ли менять параметры при смене базовой модели?
Скорость обучения и ранг обычно переносятся, а длину последовательности и расход памяти придётся пересчитать под новый размер. И обязательно перепроверьте шаблон чата: он у новой базы другой, и это ломает больше вещей, чем любые настройки.
#Что делать, если ни одно изменение не помогает?
Вернуться к данным. Когда пять прогонов с разными параметрами дают одинаково невнятный результат, дело почти всегда в датасете: противоречия, чужая манера в эталонах или слишком узкий набор тем. Гиперпараметры не чинят данные.
#Вывод
Стартовые значения важны меньше, чем порядок изменений. Начинайте с одной эпохи, ранга 16 и скорости 2e-4, меняйте по одному параметру за прогон и всегда по симптому, а не наугад.
И держите в голове главное: первыми проверяются данные и формат, а не настройки. Если модель повторяет датасет — это эпохи; если бессвязна — это скорость; если не остановилась вовремя — это вообще не гиперпараметр, а шаблон чата.