Все алгоритмы, о которых мы говорили до сих пор — линейная регрессия, бустинг, свёрточные сети — анализируют данные. Они берут картинку и говорят «кошка», берут таблицу и предсказывают число. Но самая заметная часть современного AI делает обратное: она создаёт данные. Stable Diffusion рисует картины по текстовому описанию, DALL-E придумывает логотипы, Midjourney генерирует портреты. Как?
Эта статья — про генеративные модели: три волны технологий, каждая из которых решала проблему предыдущей. Мы пройдём от автокодировщиков (размыто, но просто) через GAN (остро, но капризно) к диффузии (стабильно и управляемо). И — спойлер — мы снова встретим знакомый паттерн: итеративное улучшение, который мы уже видели и в бустинге, и в остаточных связях ResNet.
1. Задача: научиться создавать новое
Сформулируем задачу честно. У нас есть набор данных — скажем, тысячи фотографий лиц. Мы хотим обучить модель, которая генерирует новые лица: не копии из датасета, а новые, правдоподобные. Людей, которых никогда не существовало.
Это сложнее, чем классификация. В классификации есть правильный ответ («кошка»), и мы минимизируем ошибку. А в генерации «правильного ответа» нет — любое правдоподобное лицо валидно. Как учить модель, когда нечему подражать один-в-один?
Идея, объединяющая все три подхода: вместо того чтобы учиться рисовать напрямую, модель учится понимать распределение данных — какое лицо «похоже на настоящее», а какое нет. А потом мы сэмплируем из этого распределения новые точки. Разница между подходами — в том, как моделировать распределение и как сэмплировать.
2. Первая волна: автокодировщики (VAE)
Начнём с простого. Автокодировщик (autoencoder) — это сеть из двух частей: кодировщика, который сжимает картинку в маленький вектор («латентное представление»), и декодера, который восстанавливает картинку из этого вектора. Обучается на простой задаче: восстановить исходную картинку.
картинка → [кодировщик] → латентный вектор z (32 числа)
↓
востановленная картинка ← [декодер] ←
Сама по себе эта конструкция не генерирует — она лишь сжимает и распаковывает. Но если обратить внимание на латентный вектор z, возникает идея: а что если взять случайный z и подать в декодер? Если декодер выучил «форму» латентного пространства, он выдаст что-то осмысленное.
Проблема в том, что у обычного автокодировщика латентное пространство не структурировано — случайный z с высокой вероятностью попадёт в «дыру» и декодер выдаст шум. Поэтому придумали вариационный автокодировщик (VAE): он учит кодировщик выдавать не точку, а распределение (среднее и дисперсию) для каждого измерения латентного пространства. Это заставляет латентное пространство стать гладким и непрерывным — рядом лежащие z порождают похожие лица.
Результат. VAE действительно генерирует новые лица. Но есть существенный недостаток: из-за того, что модель оптимизирует среднюю правдоподобность, генерируемые картинки получаются размытыми. Лицо видно, но как через мутное стекло. VAE хороши для задач, где гладкость важнее резкости (интерполяция, сжатие, денойзинг), но для фотореалистичной генерации их не хватает.
3. Вторая волна: GAN и состязательное обучение
В 2014 году Ян Гудфеллоу предложил дерзкую идею: две сети соревнуются. Так родились GAN (Generative Adversarial Networks).
Представьте фальшивомонетчика и эксперта-криминалиста. Фальшивомонетчик (генератор) пытается напечатать поддельную купюру. Эксперт (дискриминатор) учится отличать подделку от настоящей. Оба тренируются: фальшивомонетчик改进ает мастерство, эксперт оттачивает глаз. Через тысячи итераций подделки становятся настолько хороши, что эксперт уже не отличает — это и значит, генератор научился.
случайный шум z → [генератор] → поддельное изображение
↓
[дискриминатор]: настоящее или подделка?
↑
реальные изображения из датасета
Обучение GAN — это минимаксная игра: генератор минимизирует вероятность дискриминатора поймать его, дискриминатор максимизирует. Когда игра сходится, генератор выдаёт картинки, неотличимые от настоящих. Именно GAN дали первые фотореалистичные лица — те самые сайты «thispersondoesnotexist.com», которые в 2019 году поразили интернет.
Почему GAN революционны. Они научили нейросети генерировать резкие, высокочастотные детали, которых не хватало VAE. Текстуры кожи, волосы, блики в глазах — всё это стало возможным. GAN доминировали в генерации изображений почти десять лет.
Но GAN капризны. Их обучение нестабильно. Главная болезнь — mode collapse: генератор находит один тип картинки, который обманывает дискриминатор, и начинает выдавать вариации одного и того же лица для любого входа. Представьте фальшивомонетчика, который нашёл одну купюру, проходящую экспертизу, и печатает только её. Ещё проблемы: трудно следовать текстовому промпту («нарисуй красную кошку»), чувствительность к гиперпараметрам, долгий и дорогой процесс настройки.
4. Третья волна: диффузия — учиться убирать шум
В 2020 году вышла статья DDPM (Denoising Diffusion Probabilistic Models), и за три года диффузионные модели (Stable Diffusion, DALL-E 3, Midjourney) полностью заняли трон генерации. Идея на первый взгляд странная: учить сеть убирать шум с картинки.
Вот как это работает, шаг за шагом.
Прямой процесс (всё портим). Берём настоящую картинку и добавляем к ней немного гауссова шума. Потом ещё немного. И ещё. Через много шагов (обычно ~1000) от картинки остаётся чистый шум — ни следа оригинала. Это прямой диффузионный процесс, и он простой: на каждом шаге мы просто прибавляем шум по известной формуле.
картинка → +шум → +шум → +шум → ... → чистый шум
(t=0) (t=1000)
Обратный процесс (всё чиним). А теперь — трюк. Мы обучаем нейросеть обращать этот процесс: дать ей зашумлённую картинку на шаге t, а она должна предсказать, какой шум был добавлен, и убрать его. Если повторять достаточно раз, начиная с чистого шума, мы придём к осмысленной картинке.
Обучение простое: берём картинку, добавляем шум с известным шагом, просим сеть предсказать шум (мы его знаем, можем считать ошибку). Через миллионы примеров сеть учится «denoise» — а значит, умеет и генерировать: ведь если начать с чистого шума и итеративно убирать, получится осмысленное изображение.
чистый шум → −шум → −шум → −шум → ... → картинка
(t=1000) (t=0)
Куда делся промпт? Чтобы генерировать конкретные картинки («красная кошка»), нужен механизм управления. Решение: нейросеть, убирающая шум, обусловлена текстом. Через cross-attention (тот же механизм внимания, что в трансформерах) текстовый промпт подаётся в denoise-сеть на каждом шаге, направляя процесс генерации. Это и есть Stable Diffusion: U-Net (архитектура из компьютерного зрения), убирающий шум, + текстовый энкодер CLIP, направляющий процесс.
5. Почему диффузия победила
Сравним три волны по ключевым инженерным критериям.
| Критерий | VAE | GAN | Диффузия |
|---|---|---|---|
| Качество | размыто | резко, фотореалистично | резко, фотореалистично |
| Стабильность обучения | стабильна | капризна (mode collapse) | стабильна |
| Управление промптом | слабое | сложное | отличное (text-to-image) |
| Разнообразие | хорошее | низкое (mode collapse) | отличное |
| Скорость инференса | быстро (1 проход) | быстро (1 проход) | медленно (~50 шагов) |
Диффузия выигрывает почти везде, кроме одного: скорости. Каждая генерация требует десятков прогонов сети (по одному на шаг денойзинга), тогда как GAN/VAE выдают картинку за один проход. Поэтому Stable Diffusion генерирует секунды, а не миллисекунды. Это плата за качество и стабильность — и для большинства задач она приемлема.
Но и это меняется. Появились ускоренные диффузионные модели (Latent Consistency Models, DPM-Solver, ADVERSARIAL DIFFUSION): 4–8 шагов вместо 50. Архитектурный компромисс «качество vs скорость» сдвигается в сторону качества.
6. Латентная диффузия: почему Stable Diffusion работает на домашней GPU
Один из ключевых инженерных трюков Stable Diffusion — latent diffusion. Диффузия в пространстве пикселей дорога: картинка 512×512×3 — это почти 800 тысяч значений на каждый шаг, и сеть-денойзер должна обрабатывать этот объём. Stable Diffusion делает диффузию не в пикселях, а в латентном пространстве — сжатом представлении картинки размером 64×64×4 (16 384 значения, в 48 раз меньше).
Сначала автокодировщик (VAE!) сжимает картинку в латент, потом диффузия идёт в латенте, а в конце VAE-декодер разжимает латент обратно в пиксели. Получился гибрид: VAE для сжатия (его ниша — гладкое латентное пространство), диффузия для генерации в этом компактном пространстве. Именно поэтому Stable Diffusion умещается в 4 ГБ видеопамяти и работает на потребительских GPU — без латентного трюка потребовались бы профессиональные карты на 24 ГБ.
7. Паттерн: итеративное улучшение
Если отойти от деталей, во всех трёх подходах прослеживается одна и та же глубокая идея, которую мы уже встречали.
- VAE учится через один проход: сжал → разжал, посчитал ошибку, обновил веса.
- GAN добавил итеративную игру: две сети, шаг за шагом, улучшают друг друга.
- Диффузия делает итеративную декомпозицию: один большой процесс (генерация из шума) разбивается на тысячу маленьких (убрать чуть-чуть шума), каждый из которых прост.
Знакомо? Это та же логика, что в градиентном бустинге: одно сложное предсказание заменяется суммой многих простых. Та же логика в ResNet: сложное преобразование заменяется суммой маленьких поправок. Разделяй и властвуй через итерации — один из самых мощных паттернов в машинном обучении, и диффузия — его, пожалуй, самое чистое воплощение.
8. Почему это важно для self-hosting
Генеративные модели — не экзотика, а инструмент, который можно поднять самому.
Локальный Stable Diffusion. Stable Diffusion — открытая модель (весов в открытом доступе, лицензия CreativeML Open). Через Automatic1111, ComfyUI или Diffusers (Hugging Face) её можно запустить на любой видеокарте от 6 ГБ VRAM. Без облака, без подписки, без цензуры провайдера. Для self-hosted сценария — генерация иконок для своего блога, иллюстраций к статьям, концепт-артов для прототипа — это полноценная замена коммерческим DALL-E/Midjourney.
Fine-tuning под свои данные. Диффузионные модели хорошо поддаются дообучению. Техники LoRA (Low-Rank Adaptation) позволяют обучить стиль/персонажа на 20–30 картинках за полчаса на одной GPU. Если у вас есть фирменный стиль иллюстраций — можно зафайн-тюнить модель и генерировать в этом стиле бесконечно. Та же философия transfer learning, что и в CV.
Embeddings для RAG по картинкам. Текстовый энкодер CLIP, встроенный в Stable Diffusion, выдаёт эмбеддинги, которые связывают текст и изображения в одном пространстве. На этом работает обратный поиск по картинке («найди похожие») и мультимодальный RAG (когда база знаний содержит и текст, и изображения). Если вы, как и System Design Wizard, строите систему с векторным поиском — CLIP-эмбеддинги дадут вам возможность искать не только по тексту.
Заключение
Эволюция генеративных моделей — это история о том, как инженерное мастерство решало фундаментальные проблемы. VAE дали гладкость, но потеряли резкость. GAN дали резкость, но потеряли стабильность. Диффузия нашла баланс через декомпозицию: не «нарисуй картинку», а «убери шум» тысячу раз.
В следующей статье серии мы разберём последний большой раздел AI — обучение с подкреплением. Если все предыдущие алгоритмы учились на статичных данных, то RL учится через взаимодействие со средой: пробовать, получать награду, корректировать. Именно так AlphaGo победил чемпиона мира по Go, и именно так через RLHF дообучают ChatGPT следовать инструкциям. И — последний спойлер — там мы снова увидим знакомый паттерн итеративного улучшения.