Давайте разойдёмся с хронологией. Вместо сухого «2015 → 2016 → 2017» разложим эволюцию GAN по нервам идей — как мы научились задавать цель, настраивать голос критика, расширять цех и приручать латентное пространство. Это путеводитель, который читается как история: без тяжёлых формул — только ясная механика, живые примеры и дорожные знаки к первоисточникам. Если всё сделано правильно, вам захочется перевернуть следующую страницу.
Небольшой пролог
В самом начале у нас была пара спорщиков: придирчивый критик и упрямый генератор. Один всё время ловил «фальшь», другая — училась прятать огрехи. Чем больше мы наблюдали за их танцем, тем яснее становилось: дело не в хитрых формулах, а в том, как подсказывать и чего хотеть. Мы научились давать цель, придумывать осмысленные подсказки и держать темп — и от этого картинки становились всё менее «сном нейросети» и всё больше — чем‑то пригодным для жизни.
Вместо явного вычисления вероятности для каждого элемента из распределения данных, GAN обучает генераторную сеть
, которая преобразует случайную переменную шума
в образец
. Генератор тренируется против дискриминаторной сети
, которая старается различить реальные образцы из распределения данных
и сгенерированные образцы из распределения
.
Для фиксированного генератора оптимальный дискриминатор определяется как:
Более формально, само состязание между генератором и дискриминатором описывается через функцию минимакс:
Где:
стремится минимизировать эту функцию, чтобы дискриминатор не отличал сгенерированные данные от реальных;
пытается максимизировать функцию, правильно классифицируя реальные и сгенерированные данные.
Таким образом, GAN учится генерировать данные, неотличимые от реальных, благодаря этому минимаксному процессу обучения.
Карта идей (коротко)
Если собрать карту не по датам, а по смыслу, получится цепочка: сначала контроль (cGAN → SPADE), затем сигнал (WGAN → GP), дальше — наведение порядка в архитектуре (DCGAN), после — масштаб (BigGAN), за ним открывается латентная геометрия (StyleGAN2, InterFaceGAN). Над всем этим висят наши метрики (IS/FID и их компромиссы) и, конечно, качество данных.
Контроль: управляемая генерация
Если попросить сеть «нарисуй что‑нибудь красивое», она теряется. Стоит прошептать цель — и появляется фокус. Сначала это был прямой намёк: cGAN подаёт метку класса и в генератор, и в дискриминатор — как если бы учителю и ученику выдали один и тот же билет [1]. Позже подсказку вплели прямо в ткань изображения: SPADE модулирует нормализацию по карте сегментаций, и сцена держит форму — дом остаётся домом, дорога не течёт [7].
Например, как в детской раскраске: у каждого пикселя есть шпаргалка — «тут окно, тут асфальт». Поэтому города складываются ровно, без «плывущих» фасадов. Но контроль — это не только «куда положить пиксель». InfoGAN добавляет второй тип подсказки — о смыслах. Он берёт несколько скрытых «ползунков» и просит сеть сделать так, чтобы эти ползунки действительно меняли что‑то понятное: толщину штриха у цифры, угол поворота лица, тип шрифта. Получается почти как на старом магнитофоне: крутишь ручку — меняется тембр, но мелодия остаётся [3].
Есть и ремесло: подсказку можно подмешать по‑разному. В класс‑условной генерации это проекционные дискриминаторы и условные нормализации — сеть прямо сверяет «совместимость» картинки и класса. В сценах — пространственная модуляция нормализаций, чтобы условие действовало на каждом пикселе. В интерпретации факторов — вспомогательная голова (как у InfoGAN), которая «спрашивает» скрытые переменные обратно.
Проверка на бытовом примере: попросите модель «рисовать зебру» и «рисовать траву». Если подсказка размазана, зебра потечёт и превратится в «серую лошадь» на зелёном шуме. Если подсказка вшита в нужное место, зебра остаётся полосатой, даже если фон сложный.
Зарисовка. Архитектор города приносит «цветовую схему района» — semantic map (семантическая карта). Если дать её как сноску, рабочие всё равно перепутают тротуар и газон. Но если схема висит прямо на стене и каждый мастер сверяется с ней на своём участке, дома встают по линиям. Это и есть SPADE: подсказка не в начале, а в ткани сети — conditioning (условление), которое действует там, где происходит работа.
Ещё пример попроще. Мы хотим рисовать «квадратную пиццу с анчоусами». С cGAN мы в явном виде шепчем название блюда и повара, и шеф (генератор) делает нужную подачу, а метрдотель (дискриминатор) проверяет соответствие чека и блюда. С InfoGAN мы добавляем ручки: «сколько сыра», «насколько хрустящие края». Ручки — это и есть disentangled factors (разделённые факторы), которые приятно крутить.
См. [1], [3], [7].
Сигнал обучения: от «да/нет» к осмысленному расстоянию
Долгое время дискриминатор был как строгий экзаменатор: «да» или «нет». Проблема в том, что такой вердикт не рассказывает, в какую сторону исправляться. В WGAN критик меняет логику — вместо приговора он даёт меру того, сколько «работы» нужно, чтобы превратить одну выборку в другую [4]. А WGAN‑GP мягко удерживает критика от «визга» градиентов — штрафует за слишком резкие повороты [5].
Представь две кучи песка. Просто спрашивать «похожи ли они» — бессмысленно. Гораздо полезнее сказать: «перекинь ведро отсюда туда». Вот почему тренировка начинает двигаться стабильнее и перестаёт впадать в коллапсы. В практике рядом с GP обычно живут и другие «успокоители»: несколько шагов критика на один шаг генератора, осторожная инициализация, спектральные ограничители на веса. Все они про одно — чтобы судья не перекрикивал игру.
Есть и оборотная сторона. Если критик слишком силён, он «задавит» генератор, и тот начнёт выпускать безопасные, одинаково «правильные» картинки. Поэтому важна настройка громкости: хороший критик не орёт и не молчит, а ведёт партнёра в танце. WGAN‑GP как раз про это — о границах, в которых танцевать приятно и продуктивно.
Зарисовка. Представьте дегустатора и подмастерье‑обжарщика кофе. «Невкусно» — бесполезный фидбек. Полезный — «на пол‑шага светлее обжариваем, кислотность убрать». Wasserstein distance (расстояние Вассерштейна) — как такая подсказка: она говорит, куда и сколько смещать вкус. Gradient penalty (градиентный штраф) — напоминание дегустатору говорить спокойнее и ровнее, чтобы подмастерье не шарахался.
В инженерной практике это превращается в рутину: несколько итераций critic (критика) на одну итерацию generator (генератора), умеренные шаги оптимизации, spectral norm (спектральная норма) на весах в тяжёлых местах. Итог — не «магия», а предсказуемая механика обучения.
См. [4], [5].
Архитектурная гигиена: чтобы обучение вообще завелось
Пока спорили о лоссах, DCGAN просто прибрался на кухне: страйдовые свёртки вместо pooling, минимум полносвязных слоёв, ReLU в G
и LeakyReLU в D
, batch‑norm там, где нужно [2]. Оказалось, что этого «уборочного набора» хватает, чтобы тесто наконец поднялось — градиенты не задыхаются, а признаки дискриминатора годятся и для других задач.
Как с хлебом: убери нормализацию в нужном месте — и батон «поплыл»; добавь лишнюю «шапку» — не поднимется. Простые правила экономят недели отладки. Из маленьких, но важных привычек: не ставить batch‑norm на вход дискриминатора, не «разгонять» последнюю активацию генератора, инициализировать веса умеренно и следить за балансом обновлений G
/D
. В оригинальных экспериментах красиво проявился бонус: признаки дискриминатора пригодились как универсальные — поверх них работали простые линейные классификаторы, как будто мы случайно обучили полезный экстрактор признаков.
Зарисовка. Фотостудия перед съёмкой: кто‑то проверяет софтбоксы, кто‑то выставляет белый баланс, кто‑то убирает лишнюю мебель из кадра. После такой подготовительной рутины даже телефон снимет прилично. DCGAN — та же подготовка: strided conv (свёртки со страйдом) вместо ручного апсемплинга, batch normalization (батч‑нормализация) там, где надо, LeakyReLU в критике и ReLU в генераторе. Не романтика, но именно это спасает от «поплывших» кадров.
В реальных проектах это часто первый блок кода, который потом почти не трогают — он просто работает. А дальше уже можно спорить про лоссы и трюки.
Эти рекомендации направлены на стабильное обучение и улучшение работы глубоких сверточных GAN (DCGAN)
Замените все слои пулинга сверточными слоями с шагом (discriminator) и сверточными слоями с дробным шагом (generator).
Используйте batch normalization как в генераторе, так и в дискриминаторе.
Удалите полностью связанные скрытые слои для более глубоких архитектур.
Используйте активацию ReLU во всех слоях генератора, кроме выходного, который использует Tanh.
Используйте активацию LeakyReLU во всех слоях дискриминатора.
См. [2].
Масштабирование: скорость, качество и рычаги контроля
Когда база в порядке, можно включать турбо. BigGAN — это производство на больших мощностях: классовая условность повсюду, проекционный дискриминатор, hinge‑лосс вместо мягких логитов и батчи побольше [6]. А в монтажной на выводе — truncation: убираем крайности в латенте и получаем чище кадр, мир чуть предсказуемее.
Это как кино. Сотня дублей (большие батчи) делает монтаж спокойным; проекционный дискриминатор — это редактор, который сверяет, тот ли жанр мы снимаем; truncation — финальная нарезка: меньше импровизаций, больше качества. Но у любого конвейера есть цена: слишком большие батчи могут сделать фильм гладким и безликим, а слишком жёсткий truncation — убрать живость. Хорошие команды держат две версии трейлера: «чистый» и «живой», переключая ручку под задачу.
Под капотом BigGAN — много ремесленных штрихов. Условные нормализации в генераторе передают «класс» глубже в сеть; проекционный дискриминатор специально проверяет «картинка совпадает с классом?»; ортогональные/спектральные ограничения успокаивают обучение; иногда добавляют самовнимание, чтобы сцены держались цельно. Всё это не трюки, а детали цеха, делающие результат воспроизводимым.
См. [6].
Зарисовка. У нас студия документалистики. Снимаем «животных мира»: ImageNet — это сотни жанров, от «golden retriever (золотистый ретривер)» до «lorikeet (ласточкохвостый попугай)». Чтобы фильм не разваливался, нужен редактор, который сверяет жанр кадра — это projection discriminator (проекционный дискриминатор). На монтаже мы иногда убираем «слишком странные» кадры — это и есть truncation (усечение): зритель получает чистый, единый по тону фильм, пусть и с меньшим количеством неожиданных моментов.
В продакшене эта ручка — спасение. Для рекламных изображений мы слегка поджимаем латент (аккуратность важнее разнообразия). Для генерации идей дизайнеру — наоборот, отпускаем, пусть появляются «дикиe» вариации.
Латентная геометрия: редактирование как продуктовая функция
Когда артефакты утихли, латент перестал быть лабиринтом. В StyleGAN2 демодуляция свёрток и аккуратные пути выпрямили пространство W
— стало удобно крутить ручки [8]. InterFaceGAN добавил к этому карту: атрибуты вроде «улыбки» или «очков» оказались почти прямыми направлениями — двигаешься по вектору, меняется только нужное [9].
За этим стоит простой, но важный сдвиг мышления: латент — это интерфейс. Когда интерфейс аккуратный, появляется инверсия (подобрать код под данную фотографию), локальные правки («пусть будет та же комната, но вечерний свет»), композиция («оставим прическу, заменим выражение»). Внутри тренировочного процесса этому помогают приёмы вроде смеси стилей (перекрёстная подстановка стиля на разных уровнях) — модель учится разделять «грубое» и «тонкое» редактирование.
Конечно, не все направления идеально независимы: улыбка может слегка «толкать» возраст, очки — менять освещённость. Но именно поэтому полезны аккуратные пространства вроде W
и методы, которые «ортогонализуют» атрибуты — они снижают побочный эффект и делают ощущения от редактирования предсказуемыми.
См. [8], [9].
Зарисовка. Представьте фоторедактор с честными ползунками: smile (улыбка), age (возраст), eyeglasses (очки). Крутишь «улыбку» — у человека меняется только уголок губ, взгляд остаётся прежним. Это работает, когда latent space (латентное пространство) выпрямлено (как W
в StyleGAN2) и когда для атрибутов нашлись почти линейные направления (как в InterFaceGAN). Тогда редактирование — не «искусство случайности», а ремесло, которое можно доверить пользователю.
Профессиональный приём — style mixing (смешение стилей): «переливаем» грубый стиль из одного кода (композиция, крупные формы) и оставляем тонкие детали от другого (текстуры, поры кожи). Это даёт сочетание контраста и узнаваемости, как в портретной ретуши.
Как мерить качество: и почему важен trade‑off
Мы договорились разговаривать цифрами IS и FID, особенно на больших наборах вроде ImageNet [6]. Но это карта, а не территория. Тот же truncation наглядно показывает закон: за чистоту платим разнообразием. Поэтому рядом с числами держим ленты примеров, простые пользовательские оценки и, где уместно, метрики наподобие precision/recall для генерации.
Если объяснять «на пальцах»: IS любит ярко выраженные классы и наказывает за «смазанность жанра» — как кинокритик, который ценит фильмы, в которых чётко понятно, это комедия или триллер. FID сравнивает «фирменные отпечатки» признаков реальных и сгенерированных картинок — будто два бариста пробуют два эспрессо и пытаются понять, одинаковый ли это обжиг. У этих цифр есть и бытовые слабости: зависимость от конкретной «Инцепшн‑камеры», чувствительность к домен‑шифту и размеру выборки. Поэтому честный отчёт всегда показывает и примеры, и разброс по разным срезам.
См. [6].
Зарисовка. Выбираем кофе на развес. IS (Inception Score) — как наклейка «кайф гарантирован»: чем выраженнее «жанр» напитка, тем выше балл. FID (Fréchet Inception Distance) — как слепая дегустация в лаборатории: сравнивают статистики «аромата» реальных и синтетических напитков. Иногда оба правы, иногда — спорят. Поэтому в отчёт кладём и дегустационный стол с примерами, и цифры с доверительными интервалами. Если используем precision/recall for generative models (точность/полнота для генеративных моделей), объясняем на пальцах: «точность» — насколько аккуратно попадаем в стиль, «полнота» — насколько широка наша палитра.
Данные и риски: качество зависит не только от лосса
Ни один лосс не перекричит набор данных. Большие веб‑сборки щедры и шумны: вместе с красотой в них живут перекосы и нежелательные шаблоны [11]. Модель — как попугай: повторит и смешное, и обидное. Потому фильтры, лицензии и заметки к датасету — не бюрократия, а техника безопасности.
Простой мысленный эксперимент: если обучить портретный генератор только на фото знаменитостей, он научится «глянцевой коже» и свету студий — и будет теряться на уличных снимках. Если в датасете меньше женщин‑учёных, чем мужчин, то и картинка «типичного учёного» будет сдвинута. Качество данных — это первая метрика: напишем её в паспорте набора, прежде чем спорить о FID. Полезно вести «чёрный ящик» источников: откуда пришли изображения, как фильтровались, какие лицензии. Это избавляет от будущих сюрпризов и делает эксперименты воспроизводимыми.
См. [11].
Зарисовка. Запускаем гастробар и берём рецепты «из интернета». Вместе с удачными блюдами в меню попадает что‑то сомнительное. Помогают dataset cards (паспорта датасетов) и data sheets (описания наборов): что за источники, как фильтровали, что запрещено к использованию. Это бумага, которая экономит репутацию. В генеративных задачах это особенно важно — ведь мы не только распознаём, мы производим контент.
Компас идей: живой путеводитель вместо схемы
Хочется не стрелочки, а понятные тропинки. Ниже — три «маршрута применения» и одна «тропа спасения». Выбирай по задаче и просто иди по шагам — без формул, с короткими подсказками.
Портреты и редактирование лица. Ставим основы (правила DCGAN — аккуратные свёртки, нормализации, разумные активации) [2]. Берём StyleGAN2 как чистую базу — он меньше «капаeт» и даёт ровное пространство W
[8]. Подключаем «интерфейс»: инверсию изображения в латент и InterFaceGAN‑направления — smile (улыбка), age (возраст), eyeglasses (очки) [9]. Для продакшена держим две «нарезки»: truncation покрепче — когда нужна безошибочная красота, помягче — когда важнее разнообразие. Мерим не только FID, но и человеческими панелями примеров.
Городские сцены и дизайн уровней. Когда вход — это semantic map (семантическая карта), подсказка должна работать прямо на пикселе. Берём SPADE: она «красит» нормализацию по карте, и фасады не плывут [7]. Если тренировка нервничает — чуть успокаиваем критика (градиентным штрафом из WGAN‑GP или спектральной нормой, если уместно) [5]. На выводе можно слегка «поджать» латент truncation‑ом, чтобы линии были ровнее. Проверяем на глаз: углы зданий острые? дорога не «желе»?
Каталожные фото и большие наборы классов. Тут важен жанр каждого кадра. Делаем class‑conditional‑схему: метка идёт в генератор и в projection discriminator (проекционный дискриминатор), который честно проверяет, совпадает ли картинка с классом [6]. Учимся на больших батчах с hinge‑лоссом — это даёт стабильный прирост качества [6]. На этапе сэмплинга — тот же приём: две версии выдачи — «чистая» (truncation сильнее) и «живая» (truncation слабее). Для отчётов принято показывать IS/FID, но добавляем витрину примеров — это помогает бизнесу увидеть разницу.
Когда всё шатается (тропа спасения). Если лосс «врёт», градиенты то исчезают, то взрываются — меняем «да/нет» на Wasserstein‑подход и добавляем gradient penalty [4, 5]. В тяжёлых блоках включаем spectral norm как ограничитель. И держим ритм обновлений: несколько шагов критика на один шаг генератора. Часто этого достаточно, чтобы танец снова стал плавным.
—
Таблица «Идея → Механизм → Что даёт → Где полезно → Источник»
Идея | Механизм | Что даёт | Где полезно | Откуда |
---|---|---|---|---|
Контроль | Метка в | Управляемая генерация | Классовые картинки | [1] |
Контроль (пространственный) | Модуляция нормализации (SPADE) | Сохранение структуры сцены | «Сегментация → фото» | [7] |
Сигнал/метрика | Критик + расстояние переноса (WGAN) | Плавные, информативные градиенты | Разреженные/сложные данные | [4] |
Сигнал/стабильность | Градиентный штраф (WGAN‑GP) | Реже коллапс, лучше сходимость | Большие модели/датасеты | [5] |
Арх‑гигиена | Strided conv, BN, LeakyReLU/ReLU | Стабильное обучение, полезные признаки | Базовые пайплайны | [2] |
Масштаб | Проекционный | Скачок IS/FID; контроль truncation | ImageNet‑классика | [6] |
Латент | Демодуляция, path‑length (StyleGAN2) | Чистые изображения, удобное | Портреты/продуктовые редакторы | [8] |
Латент‑редактирование | Линейные направления (InterFaceGAN) | «Слайдеры» атрибутов | Интерактивное редактирование | [9] |
Данные | Аудит/фильтрация наборов | Меньше смещений и «утечек» | Продакшен | [11] |
Эпилог: как собрать свой конвейер идейно
Если собрать опыт в одну дорожную карту, получится не чек‑лист, а короткая история. Сначала мы решаем, чем управлять: классом, текстом, геометрией сцены — и вшиваем подсказку туда, где она физически действует. Затем настраиваем голос критика: чтобы он не приговаривал, а подсказывал направление, и учимся держать его в вежливых рамках. После этого наводим порядок в кухне — архитектура без лишних «шапок», нормализации на своих местах, аккуратная инициализация. Теперь можно масштабировать: больше дублей, внимательный редактор, монтаж на выходе. И только потом — интерфейс для человека: инверсия, удобное пространство, ручки‑атрибуты. Параллельно мы меряем без иллюзий и ведём паспорт данных.
Хорошая новость в том, что это не догма, а ритм. Его можно играть в любом жанре — от портретов до городских сцен — меняя инструменты, но сохраняя мелодию: цель, сигнал, порядок, масштаб, интерфейс, честные метрики и внятные данные.
Источники
[1] Mirza & Osindero. Conditional Generative Adversarial Nets, 2014. (arXiv:1411.1784)
[2] Radford et al. Unsupervised Representation Learning with DCGANs, 2015. (arXiv:1511.06434)
[3] Chen et al. InfoGAN, 2016. (arXiv:1606.03657)
[4] Arjovsky et al. Wasserstein GAN, 2017. (arXiv:1701.07875)
[5] Gulrajani et al. Improved Training of WGANs (WGAN‑GP), 2017. (arXiv:1704.00028)
[6] Brock et al. Large Scale GAN Training for High Fidelity Natural Image Synthesis (BigGAN), 2018/2019. (arXiv:1809.11096)
[7] Park et al. Semantic Image Synthesis with SPADE, 2019. (arXiv:1903.07291)
[8] Karras et al. Analyzing and Improving the Image Quality of GANs (StyleGAN2), 2019/2020. (arXiv:1912.04958)
[9] Shen et al. Interpreting the Latent Space of GANs for Semantic Face Editing (InterFaceGAN), 2019/2020. (arXiv:1907.10786)
[10] Zakharov et al. Few‑Shot Adversarial Learning of Realistic Neural Talking Head Models, 2019. (arXiv:1905.08233)
[11] Birhane et al. Large image datasets: A pyrrhic win for computer vision?, 2021. (arXiv:2110.01963)