Дэмиан Стюарт / @damian0815

Эта статья является частью серии статей о тонкой настройке моделей стабильной диффузии. См. также Точная настройка стабильной диффузии с проверкой.

В этой статье я представляю краткое введение в то, как применять метод Лесли Смита для определения подходящей скорости обучения для набора данных Стабильная диффузия (Dreambooth).

Идея метода довольно проста. Вы запускаете обучение с включенной проверкой для небольшого количества шагов в вашем наборе данных, используя скорость обучения (LR), которая плавно увеличивается от 0 до значения, которое, вероятно, слишком велико. Это создает кривую характерной формы на графике проверки. Вы можете интерпретировать эту кривую, чтобы найти шаги, на которых модель обучалась лучше всего. Исходя из этого, вы можете определить оптимальную скорость обучения, которую следует использовать для обучения стабильной диффузии на вашем наборе данных.

Чтобы узнать больше об этом методе, ознакомьтесь также со статьей FollowFox здесь: https://followfoxai.substack.com/p/find-optimal-learning-rates-for-stable.

Запуск метода поиска LR

1. Используйте EveryDream2.

Если вы еще этого не сделали, используйте EveryDream2. Он имеет правильные, стабилизированные шумом графики проверки. Без них вы не сможете использовать метод Лесли Смит.

2. Проверка установки.

Следуя инструкциям здесь, включите проверку, используя аргумент --validation_config для EveryDream2.

3. Определите продолжительность вашей эпохи.

Запустите тренировочный прогон с вашим набором данных (вы можете просто использовать настройки по умолчанию, потому что он будет прерван, как только мы узнаем длину эпохи). Убедитесь, что проверка выполняется (вы увидите, что индикатор выполнения validation вспыхивает при запуске, если он работает):

Подождите, пока вы не увидите, сколько шагов в эпохе:

Затем прервите и прекратите тренировку. Запишите количество шагов в вашей эпохе — это ваша длина эпохи (в данном примере 57 шагов), и она понадобится вам для следующего шага.

4. Установите для планировщика LR значение Linear и обучите 10 эпох с прогревом LR на 10 эпох.

Значение LR должно проходить по плавной линии от 0 до самого высокого значения LR, которое вы хотите протестировать, в течение 10 эпох. Возьмем 3e-6 за максимальное значение — это значение, которое, вероятно, слишком подходит для регулярного обучения, но в зависимости от вашего набора данных его может потребоваться увеличить или уменьшить. Если мы используем линейный планировщик с прогревом в 10 эпох (т. е. 10 x epoch length шагов), LR начнется с 0 и будет плавно двигаться до максимума за 10 эпох. 10 x epoch length из приведенного выше примера составляет 570 шагов, но обратите внимание, что вам нужно будет изменить это значение, чтобы оно соответствовало вашему собственному набору данных:

python train.py --config train.json \
    --validation_config validation_default.json \
    --lr_scheduler linear \
    --lr 3e-6 \
    --lr_warmup_steps 570 \ # example 
    --max_epochs 10

Обратите внимание: в приведенном выше примере предполагается, что ваш train.json уже правильно настроен, а также использует синтаксис Linux — в Windows вам нужно будет заменить \ символов выше на ^ символов

5. Найдите графики loss/val и hyperparameter/lr.

Проверьте графики в Tensorboard или wandb.ai — вы хотите найти график loss/val и график hyperparameter/lr или hyperparameter/lr unet. На графике hyperparameter/lr должна быть прямая линия, идущая вверх (не беспокойтесь, если числа на вашем рисунке не совпадают):

График loss/val должен отображать кривую, которая опускается вниз, выравнивается, а затем поднимается и продолжает расти, примерно так (опять же, не беспокойтесь, если числа не совпадают или если они не начинаются с 0):

Ваш график может не отображать полную кривую. Все в порядке, важно то, что вы можете видеть, как график четко падает, становится плоским, а затем начинает расти — на графике выше область между шагом 0 и шагом 250.

  • Если вы не видите, что график начинает расти, удвойте максимальный LR, который вы использовали в шаге 4, и запустите его снова (например, если вы использовали 3e-6, попробуйте 6e-6). Если это все еще не помогает, вы можете попытаться удвоить его еще раз, но также проверьте свой набор данных на наличие дубликатов или почти дубликатов — их нужно будет удалить, чтобы loss/val был правильно рассчитан.
  • Если график начинает расти слишком быстро, чтобы увидеть форму кривой, уменьшите вдвоемаксимальный LR, который вы использовали в шаге 4, и запустите его снова (т. е. если вы использовали 3e-6, то попробуйте 1.5e-6).

6. Сравните графики loss/val и гиперпараметр/lr, чтобы найти идеальные скорости обучения для вашего набора данных.

Когда вы размещаете графики loss и lr рядом друг с другом, это дает вам надежное руководство по диапазону скоростей обучения, которые вы, возможно, захотите попробовать для обучения вашего набора данных. Найдите на графике loss самый крутой спуск. Именно здесь модель тренировалась наиболее эффективно. Используйте график lr, чтобы определить, какие скорости обучения были во время этого самого крутого спуска — тогда это идеальный диапазон скоростей обучения для обучения вашего набора данных.

Как вы можете видеть на графике выше, когда скорость обучения ниже 2e-7, график потерь падает очень медленно. Когда скорость обучения достигает 2e-7, потери начинают падать быстрее, пока не достигают 7e-7, после чего потери начинают выравниваться и колебаться, прежде чем начать расти. Это означает, что идеальная скорость обучения для этого набора данных составляет от 2e-7 до 7e-7.

7. Тренируйтесь, используя скорость обучения в идеальном диапазоне.

Если вы хотите увидеть результаты раньше, вы можете попробовать уже тренироваться в 7e-7. Если вы готовы ждать больше эпох, вы можете попробовать 5e-7 или даже 3e-7 — в моих тестах обучение с более низкой скоростью обучения в течение более длительного времени всегда приводило к лучшей и более гибкой модели.

В общем, вместо того, чтобы пытаться найти абсолютно лучшую скорость обучения, вы должны выбрать несколько эпох, которые вы готовы ждать, и оптимизировать скорость обучения, чтобы достичь долины кривой проверки к концу процесса обучения. Смотрите мою другую статью Точная настройка стабильной диффузии с проверкой для получения дополнительной информации об этом.

Вот и все.

Это довольно просто, правда! Тренируйтесь в течение 10 эпох со скоростью обучения, которая выглядит следующим образом: ⟋. Проверьте график проверки на кривую, которая идет круто вниз, становится плоской, а затем поднимается. Хорошие показатели обучения — это когда график идет вниз.

Если вам нужен другой взгляд на этот метод, обязательно ознакомьтесь со статьей FollowFox здесь: https://followfoxai.substack.com/p/find-optimal-learning-rates-for-stable.