Введение в ключевые концепции обучения LoRA — Часть 2: Аннотирование
ЧАСТЬ 2 ==== РУКОВОДСТВО ПО СОСТАВЛЕНИЮ ОПИСАНИЙ ====
Как грамотно аннотировать ваш датасет
Теперь, когда вы собрали свой датасет, пришло время составить к нему текстовые описания.
Зачем нужны текстовые описания?
Вот что происходит, когда программа обучает вашу LoRA:
- Она добавляет шум к изображениям из датасета на случайно выбранных шагах.
- Затем модель пытается воссоздать предыдущий, «более чистый» шаг изображения. Она убирает шум, опираясь на сигнал ваших описаний, пропущенных через текстовый кодировщик (T5). Нейросеть словно спрашивает себя: «Учитывая этот уровень шума и это текстовое описание, каким должен быть мой прогноз?»
- Результаты этих корректировок записываются в LoRA и связываются с сигнальными токенами из ваших описаний.
Таким образом, текстовые описания — это абсолютно незаменимый элемент процесса.
Позвольте сказать ПРЕДЕЛЬНО ЯСНО: ОПИСАНИЯ КРИТИЧЕСКИ ВАЖНЫ. То, как именно вы аннотируете свой датасет, определит успех или провал вашей LoRA. Сразу после сбора качественных изображений, именно описаниям следует уделить максимум внимания. Читайте внимательно.
Во время обучения текстовые описания выполняют для LoRA сразу несколько задач:
- Задают контекст того, что именно изучает модель (это особенно важно при работе с экстремально крупными планами).
- Указывают программе обучения, какие элементы должны оставаться изменяемыми и прописываться в промпте при генерации; такие элементы будут исключены из слова-триггера LoRA.
- Создают уникальное слово-триггер для всего, что предстоит выучить модели.
- Позволяют разграничивать концепты, если модель изучает сразу несколько объектов.
- Подсказывают модели, какие из уже известных ей концептов эта LoRA призвана улучшить.
- Противодействуют склонности алгоритма к переобучению (overtraining).
Что именно нужно описывать?
Описание к каждому изображению должно быть написано на естественном языке (за исключением старых моделей вроде SD1.5 и SDXL, которые предпочитают короткие теги), но при этом оставаться кратким и по существу.
Оно должно включать:
- Слово-триггер — уникальное, выдуманное слово, которое еще не знакомо модели.
- Выражение лица или эмоцию персонажа.
- Ракурс камеры, высоту съемки и масштаб.
- Тип и угол источника света (это позволяет модели понять, почему один и тот же предмет имеет разный цвет на двух разных фотографиях в датасете).
- Позу и фон (очень кратко, без лишних деталей).
- Одежду (если только вы не хотите, чтобы этот наряд намертво впечатался в саму LoRA — как, например, костюм аниме-супергероя).
- Аксессуары.
- Прическу и цвет волос (опять же, если вы не хотите, чтобы они стали неотделимой частью LoRA).
- Действие.
Отличный шаблон выглядит так: <тип плана> <триггер>, вид <ракурс> на высоте <высота съемки>, с <цвет волос и прическа>, одета в <одежда и аксессуары>. Она <поза или действие>, выражает <эмоция>. <Описание освещения>, <краткое описание фона>.
Вот несколько примеров:
Портрет LoraTrigger1234, снятый с близкого расстояния чуть сверху. Она смотрит вверх на камеру со спокойным выражением лица. Яркий прямой солнечный свет, влажная кожа. У нее каштановые волнистые волосы, слегка влажные. На плечах видны черные бретельки. На фоне бирюзовая вода бассейна.
Средний план LoraTrigger1234, стоящей в саду и улыбающейся; вид спереди на уровне глаз, естественное освещение, мягкие тени. На ней бежевый кардиган и джинсы. На заднем плане размытая зелень.
Ростовой снимок LoraTrigger1234 в профиль, снятый чуть выше уровня глаз. Она сидит на уступе у бетонной стены, колени подтянуты, ноги скрещены в лодыжках, корпус откинут на стену, взгляд направлен прямо в камеру, выражение лица спокойное, с легкой улыбкой. Теплый янтарный искусственный свет сверху, глубокие тени. У нее длинные темные волнистые волосы, ниспадающие ниже плеч. На ней черная кожаная куртка, короткая черная юбка с оборками и черные ботильоны на шнуровке, видны голые ноги. На заднем плане бетонная стена туннеля с граффити.
Средний план LoraTrigger1234, снятый в три четверти. Она стоит прямо, обе руки спрятаны в карманы брюк, взгляд направлен вперед и немного вверх. Серьезное, невозмутимое выражение лица. Мягкий рассеянный свет спереди, почти белый нейтральный фон. У нее короткие темные волнистые волосы до подбородка. На ней черный приталенный пиджак поверх черного топа и черные брюки.
Ключевая логика составления описаний
Если вы пишете в описании «trigger1234 со светлыми волосами», вы подаете три сигнала: триггер, светлые, волосы. Модель берет ваше изображение, добавляет к нему немного шума, а затем пытается угадать, каким был предыдущий шаг, опираясь на слова «trigger1234», «светлые» и «волосы». Когда догадка оказывается верной (результат похож на оригинальную картинку), нейросеть записывает изменения, или дельту, в каждый токен ==> вот как выглядит понятие «светлые», вот как выглядит понятие «волосы», а вот так выглядит «trigger1234».
Таким образом, упоминая в тексте светлые волосы, вы гарантируете, что информация о волосах не вольется в сигнал самого триггера.
Всё, что вы описываете, помечается как переменная величина — модель усваивает, что эти элементы могут меняться.
А вот то, что вы НЕ описываете, безмолвно поглощается идентичностью вашего слова-триггера — модель усваивает, что эти детали неизменны. Это делается намеренно, и это крайне важно. Если вы хотите, чтобы цвет волос намертво закрепился за вашим персонажем, просто не упоминайте его в описании. Если же вы хотите, чтобы пользователь мог менять цвет волос при генерации, обязательно опишите его. Лицо при этом не следует описывать никогда — оно является основой личности объекта и должно быть усвоено исключительно внутри токена триггера.
Об описании цвета и освещения
Описывайте фактический цвет того, что находится в кадре, а не абсолютный цвет объекта в отрыве от освещения.
Белая стена при свете ламп накаливания кажется желтой. Черная одежда в синем окружающем освещении выглядит темно-синей. Если вы описываете то, что видите, а не истинный цвет материала, вы жестко программируете взаимодействие света как неизменное свойство самого объекта.
Поэтому, если на фото ваш персонаж с пепельно-белыми волосами стоит под красной неоновой вывеской, не пишите «красные волосы»: это сливает воедино две разные сущности, и модель не сможет их распутать. Вместо этого напишите: «белые волосы, красный неоновый свет». Этот принцип распространяется на тон кожи под цветным освещением, цвет ткани при не нейтральном свете и на любые ситуации, где окружающий цвет искажает ваше восприятие истинной палитры материала. Опишите саму вещь, а затем опишите свет, который на нее падает.
О негативных описаниях
Описывайте то, что присутствует на изображении, а не то, чего там нет. «Обнаженный торс, в штанах» — это правильно. «Только в штанах» — слабее: слово «только» вынуждает модель логически вычислять отсутствие других элементов, а это куда более сложная задача, чем простое считывание видимого контента. То же самое относится к освещению: «ровный плоский свет» работает лучше, чем «без теней». «Нейтральное выражение лица» сильнее, чем «не улыбается». Всякий раз, когда вы ловите себя на использовании отрицаний или ограничений в тексте, спросите себя: нельзя ли заменить их утвердительным описанием того, что действительно видно? Описывайте лишь то, что находится в кадре: если одна рука скрыта из-за ракурса, не упоминайте её.
Описание сложных поз
Когда на изображении представлена необычная или сложная поза, боритесь с искушением подобрать для нее одно-единственное меткое слово. Разбейте позу на опорные точки: куда перенесен вес, где находятся руки, под каким углом наклонено туловище, как повернута голова. «Сидит на земле со скрещенными ногами, корпус откинут назад, одна рука упирается в землю позади, принимая на себя вес, подбородок слегка приподнят» — такое описание не оставляет пространства для двусмысленности и напрямую соотносится с геометрией кадра.
Использование уникального слова-триггера
Ваше слово-триггер должно быть абсолютно уникальным и бессмысленным — это не должно быть реально существующее слово или имя, с которым у модели уже есть какие-то ассоциации. «Lora1234» или «XJ7Kappa» — отличные варианты. «Елена» или «воин» — плохие: нейросеть уже знает их значение, и если вы будете их использовать, процессу обучения вашей LoRA придется буквально сражаться с прежними знаниями модели, пытаясь заставить ее забыть старое. Слово-триггер обязано присутствовать в каждом без исключения описании, каждый раз.
Особый случай: Описание экстремально крупных планов
Экстремально крупные планы требуют особого подхода, поскольку при сильном приближении контекст разрушается. На обычном портрете модель без труда понимает, что лицо принадлежит вашему персонажу. Но на макроснимке глаза она лишена пространственного контекста: нейросеть видит глаз, но понятия не имеет, чей он, как он соотносится с остальным телом, и вообще, является ли это увеличенной деталью или просто макрофотографией.
При работе с крупными планами вашим описаниям придется взять на себя дополнительную нагрузку:
- Прямо укажите масштаб: «экстремально крупный план», «детальный макроснимок» и т. д.
- Прямо назовите, какая часть тела или черта лица показана в кадре.
- Привяжите её к триггеру с помощью принадлежности: «левый глаз Lora1234», а не просто «глаз».
Пример:
Экстремально крупный план левого глаза LoraTrigger1234
Поскольку я хочу, чтобы всё на этом макроснимке глаза стало частью её идентичности, мне не нужно ничего описывать дополнительно. Однако, если бы на лице был макияж, мне пришлось бы упомянуть его в описании крупного плана, чтобы оставить его переменной величиной.
Предупреждение: здесь часто возникает путаница
Ранее мы говорили: то, что вы описываете, становится переменной величиной, а то, что пропускаете — впечатывается в триггер. Но сейчас мы призываем вас описать глаз на крупном плане, хотя глаза — это часть лица, и они должны усваиваться внутри триггера, а не становиться переменной. В этом и заключается огромная разница между аннотированием обычного изображения и описанием макроснимка. На экстремально крупном плане контекст рушится — модель не может установить принадлежность без вашей помощи. Решением становится притяжательная привязка: «глаз LoraTrigger1234» не описывает переменную черту, он описывает атрибут САМОГО триггера. Именно притяжательная форма выполняет критически важную работу, давая LoRA контекст, необходимый для того, чтобы связать этот глаз с конкретным персонажем.
Споры вокруг аннотирования
На форумах и в сообществах не утихают споры, которые часто сводят проблему к бинарному выбору: либо использовать в описаниях только слово-триггер (то есть, по сути, вообще отказаться от описаний), либо полностью положиться на авто-аннотирование с помощью LLM (слепо описывать всё подряд). Люди клянутся верностью одному из подходов и бесконечно ломают копья. Но ошибаются оба лагеря, ведь это далеко не ситуация «или-или».
Неправильный подход: Использование только триггера без описаний
Если вы вообще не используете описания (оставляя лишь триггер), то всё, что модель извлекает из каждого изображения датасета, неизбежно проваливается в сигнал триггера — включая нежелательные или противоречивые элементы.
Оставляя в каждом описании одно только слово-триггер, вы лишаете модель контекста о том, что должно быть переменной. Любая деталь, которая повторяется в вашем датасете, рискует быть поглощенной идентичностью триггера, будь то фоны, наряды или условия освещения. Вы полностью теряете контроль над тем, что усваивается намертво, а что остается гибким. На очень тщательно выверенном датасете результаты могут выглядеть сносно, но ваша LoRA получится «деревянной», и с ней будет крайне сложно работать творчески.
Неправильный подход: Использование описаний как промптов
Что происходит, когда вы используете невероятно длинные, витиеватые описания, словно пытаетесь сгенерировать эту картинку с нуля? Вы получаете тонну токенов, которые просто размывают сигнал. Каждый раз, сравнивая потери на изображении, алгоритм вынужден решать, к какому из этих бесчисленных токенов привязать погрешность. В итоге вы вымываете из своей LoRA вообще всё, включая реалистичный стиль и то, как свет ложится на лицо объекта. Всё, что у вас останется — это посредственная модель, в которой абсолютно всё нестабильно и не способно выдать единообразный результат.
Кроме того, вы заставляете программу обучения работать вхолостую. Например, если на девушке красный шарф, а вы пишете: «На ней красивый шелковый красный шарф со сложным тканым узором», то модель и алгоритм обучения начинают отчаянно вычислять, какие именно пиксели здесь красные, какие отвечают за шарф, какие за сложность, какие за тканый узор... Вся эта вычислительная мощность тратится впустую, ведь всё, чего вы хотели добиться — просто не дать шарфу впечататься в ваше слово-триггер.
Вот почему полностью автоматическое аннотирование с помощью инструментов вроде JoyCaption — это ошибка. Они описывают абсолютно всё, что видят. Это идеально подходит для создания данных под файнтюн (finetune) модели, но в корне неверно для обучения LoRA.
Правильный подход лежит в стороне от крайностей. Используйте авто-аннотирование для первого прохода, чтобы сэкономить время, особенно на объемных датасетах. Но затем обязательно проведите тщательную ручную вычитку каждого описания. Впишите слова-триггеры, осознанно решите, что именно следует, а что не следует описывать, опираясь на ваши конечные цели, и добейтесь строгой согласованности во всем тексте.