Введение в ключевые концепции обучения LoRA
На днях я делился списком концепций, которые, на мой взгляд, стоит освоить каждому, прежде чем браться за обучение своей первой LoRA. Ради блага сообщества публикую этот список здесь. Я постарался объяснить всё максимально просто (на уровне «объясни десятилетнему»), чтобы вы поняли, как именно эти параметры взаимодействуют с вашим датасетом и текстовыми описаниями.
Что такое LoRA?
Аббревиатура LoRA расшифровывается как «Low-Rank Adaptation» (адаптация пониженного ранга). По сути, это адаптер, который вы обучаете и «надеваете» на базовую модель, чтобы изменить результаты её генерации.
Представьте себе порт USB-C на вашем компьютере. Если у вас нет соответствующего кабеля, вы ничего к нему не подключите. А если нужно подсоединить устройство со старым штекером USB-A, потребуется переходник — адаптер, который «переведет» сигнал с USB-C на USB-A.
С LoRA всё обстоит точно так же: это переходник для нейросети (будь то Flux, Qwen или Z-image).
В этой статье я буду исходить из того, что мы обсуждаем преимущественно LoRA для персонажей, хотя большинство этих принципов применимо и к другим типам адаптеров.
Можно ли использовать LoRA для SDXL, скачанную с CivitAI, на модели Flux?
Нет. Как правило, LoRA работает только с той моделью, для которой её обучали. Нельзя воткнуть переходник для USB-C в совершенно другой разъем. Он подходит только для USB-C.
Моя LoRA персонажа выдает хороший результат в 70% случаев, это нормально?
Нет. Качественно обученная LoRA персонажа должна выдавать стабильный результат в 95% случаев. На самом деле, это единственный по-настоящему надежный способ генерировать одного и того же героя, если базовая модель его ещё не знает. Если ваш адаптер работает лишь «время от времени», значит, где-то закралась ошибка.
Можно ли комбинировать несколько LoRA?
Скорее нет, по крайней мере, если речь идет о персонажах. Когда к модели применяются сразу две LoRA, их веса складываются, и на выходе получается нечто совершенно новое. Существуют способы обойти это ограничение, но это уже продвинутая тема для отдельного разговора.
Как именно «учится» LoRA?
Нейросеть учится, выявляя любые повторения в вашем датасете. Если какая-то деталь постоянно мелькает в кадре, а вы не хотите, чтобы она «просачивалась» в будущие генерации — у вас проблема, и набор данных придется корректировать. Например, если абсолютно все исходники имеют белый фон, LoRA почти наверняка его «запомнит», и вам будет крайне сложно сгенерировать этого персонажа в других декорациях.
Поэтому к сбору датасета нужно подходить предельно вдумчиво. Даете ли вы разные ракурсы того объекта, который модель должна усвоить? Позаботились ли вы о том, чтобы всё остальное в кадре было разнообразным и не повторялось?
Сколько изображений нужно для датасета?
Обучение может сработать как на паре-тройке кадров, так и на сотне. Главное здесь — чтобы ключевой объект повторялся стабильно и без искажений, а всё остальное окружение оставалось максимально вариативным. Именно поэтому при создании LoRA персонажей зачастую лучше использовать меньше изображений — но кристально четких, идеальных и в высоком разрешении, — чем сваливать в кучу десятки мыльных картинок низкого качества.
Если вы создаете синтетического (вымышленного) персонажа, и черты его лица на исходниках немного «пляшут», на выходе вы получите усредненную маску из всех этих лиц. Возможно, она не будет точь-в-точь совпадать с вашей задумкой, но для вымышленных героев это не так критично, как для реальных людей.
В большинстве случаев для создания отличной LoRA персонажа достаточно около 15 портретов и 10 изображений в полный рост.
Почему так важно четко понимать цель обучения
Чтобы натренировать качественную LoRA, необходимо предельно ясно осознавать свои цели. Вы должны определиться со следующим:
- Стиль арта: реализм, аниме и так далее.
- Тип LoRA: здесь я исхожу из того, что мы говорим о персонажах, но для других типов (стиль, поза, конкретный предмет или мульти-концептуальная LoRA) могут потребоваться совершенно иные настройки.
- Что является неотъемлемой частью личности героя и никогда не должно меняться? Цвет и укладка волос фиксированы или меняются? Наряд всегда один и тот же? Фон? Тип фигуры? Должна ли татуировка стать постоянным атрибутом персонажа, или её можно менять при генерации? Очки — это часть его образа или переменная деталь?
- Должна ли LoRA обучить модель совершенно новой концепции, или её задача — лишь детализировать уже знакомую (например, конкретное лицо)?
Тщательный сбор датасета
Опираясь на ответы из предыдущего пункта, приступайте к сборке датасета. Каждое изображение должно нести в себе крупицу новых данных для обучения. Вам понадобятся:
- Портреты анфас.
- Портреты в профиль.
- Портреты в три четверти.
- Вид сзади в три четверти.
- Ракурс сверху.
- Ракурс снизу.
- Крупный план глаз.
- Крупный план особых примет (родинки, татуировки и т.д.).
- Крупный план частей тела (например, пальцев рук и ног).
- Позы в полный рост для понимания пропорций тела.
- Позы в полный рост рядом с другими объектами (например, дверными проемами), чтобы задать относительный масштаб.
На каждом изображении целевой субъект должен выглядеть цельно и последовательно. Если татуировка — это часть образа, она обязана присутствовать на всех кадрах строго на одном и том же месте. Если у вашей аниме-героини всегда синие волосы, они должны быть синими на всех без исключения картинках датасета.
Всё остальное повторяться не должно! Меняйте фон от кадра к кадру. Меняйте одежду. И так далее.
Как правильно составлять текстовые описания (аннотации) к датасету
Аннотирование — критически важный этап. Во время обучения текстовые описания выполняют сразу несколько функций:
- Задают контекст тому, что именно изучает модель (особенно важно при экстремально крупных планах).
- Сообщают алгоритму, какие элементы являются переменными (вроде фона и одежды) и их следует проигнорировать.
- Предоставляют уникальное слово-триггер (trigger word) для усваиваемого материала, что позволяет разделять концепции, если их несколько.
- Подсказывают модели, какое из уже известных ей понятий эта LoRA призвана уточнить.
- Служат противовесом склонности нейросети к переобучению.
Для каждого изображения следует составлять описание на естественном языке (за исключением работы со старыми моделями вроде SD 1.5), но при этом текст должен оставаться лаконичным и сугубо фактическим.
Описание должно включать:
- Слово-триггер.
- Выражение лица / эмоцию.
- Ракурс камеры, угол наклона и масштаб.
- Освещение.
- Позу и фон (очень кратко, без лишних подробностей).
- Одежду [если только вы не хотите, чтобы наряд намертво привязался к LoRA, как костюм супергероя].
- Аксессуары.
- Прическу и цвет волос [если только они не являются константой для вашей LoRA].
- Действие.
Пример: «Портрет Lora1234, стоит в саду, улыбается, вид спереди на уровне глаз, естественное освещение, мягкие тени. На ней бежевый кардиган и джинсы. На заднем фоне размытые растения».
Можно ли вообще обойтись без текстовых описаний для персонажей? Плохая идея. Если ваш датасет абсолютно безупречен, в нем нет случайных повторений и экстремально крупных планов, а ключевой объект стабилен, вы, конечно, можете получить сносный результат. Но в противном случае вас ждут либо весьма посредственные генерации (на первых порах), либо абсолютно «дубовая», переобученная модель, если выкрутить шаги на максимум.
Можно ли просто прогнать автотегирование через нейросеть вроде JoyCaption? Не стоит полностью полагаться на автоматику (если только у вас не десятки тысяч изображений). Автоматические скрипты не понимают конечной цели вашей LoRA. Соответственно, они не могут грамотно отделить зерна от плевел: описать то, что предотвратит переобучение, и умолчать о том, что должно стать основой концепта.
Что такое ранг LoRA (размерность сети) и как его настроить
Ранг LoRA (network dim) — это объем «пространства», который мы выделяем для усвоения деталей.
- Используйте высокий ранг, если нужно запомнить много сложной информации.
- Используйте низкий ранг для простых задач.
- Как правило, ранга 32 хватает для большинства целей.
Тяжеловесные модели вроде Qwen генерируют объемные адаптеры, поэтому завышать ранг на них нет нужды.
Это важно, потому что:
- Если задать слишком высокий ранг, LoRA начнет впитывать лишний мусор из датасета. Модель станет негибкой, а артефакты будут «протекать» в генерации, поскольку сеть попыталась запомнить слишком много ненужных мелочей.
- Если задать слишком низкий ранг, LoRA просто перестанет усваивать новую информацию после определенного количества шагов.
Примеры:
- LoRA для персонажа (если учим только лицо): достаточно небольшого ранга вроде 16.
- LoRA в полный рост: потребуется ранг не меньше 32, а то и 64. Иначе модели будет тяжело корректно усвоить анатомию тела.
- Любая LoRA, добавляющая новую концепцию (а не уточняющая старую), требует больше «места», поэтому ставьте ранг выше стандартного.
- Для мульти-концептуальных LoRA также требуется повышенный ранг.
Параметр «Повторы» (repeats): что это и зачем он нужен
В процессе обучения нейросеть будет сотни раз зашумлять и восстанавливать изображения из датасета, сравнивая результат и корректируя свои веса. Параметр «повторы» (repeats) нужен лишь тогда, когда в вашем наборе есть картинки, которые алгоритм должен «видеть» с разной частотой.
Допустим, у вас есть 5 фотографий анфас и всего 2 в профиль. Вы рискуете переобучить вид спереди, и в будущем LoRA будет упрямиться или ломаться, когда вы попытаетесь сгенерировать другие ракурсы. Чтобы избежать этого:
- Поместите кадры анфас в первую папку датасета и задайте повторы x2.
- Поместите профили во вторую папку и задайте повторы x5.
Теперь и профили, и лица анфас будут обработаны поровну — по 10 раз каждое.
Экспериментируйте с умом:
- Старайтесь балансировать ракурсы в датасете.
- Если модель уже знакома с концепцией, ей требуется в 5–10 раз меньше показов, чем для совершенно нового понятия. Соответственно, картинки с неизвестными модели элементами следует повторять в 5–10 раз чаще. Если этого не сделать, вы получите либо жуткий боди-хоррор из-за недоученности новых деталей, либо «деревянное» переобучение того, что база и так прекрасно знала.
Что такое размер батча (batch) и аккумуляция градиента (gradient accumulation)
При обучении программа берет картинку из датасета, добавляет к ней шум и пытается понять, как вернуть исходное изображение. Если вы используете размер батча 2 (batch 2), алгоритм проделывает это сразу с двумя картинками, а затем усредняет полученные знания. В долгосрочной перспективе это повышает качество, так как помогает модели не зацикливаться на «экстремальных» выбросах.
- Размер батча (Batch) означает параллельную обработку изображений. Это требует значительно больше видеопамяти (VRAM) и мощности GPU. Количество шагов не увеличится, но каждый шаг станет дольше. В теории, модель учится быстрее, поэтому общее число шагов можно сократить.
- Аккумуляция градиента (Gradient accumulation) означает последовательную обработку — картинки идут одна за другой. Это не сжирает лишнюю видеопамять, но каждый шаг обучения займет вдвое больше времени.
Что такое LR (Learning Rate) и почему это критически важно
Аббревиатура LR означает «Скорость обучения» (Learning Rate), и это параметр номер один для тренировки любой LoRA.
Представьте, что вы срисовываете картину. Вы разбиваете холст на сетку из квадратов и копируете по одному квадратику за раз. LR — это то, насколько крупными «кусками» алгоритм поглощает информацию.
- Если кусок огромный, вы будете продвигаться семимильными шагами (потребуется меньше шагов обучения)... но мазки выйдут грубыми. Мелкие, изящные детали будут безвозвратно утеряны.
- Если кусок крошечный, вы сможете ювелирно передать самые тонкие нюансы... но работа займет целую вечность (потребуется много шагов).
Некоторые модели гораздо чувствительнее к высокому LR, чем другие. На Qwen-Image можно поставить LR 0.0003, и всё пройдет гладко. Попробуйте вбить тот же показатель в Chroma — и вы угробите свою LoRA за первую тысячу шагов.
Слишком высокий LR — причина номер один, по которой LoRA не может сойтись к нужному результату.
Однако каждый раз, уменьшая скорость обучения вдвое, вам придется удваивать количество шагов, чтобы компенсировать разницу. Поэтому, если LR 0.0001 требует 3000 шагов на одной модели, другой, более капризной нейросети, может понадобиться LR 0.00005, но шагов придется отмотать все 6000.
Для начала попробуйте LR 0.0001 — это довольно безопасная отправная точка.
Если ваш софт поддерживает планировщики скорости обучения (LR scheduling), используйте косинусный планировщик (cosine scheduler), чтобы автоматически стартовать с высоких значений и плавно снижать их по мере продвижения тренировки.
Как контролировать процесс обучения
Многие отключают генерацию тестовых изображений (семплинг / sampling), потому что это сильно затягивает процесс. Но если вы не гуру, способный предсказывать результат вслепую, это крайне скверная идея.
Семплинг помогает визуально отследить, насколько правильно идет схождение модели. Внимательно изучайте тестовые образцы во время тренировки: если вы видите, что они перестали улучшаться или, того хуже, начали деградировать — немедленно останавливайте процесс. Ваш LR прямо сейчас уничтожает LoRA. Разделите LR на два, накиньте еще несколько тысяч шагов и продолжайте (или начните заново, если продолжить невозможно).
Когда останавливать тренировку, чтобы избежать переобучения? Смотрите на семплы. Если вам кажется, что результат достиг отличной консистентности и на 95% совпадает с задумкой, а следующая пачка тестов не приносит реальных улучшений — пора жать на тормоз. Большинство программ сохраняют промежуточные версии LoRA после каждой эпохи (epoch). Вы можете дать алгоритму поработать еще немного на всякий случай, а затем просмотреть все сохраненные этапы и выбрать тот, где качество картинки максимально, а гибкость модели еще не утеряна.
Если у вас идеальные лица соседствуют с жуткими анатомическими мутациями — это верный признак того, что пропорции вашего датасета сбиты: одни кадры недоучены, а другие заучены до дыр.
Таймстепы (Timestep)
Существует несколько паттернов обучения; для LoRA персонажей выбирайте тип sigmoid.
Что такое датасет для регуляризации и когда он нужен
При обучении LoRA всегда есть риск, что базовая модель «забудет» уже известные ей концепции. Например, если вы тренируете сеть на фотографиях конкретной женщины, модель может разучиться рисовать любых других женщин.
Та же проблема возникает и при создании мульти-концептуальных LoRA. Сеть должна четко понимать, как выглядит триггер А, как выглядит триггер Б, и что значит «ни А, ни Б».
Именно для этого и нужен датасет регуляризации (regularization dataset). Большинство программ для обучения поддерживают эту функцию. Вы добавляете отдельную папку с изображениями того же общего класса (например, просто случайных женщин), которые не являются вашей целевой героиней. Этот набор данных позволяет модели, так сказать, освежить память и не выжечь свои базовые знания.
Надеюсь, это небольшое введение будет вам полезно!