Зачем это читать, если Stable Diffusion уже есть?
Потому что fine-tuning - это костыль. Вы берете модель, которая уже знает английский, котиков и аниме, и пытаетесь заставить ее рисовать что-то специфическое. Получается криво. Модель путает ваши объекты с тем, что уже знает. Нужно учить с чистого листа.
Photoroom в феврале 2026 выкатила детальное исследование. Они не просто обучили модель - они провели 127 абляций, чтобы понять, что на самом деле влияет на качество. И выложили код. Это редкий случай, когда компания показывает не маркетинговые картинки, а кишки процесса.
Абляция (ablation study) - это когда вы убираете один компонент системы и смотрите, насколько хуже становится. Если не становится - значит компонент бесполезен. Самый честный способ оптимизировать архитектуру.
Что сломалось в классическом подходе?
Возьмем стандартный рецепт обучения тексто-изображение моделей на 2025 год. U-Net архитектура, CLIP текстовый энкодер, диффузия. Обучаем на LAION-5B. Ждем месяц. Получаем модель, которая рисует... примерно то же, что и Stable Diffusion, но с артефактами.
Проблема в трех местах:
- Текстовый энкодер замораживают - он никогда не учится понимать ваши данные
- Оптимизатор AdamW с дефолтными параметрами - сходится медленно и к субоптимуму
- Нет контроля над распределением скрытых переменных - модель генерирует однообразно
Photoroom убрала эти ограничения. Их модель (PRX) показывает FID 8.3 на COCO против 12.1 у базового Stable Diffusion 3.5. Разница видна невооруженным глазом.
Рецепт, который работает: PRX от Photoroom
PRX - это не революционная архитектура. Это грамотная сборка известных компонентов плюс три ключевые модификации.
1Текстовый энкодер учится вместе со всем
Самая очевидная и самая игнорируемая идея. CLIP тренировали на интернет-картинках с подписями. Ваш датасет другой. Если энкодер заморожен - он будет неправильно кодировать ваши описания.
В PRX текстовый трансформер инициализируется весами от CLIP-ViT-L/14, но дальше обучается. Learning rate в 10 раз меньше, чем у U-Net, но он учится.
2PRX-регуляризация вместо стандартного шума
В диффузионных моделях добавляют гауссовский шум на каждом шаге. PRX добавляет еще один компонент - регуляризацию по распределению скрытых переменных.
Формула простая, но эффект огромный:
# Упрощенная версия PRX регуляризации
def prx_regularization(z_t, z_0, t):
# z_t - латент на шаге t
# z_0 - исходный латент
# t - шаг диффузии
# Контроль дисперсии
var_loss = torch.abs(z_t.var() - target_var)
# Контроль корреляций между каналами
z_flat = z_t.flatten(start_dim=1)
corr_matrix = torch.corrcoef(z_flat.T)
corr_loss = torch.norm(corr_matrix - torch.eye(corr_matrix.size(0)))
return var_loss + 0.1 * corr_lossЭту регуляризацию добавляют к основному loss. Вес - 0.01 от основного. Кажется мелочью, но без нее модель генерирует изображения с артефактами в 37% случаев.
3Адаптивный планировщик learning rate
Не Cosine, не Linear. Photoroom использует комбинацию:
- Первые 10% шагов: warmup от 1e-6 до 1e-4
- Следующие 60%: постоянный 1e-4
- Последние 30%: экспоненциальный спад до 1e-6
Почему так? Абляции показали, что Cosine annealing слишком агрессивно снижает LR в середине обучения. Модель перестает учиться новым концепциям, только полирует уже выученное.
Пошаговый план: от данных до инференса
Теперь соберем все вместе. Если хотите повторить - готовьте 4-8 A100 на месяц или 4090 на три месяца.
Шаг 0: Подготовка данных
Не используйте LAION целиком. Возьмите подмножество с высоким CLIP score. Photoroom фильтровала так:
# Фильтрация датасета по качеству
def filter_dataset(dataset, clip_threshold=0.25):
filtered = []
for image, caption in dataset:
# Вычисляем CLIP score между изображением и текстом
clip_score = compute_clip_score(image, caption)
# Убираем мемы, скриншоты, низкокачественный контент
if clip_score > clip_threshold:
filtered.append((image, caption))
return filteredИдеальный размер датасета - 50-100 миллионов пар. Меньше - модель не выучит разнообразие. Больше - обучение слишком долгое без существенного прироста качества.
Важно: если собираете датасет для специфической задачи (например, медицинские изображения), начинайте с 1-2 миллионов пар. Полный рецепт с нуля требует общего датасета. Для тонкой настройки лучше использовать техники создания LoRA датасетов.
Шаг 1: Архитектура
Берем U-Net с cross-attention слоями для текста. Размеры:
- Input: 256x256 или 512x512 (больше - в 4 раза дольше обучение)
- Channels: 320 в bottleneck
- Attention heads: 8
- Dropout: 0.1 (не 0.0, это важно)
Текстовый энкодер: ViT-L/14 с дообучением.
Шаг 2: Инициализация
Не инициализируйте веса случайно. Возьмите предобученные:
- U-Net: из Stable Diffusion 3.5
- Text encoder: из CLIP-ViT-L/14
- VAE: заморозить, не обучать
Это сокращает обучение с 1 месяца до 2-3 недель.
Шаг 3: Тренировка
Конфиг для PyTorch:
# Основные гиперпараметры PRX
config = {
'batch_size': 2048, # эффективный, через gradient accumulation
'actual_batch': 32, # на GPU
'accumulation_steps': 64,
'lr_unet': 1e-4,
'lr_text': 1e-5, # в 10 раз меньше
'optimizer': 'AdamW',
'betas': (0.9, 0.999),
'weight_decay': 0.01,
'prx_weight': 0.01, # вес регуляризации
'target_var': 1.0, # целевая дисперсия латентов
'warmup_steps': 10000,
'total_steps': 500000,
'mixed_precision': 'bf16', # не fp16!
}Следите за loss. Должен падать плавно, без скачков. Если скачки - уменьшите LR или увеличьте вес регуляризации.
Шаг 4: Валидация
Не ждите конца обучения. Каждые 5000 шагов:
- Генерируйте 1000 изображений по фиксированным промптам
- Считайте FID с COCO validation
- Считайте CLIP score
- Визуально оценивайте 20 случайных генераций
Если FID перестал улучшаться 3 проверки подряд - скорее всего, обучение сошлось.
Ошибки, которые сломают вашу модель
Из абляций Photoroom: что НЕ делать.
| Ошибка | Эффект | Как исправить |
|---|---|---|
| Замораживание текстового энкодера | Модель не понимает специфичные промпты | Разморозить, LR = 1e-5 |
| Dropout = 0.0 | Переобучение, артефакты на краях | Поставить 0.1-0.2 |
| Слишком большой LR | Loss скачет, модель не сходится | Начать с 1e-6, warmup до 1e-4 |
| Нет регуляризации латентов | Однообразные генерации | Добавить PRX или KL дивергенцию |
| fp16 вместо bf16 | Потеря точности, NaN | Использовать bf16 на Ampere+ |
Самая коварная ошибка: обучение на неотфильтрованном датасете. Модель выучит мемы, водяные знаки, скриншоты интерфейсов. Потом будет генерировать это в случайных местах.
А если хочется быстрее и дешевле?
Полное обучение с нуля - для research или больших компаний. На практике чаще нужно:
- Дообучить на специфичных данных - используйте LoRA или Dreambooth. Меньше ресурсов, быстрее результат.
- Сменить текстовый энкодер - если модель плохо понимает ваш домен, замените CLIP на что-то специализированное.
- Использовать distillation - обучите маленькую модель повторять выход большой.
Для большинства задач хватит fine-tuning существующей модели. Например, локальные аналоги DALL-E уже достаточно хороши.
Но если нужно качество уровня коммерческих продуктов - учите с нуля. Разница в FID 8.3 vs 12.1 - это разница между "похоже" и "неотличимо от реальности".
Код и что с ним делать
Photoroom выложила код на GitHub. Не просто скрипты, а полный пайплайн:
- Подготовка данных с фильтрацией
- Тренировка с PRX регуляризацией
- Валидация и метрики
- Экспорт в Diffusers формат
Код написан на PyTorch 2.4 (актуально на февраль 2026). Работает на GPU от 24GB VRAM. Для полного датасета нужно 4-8 карт.
Самое ценное в коде - не архитектура, а конфиги. Точные гиперпараметры, которые прошли 127 абляций. Можно взять и использовать для своей модели.
Внимание: код требует глубокого понимания диффузионных моделей. Если только начинаете - лучше сначала разберитесь с обучением LLM. Принципы похожи, но LLM проще для старта.
Что будет дальше?
PRX - не конечная точка. На горизонте:
- Мультимодальные энкодеры - вместо отдельного текстового и визуального
- Квантование во время обучения - чтобы сразу получать эффективные модели
- Самовосстанавливающиеся архитектуры - когда модель детектирует артефакты и исправляет их
Но фундамент уже есть. Рецепт от Photoroom показывает: чтобы обучить хорошую тексто-изображение модель, нужны не супер-архитектуры, а внимание к деталям. Разморозить энкодер. Добавить регуляризацию. Настроить LR schedule.
Кажется простым. Пока не попробуешь и не увидишь, насколько каждый из этих пунктов влияет на результат.
И последнее: если решитесь на полное обучение - настройте мониторинг. Loss, FID, генерации. Каждые 5000 шагов. Иначе потратите месяцы вычислений и получите модель, которая рисует хуже, чем Stable Diffusion 2019 года. Такое уже бывало.