Компьютерное зрение
Image Generation: GANs
2014 год: Ян Гудфеллоу объясняет идею в баре. Два игрока: фальшивомонетчик (генератор) и следователь (дискриминатор). Следователь учится распознавать подделки - фальшивомонетчик учится их совершенствовать. В теории игр это называется минимакс. В результате этой «игры» рождаются изображения, неотличимые от реальных. За 10 лет GAN эволюционировали от размытых 28×28 цифр до 1024×1024 фотореалистичных лиц и text-to-image систем.
- **NVIDIA StyleGAN** - thispersondoesnotexist.com: каждое лицо на сайте синтетическое
- **Adobe Photoshop** - нейросетевое заполнение областей (Generative Fill) основано на conditional GAN
- **Medical imaging** - CycleGAN для синтеза MRI из CT без парных данных (дорогостоящий сбор пар невозможен)
- **Видеоигры** - upscaling текстур низкого разрешения через GAN (DLSS от NVIDIA)
Ян Гудфеллоу и идея состязательной игры
В 2014 году Ян Гудфеллоу с соавторами из Монреальского университета опубликовал Generative Adversarial Nets - схему, где генератор и дискриминатор обучаются в минимакс-игре друг против друга. Первые GAN рисовали размытые 28×28 цифры, но идея оказалась плодотворной. В 2015 году Radford, Metz и Chintala стабилизировали обучение в DCGAN, задав архитектурные правила для свёрточных GAN. В 2017 году Isola с коллегами предложил pix2pix для парной трансляции изображений, а Zhu с коллегами - CycleGAN для непарной. В 2018 году Karras и команда NVIDIA выпустили StyleGAN, синтезирующий фотореалистичные лица 1024×1024.
Предварительные знания
- Свёрточные и транспонированные свёрточные слои
- Backpropagation и функции потерь
- Batch Normalization
DCGAN: архитектура и обучение
В 2014 году Гудфеллоу описал идею: два игрока в игре - **генератор** придумывает поддельные банкноты, **дискриминатор** учится их распознавать. Со временем генератор становится настолько искусным, что дискриминатор больше не может отличить подделку от оригинала. Первые GAN работали на маленьких изображениях. **DCGAN** (2015) перевёл концепцию в глубокие свёрточные сети и задал архитектурные правила, которые работают до сих пор.
DCGAN генерирует изображение из случайного вектора z (обычно dim=100, из N(0,1)). Генератор - это обратная свёрточная сеть: начинает с маленького тензора и через transposed convolutions расширяет до финального изображения. Дискриминатор - обычная свёрточная сеть, классифицирующая «настоящее / поддельное».
**Mode collapse** - главная проблема GAN: генератор находит «читерское» решение, генерируя один-два паттерна, которые всегда обманывают дискриминатор. Симптом: все сгенерированные образцы похожи друг на друга. Решения: Wasserstein GAN (WGAN), minibatch discrimination, unrolled GAN.
В DCGAN используется LeakyReLU в дискриминаторе, а не обычный ReLU. Почему?
StyleGAN: пространство стилей
NVIDIA в 2018 году опубликовала faces, которые казались реальными фотографиями - StyleGAN. Но главное не качество, а **контроль**: можно взять лицо A и лицо B, смешать их стили - и получить лицо с причёской A, но формой носа B. Это стало возможным благодаря переосмыслению того, как шум управляет генерацией.
В DCGAN вектор z подаётся напрямую в сеть - плохой контроль над стилем. StyleGAN вводит **mapping network** (8 полносвязных слоёв): z → w (пространство стилей). Вектор w затем через **AdaIN (Adaptive Instance Normalization)** управляет каждым слоём генератора отдельно. Отдельный канал - **stochastic noise** - добавляется к каждому слою и отвечает за мелкие случайные детали (поры кожи, отдельные волоски).
**FID (Frechet Inception Distance)** - метрика качества GAN. StyleGAN (2019) достиг FID=4.4 на FFHQ (70k лиц). StyleGAN2 (2020) улучшил до FID=2.84, убрав артефакты «капли воды» через weight demodulation вместо AdaIN.
Для чего в StyleGAN нужен отдельный канал stochastic noise (добавляется к фичмэпам каждого слоя)?
Pix2Pix: conditional GAN
Архитектор рисует планировку здания - чёрные линии на белом фоне. Pix2Pix (Isola et al., 2017) превращает этот чертёж в фотореалистичный фасад. Та же архитектура: ночные улицы → дневные, спутниковые снимки → карты, чёрно-белые фото → цветные. Одна модель, разные пары данных.
Pix2Pix - это **conditional GAN**: и генератор, и дискриминатор принимают исходное изображение как дополнительный вход. Генератор строится по архитектуре **U-Net**: encoder сжимает вход, decoder восстанавливает, skip connections передают детали напрямую из encoder в decoder. Дискриминатор - **PatchGAN**: классифицирует не всё изображение, а перекрывающиеся патчи 70×70. Это выгоднее: патчи-классификатор имеет меньше параметров и лучше улавливает локальные текстуры.
**PatchGAN работает лучше глобального дискриминатора для текстур:** классифицируя 70×70 патчи, модель учится судить о локальной реалистичности - правильные края, текстура кирпича, зернистость асфальта. Полный изображение-дискриминатор часто игнорирует такие детали.
Pix2Pix добавляет L1 loss (|G(x) - y|) к adversarial loss. Зачем, если adversarial loss уже обеспечивает реализм?
CycleGAN: unpaired translation
Собрать 100 000 парных снимков «лето - зима одного и того же места» практически невозможно. Pix2Pix требует именно таких пар. **CycleGAN** (Zhu et al., 2017) работает с непарными коллекциями: просто 1000 фото лета и 1000 фото зимы - без соответствия. Картины Моне → фотографии, лошади → зебры, яблоки → апельсины - всё без пар.
Ключевая идея: **cycle consistency loss**. Если перевести изображение из домена A в домен B, а затем обратно из B в A - должно получиться исходное изображение. Это ограничение вместе с двумя adversarial loss-ами тренирует две пары моделей: G_AB, G_BA (генераторы), D_A, D_B (дискриминаторы).
**InstanceNorm вместо BatchNorm в CycleGAN:** при image-to-image translation важно нормализовать каждое изображение независимо от батча - стиль одного изображения не должен влиять на другое. InstanceNorm нормализует по H×W для каждого изображения отдельно.
CycleGAN - это улучшенный Pix2Pix, просто без парных данных, результат хуже
CycleGAN решает другую задачу. Для задач, где пары доступны, Pix2Pix лучше. Но CycleGAN открывает класс задач, где пары физически недостижимы - перевод художественного стиля, сезонные изменения, медицинские MRI→CT без одновременного сканирования.
Cycle consistency ограничивает пространство решений иначе, чем L1 к паре. Это не хуже/лучше - это другой режим работы.
Что произошло бы с CycleGAN без cycle consistency loss - только с adversarial losses?
GANs: от DCGAN до CycleGAN
- GAN = минимакс игра генератора и дискриминатора; DCGAN задал архитектурные правила (strided conv, BN, LeakyReLU)
- Mode collapse - главная проблема: G генерирует один паттерн; решения: WGAN, minibatch discrimination
- StyleGAN: z → mapping network → w; AdaIN управляет стилем каждого слоя; noise отвечает за мелкие детали
- Pix2Pix: conditional GAN с U-Net генератором и PatchGAN дискриминатором; требует парных данных
- CycleGAN: unpaired translation через cycle consistency loss; две пары G и D; InstanceNorm вместо BatchNorm
- Identity loss в CycleGAN предотвращает ненужные изменения изображений из целевого домена
Связанные темы
GANs заложили основу для современных диффузионных моделей. Понимание adversarial training помогает в работе с современными генеративными системами.
- Object Detection: Faster R-CNN и YOLO — Свёрточные backbone из детекции используются как дискриминаторы
- Feature Pyramid Networks — Multi-scale подход из FPN применяется в прогрессивном обучении StyleGAN
Вопросы для размышления
- Почему Wasserstein GAN (WGAN) решает проблему mode collapse лучше, чем стандартный adversarial loss на основе BCELoss?
- В каком сценарии лучше использовать Pix2Pix, а в каком CycleGAN - и где граница?
- StyleGAN2 заменил AdaIN на weight demodulation. Какую проблему AdaIN создавал в генерируемых изображениях?
Связанные уроки
- cv-04 — Генератор и дискриминатор GAN это свёрточные сети
- cv-11 — Диффузия вытеснила GAN как основной генератор изображений
- dl-14 — То же состязательное обучение в курсе deep learning
- ml-33-gan — Основы GAN также есть в классическом ML-курсе
- prob-11-normal — Латентные векторы сэмплируются из гауссова приора
- ml-01