
Диффузионные модели перевернули мир генеративного искусственного интеллекта, вытеснив GAN'ы и вариационные автоэнкодеры. Но как они работают? Чем отличаются друг от друга? И как научиться их использовать?
Эта статья — путеводитель для тех, кто хочет разобраться в диффузионных моделях с нуля. В ней вы найдете три подхода к изучению:
Теоретический трек — для тех, кто хочет глубже понять архитектуру и принципы работы моделей
Практический трек — для желающих быстро освоить генерацию изображений с помощью доступных онлайн‑инструментов
Продвинутый практический трек — для тех, кто хочет погрузиться в кастомизацию, промпт‑инжиниринг, работу с моделями с помощью open‑source инструментов и на уровне кода
Вы узнаете, как устроены современные диффузионные модели под капотом, разберетесь в механике их генерации, научитесь правильно писать промпты и разбираться в параметрах генерации. Также научитесь выбирать удобные сервисы для творчества и инструменты для более глубокой работы с моделями.
Прочитав эту статью, вы сможете не только генерировать впечатляющие изображения, но и осознанно подходить к выбору модели и методов работы с ней.
Оглавление:
Введение
Теоретический трек
Практический трек
Продвинутый практический трек
Краткое резюме
Введение

Для начала давайте быстро разберемся с принципом работы диффузионных моделей и поймем почему они создают «вау эффект», а потом уже встанем на перепутье. В максимально упрощенном варианте обучение диффузионных моделей можно условно разделить на 2 этапа:
Процесс прямой диффузии — добавление гауссова шума к изображению
Процесс обратной диффузии — удаление гауссова шума с изображения
Как добавлять шум допустим несложно понять, но как происходит обратный процесс? Расшумление изображения не поддается прямому вычислению, поэтому мы хотим обучить нейронную сеть (U‑Net) для аппроксимации этого процесса. Про то, что из себя представляет U‑Net можно почитать в оригинальной статье или же немного в упрощенном варианте на примере картинок с котиком здесь.
Теперь возвращаемся к обучению нейросети процессу диффузии. Для этого под каждое генерируемое изображение будет выбран случайный временной шаг. После чего, в соответствии с числом шагов, на изображение накладывается гауссов шум, и в конце наши временные шаги преобразуются в векторы (эмбеддинги). Таким образом на вход нейросетки подаются пары: зашумленное изображение и соответствующий ему временной шаг.
![Процесс обучение нейронной сети [источник] Процесс обучение нейронной сети [источник]](https://habrastorage.org/r/w1560/getpro/habr/upload_files/124/d1e/855/124d1e855b7ec583a1f8bb314f877401.png)
Отлично, теперь наша нейросеть знает как выглядит зашумленное изображение на каждом временном шаге. Чтобы выполнить процесс обратной диффузии нам достаточно итеративно «вычитать» из зашумленного изображения предсказанный нейросетью гауссов шум. Преимущественно для базового понимания принципа работы диффузионных моделей этого достаточно, но для тех, кто хочет углубиться — переходим к следующему разделу.
Теоретический трек
Как мы уже поняли, процесс диффузии поэтапно передает полноразмерное изображение в нейронную сеть U‑Net для получения конечной картинки. Однако из‑за такого подхода скорость работы модели снижается при увеличении количества шагов диффузии и размера изображения. Почему это так? Давайте разберемся. Скажем у нас есть изображение размером 1024×1024, которое состоит из 1 048 576 пикселей и имеет 3 канала для цветов. Если работать с таким изображением в лоб, то процесс займет достаточно много времени и вычислительных ресурсов. Отсюда возникает идея выполнять процесс диффузии в каком‑то уменьшенном масштабе, в сжатом виде, чтобы сэкономить и уменьшить время генерации.
![Схема работы с изображением в латентном пространстве [источник] Схема работы с изображением в латентном пространстве [источник]](https://habrastorage.org/r/w1560/getpro/habr/upload_files/071/bf5/fcf/071bf5fcfc4ccb476f8acd2ff83bfc31.png)
Пусть прямой и обратный процессы диффузии у нас будут выполняться в так называемом латентном пространстве. Получается, что у нас теперь под капотом диффузионной модели не только U‑Net для предсказания шума на каждом шаге диффузии, но и 2 новых элемента — энкодер и декодер. Энкодер соответственно сжимает изображение, а декодер, учится разжимать его до исходного состояния с максимальной точностью. Строго говоря, комбинация этих 2-х подсеток является моделью автоэнкодера (Variational Autoencoder, VAE). Более подробно про то, что это такое и как устроено можно почитать здесь. Прочитав главу из замечательного Яндекс Хэндбука вы узнаете про построение и обучение моделей VAE и CVAE, чего будет с лихвой достаточно для общего представления о них (архитектура, как картинки превращаются в объекты в латентном пространстве и что это вообще такое, вывод формулы функции потерь). Также там есть обзоры интересных работ, связанных с VAE, примеры реальных моделей. Рекомендую выделить на это время, так как, рассмотрев реальные примеры, вы достаточно сильно забустите понимание того, что такое модель «Вариационный автоэнкодер» и для каких задач она используется.
А мы движемся дальше, собирая по частям архитектуру современных диффузионных моделей. Настоящая мощь диффузионок заключается в том, что они могут генерировать не только случайные изображения (безусловная генерация), но и изображения на основе различных типов входных сигналов, будь то текст или же изображение (conditional generation). Достигается это за счет механизма Cross Attention, подробнее про него можно почитать в статьях [1], [2], [3]. Иными словами модель обращает внимание на текстовые подсказки, на изображения и прочие условия, которые подаются на вход. Однако нам всё ещё кое‑чего не хватает, а именно — текстового энкодера, ведь нам необходимо однообразие входных данных, поэтому мы всё переводим в эмбеддинги. Также мы хотим генерировать картинки с каким‑то входным условием, например, текстом (text‑to‑image генерация). Для решения этой задачи в современных моделях, как правило, используется CLIP (Contrastive Language‑Image Pre‑Training) — нейронная сеть от OpenAI обученная на парах текст‑изображение. Именно благодаря клипу диффузионные модельки могут достаточно хорошо генерировать изображения на основе наших промптов (кстати про то, как их правильно писать будет сказано в 3-ем разделе). Для более подробного ознакомления с теорией работы CLIP можно обратиться к оригинальной статье от OpenAI.
Итак, давайте подведем некий итог того, что у нас получилось. Мы рассмотрели процесс прямой и обратной диффузии изображения, поняли зачем нам в архитектуре Энкодер и Декодер, и рассмотрели как обрабатываются условия для генерации. Теперь соберем всё это в одного большого мега рейнджера.
![Базовая архитектура современных диффузионных моделей [источник] Базовая архитектура современных диффузионных моделей [источник]](https://habrastorage.org/r/w1560/getpro/habr/upload_files/890/d7c/543/890d7c543d1ce54a4b0fe3e0d0012283.png)
Процесс генерации выглядит следующим образом: получаем на вход текстовое описание (условие для генерации), переводим его в текстовые эмбеддинги с помощью модели CLIP, выбираем случайный шум в латентном пространстве, выполняем обратный процесс диффузии с помощью предобученной нейросети, обращая внимание на условие, и, в конечном итоге, декодируем расшумленное изображение в привычный нам размер (например, 512×512 или 1024×1024). Опять таки, для глубокого понимания математики можно вновь обратится к Яндекс Хэнбуку в параграф по диффузионкам.
Последнее, о чем хочется упомянуть в этом разделе — что такое IP‑Adapter и ControlNet. Это относительно новые модели которые используются как внешние расширения (plug‑ins) для диффузионных моделей, влияя на U‑Net и процесс обработки условий.
![Виды ControlNet [источник] Виды ControlNet [источник]](https://habrastorage.org/r/w1560/getpro/habr/upload_files/88b/1af/8cb/88b1af8cb73e7d63bc1a88bfbb72c86a.png)
ControlNet — это расширение для диффузионных моделей, которое позволяет точно контролировать структуру генерируемого изображения на основе дополнительных условий (например, позы, контуров, глубины и т. д.). В стандартном варианте текстовые подсказки влияют на изображение косвенно — модель с помощью энкодера интерпретирует текст и пытается создать изображение, соответствующее заданному описанию. Однако, если нужно сохранить жёсткие структурные элементы (позу человека, композицию или контуры), стандартная архитектура не гарантирует точного соблюдения этих условий. ControlNet решает эту проблему, добавляя к архитектуре диффузионной модели дополнительную сеть, которая фиксирует и передаёт структурные особенности изображения. Вместе с привычным нам промптом на вход в модель ещё подается «контрольное изображение», которое прогоняется через дополнительную копию U‑Net. Но эта копия не изменяется — её веса «заморожены». Она нужна не для генерации изображения, а для того, чтобы извлечь полезную информацию из контрольного изображения — например, где находится каждая часть тела или как расположены линии контуров.
![Управление генерацией с помощью дополнительных условий [источник] Управление генерацией с помощью дополнительных условий [источник]](https://habrastorage.org/r/w1560/getpro/habr/upload_files/69d/de7/07c/69dde707c6365c3c02788c5f33d7af0d.png)
Извлеченная информация, называемая картой признаков (feature map), передаётся обратно в основную модель. На каждом этапе диффузии, когда основная модель удаляет шум, она использует эти карты как ориентир, чтобы изображение не отклонялось от заданной структуры. Благодаря этому изображение постепенно формируется так, чтобы не только соответствовать текстовому описанию, но и сохранять структуру, заданную контрольным изображением. Например, если вы просите модель сгенерировать девушку в красном платье, сидящую на стуле, и добавляете какую‑то конкретную позу с помощью контрольного изображения — ControlNet гарантирует, что поза будет именно такой, как вы и хотели, вот собственно и всё. Если же вам интересно почитать про то, как создавался ControlNet, то переходите по ссылочке.
![Примеры работы IP-Adapter [источник] Примеры работы IP-Adapter [источник]](https://habrastorage.org/r/w780q1/getpro/habr/upload_files/e4a/471/d02/e4a471d02aa41c297fcfa68996ef38ab.jpeg)
Если ControlNet помогает жёстко контролировать структуру изображения, то IP‑Adapter (Image Prompt Adapter) — это дополнительный модуль, который позволяет модели учитывать стиль, цветовую гамму и общую композицию из референсного изображения, но без жёсткой привязки к форме. Вместо того чтобы подавать модели текстовую подсказку и контрольное изображение с чёткой структурой (как в ControlNet), здесь в качестве условия используется «референсное изображение». Например, вы хотите создать свой портрет в стиле конкретного фото — IP‑Adapter помогает модели уловить и передать особенности стилевого изображения.
![Перенос стиля с помощью IP-Adapter [источник] Перенос стиля с помощью IP-Adapter [источник]](https://habrastorage.org/r/w1560/getpro/habr/upload_files/b5a/69a/a62/b5a69aa62253a104108fbae56efd4a2a.png)
IP‑Adapter не использует отдельную копию U‑Net, как это делается в ControlNet. Вместо этого он работает через более лёгкий механизм — MLP‑адаптер (многослойный перцептрон), который подключается к процессу генерации. На вход подаётся референсное изображение, и через предварительно обученную модель (например, CLIP Vision) извлекаются эмбеддинги изображения. Затем эти эмбеддинги проходят через MLP‑адаптер — небольшую нейросеть, которая преобразует их в форму, удобную для использования внутри модели диффузии. Эти преобразованные эмбеддинги добавляются в cross‑attention механизм основной модели и теперь на каждом этапе генерации модель не только ориентируется на текст, но и учитывает особенности референсного изображения — его стиль, цветовую палитру и общую структуру. Ключевое отличие от ControlNet заключается в том, что IP‑Adapter даёт модели мягкое руководство: он не требует точного соответствия форме, но помогает сохранить стиль референсного изображения. Опять таки, за подробностями об идее создания IP Адаптеров обращаемся к оригинальной статье.
А уже в следующем разделе мы рассмотрим как можно самостоятельно, ничего не устанавливая, погенерировать классные картинки, где можно скачать уже созданные людьми изображения, ну и просто примеры генерации.
Практический трек
Итак, давай поглядим, где и как можно быстро начать что‑то генерировать без особых усилий. Самое первое, что приходит в голову это Hugging Face Spaces — песочница для тестирования моделей. Hugging Face предлагает огромное количество спейсов, где можно попробовать разные модели без регистрации и оплаты. Здесь можно найти как официальные версии Stable Diffusion и FLUX, так и кастомные сборки с уникальными настройками.
Два основных спейса, где можно потыкать современные диффузионные модели — это страницы ИИ компаний, занимающихся как раз этими моделями. Первая, небезызвестная, британская компания Stability AI — тут вы найдете спейсы основных моделей, в которых сразу можно будет что‑то погенерировать, но придется разумеется подождать какое‑то время, генерация не моментальная.

Вторая очень крутая моделька это естественно FLUX от компании Black Forest Labs — как и в предыдущем случае, на странице компании есть доступ к спейсам различных вариаций модели, но это только вершинка айсберга.

Также вы можете самостоятельно в поиске на Hugging Face вбить «Stable Diffuison» или «FLUX» или любое другое название модели и найдете нужный под вашу задачку спейс. Можно заниматься переносом стиля с одного изображения на другое, можно апскейлить изображения, удалять ненужные объекты, генерить гифки, добавлять эффекты (реализм, аниме стиль) и многое, многое другое.
Главное преимущество — полная свобода экспериментов: вы можете пробовать разные модели, настраивать параметры и сравнивать результаты. Сервис подойдет вам в случае:
Если хотите быстро протестировать разные модели и их возможности
Если не хотите устанавливать ПО и разбираться в сложных настройках
Если нужно быстрое и бесплатное решение
