Глубокое обучение

GAN: от теории к практике

Ян Гудфеллоу пьяный с друзьями в баре спорит, можно ли заставить нейросеть рисовать лица. Возвращается домой, пишет код за ночь. Через 9 лет thispersondoesnotexist.com показывает миллиарду людей лица, которых не существует. И большинство верит.

  • **thispersondoesnotexist.com:** StyleGAN2, миллион уникальных лиц в день, каждое от чистого шума
  • **Nvidia Maxine:** real-time замена фона и лица в видеозвонках - GAN под капотом, под 30 fps
  • **Reface, FaceApp:** омоложение/состаривание через CycleGAN-производные, ~500M скачиваний
  • **DeepFake в кино:** Disney и Lucasfilm использовали GAN-варианты для возвращения молодого Люка Скайуокера в Mandalorian

Ian Goodfellow и состязательная игра

В 2014 году Ian Goodfellow и коллеги предложили Generative Adversarial Networks, представив генерацию как игру между генератором и дискриминатором. Оригинальные GAN были нестабильны и сложны в обучении. В 2015 году Alec Radford, Luke Metz и Soumith Chintala стабилизировали их через DCGAN - свёрточный рецепт, дававший резкие изображения. К 2018 году семейство StyleGAN от Tero Karras и коллег из NVIDIA генерировало фотореалистичные лица, сделав 'this person does not exist' культурным феноменом до прихода diffusion-моделей.

Предварительные знания

  • Автоэнкодеры и VAE как генеративные базлайны
  • Свёрточные и транспонированные свёрточные слои
  • Функции потерь и идея игры minimax
  • Autoencoders и VAE
  • CNN: свёрточные сети

Generator: создатель, который никогда не видел реальности

2014. Монреаль. Бар. Ян Гудфеллоу спорит с друзьями, можно ли заставить нейросеть рисовать лица. Возвращается домой, пишет код за вечер. На следующее утро мир получает GAN - архитектуру, которая обнулит десятилетие работы над генеративными моделями.

Generator - это функция $G(z)$. На входе шум $z$ из нормального распределения, на выходе - изображение. Никаких меток, никаких примеров реальных лиц. G учится создавать то, что *выглядит как реальность*, не видя самой реальности. Парадокс: нейросеть рисует кошек, не зная, что такое кошка.

Внутри G - обычно стек transposed convolutions: $4 \times 4 \to 8 \times 8 \to 16 \times 16 \to ... \to 1024 \times 1024$. Каждый слой удваивает пространственное разрешение, уменьшает число каналов. Это та же арифметика, что в декодере VAE или в U-Net diffusion, только обучение через игру, а не через likelihood.

**Скрытое пространство $z$:** обычно $\mathbb{R}^{128}$ или $\mathbb{R}^{512}$. Каждая точка - потенциальное лицо. Линейная интерполяция между двумя $z$ даёт плавный переход между лицами - тот же 'king - man + woman' трюк, что в word embeddings, только в пикселях.

Что является входом Generator'а на этапе генерации?

Discriminator и минимакс: суд против фальсификатора

Discriminator $D(x)$ - бинарный классификатор. На вход изображение, на выход вероятность 'это настоящее'. Учится на двух потоках: реальные картинки из датасета и фейки от G. Стандартный CNN, ничего экзотического. Весь фокус в том, как D и G обучаются друг против друга.

Гудфеллоу формулирует это как минимакс-игру: $\min_G \max_D \mathbb{E}_{x \sim p_{data}}[\log D(x)] + \mathbb{E}_{z \sim p_z}[\log(1 - D(G(z)))]$. D хочет максимизировать своё умение различать. G хочет минимизировать D's способность ловить. Равновесие Нэша - точка, где D угадывает с вероятностью 0.5. Та же логика, что в RL self-play AlphaGo, только в пикселях.

Обучение чередуется. Один шаг D: фиксируем G, обновляем D на batch'е реальных и фейковых. Один шаг G: фиксируем D, обновляем G через градиент от D(G(z)), который хочется поднять. И так миллион итераций. Adam optimizer с $\beta_1 = 0.5$ - не 0.9 как обычно: высокая инерция убивает обучение GAN.

**Mode collapse - главная боль:** G находит одно лицо, которое стабильно обманывает D, и начинает генерировать только его. Разнообразие схлопывается. То же явление, что в RL, когда policy зацикливается на одной стратегии. Решение - Wasserstein-loss, mini-batch discrimination, spectral norm.

Что означает 'равновесие Нэша' в контексте GAN?

Wasserstein GAN: метрика, которая не врёт

Оригинальный GAN при дивергенции распределений отдаёт градиенты, близкие к нулю. D становится слишком уверенным, $\log(1 - D(G(z)))$ насыщается, обучение замирает. 2017 год - Арджовский и команда выкатывают WGAN: вместо Jensen-Shannon divergence использовать Wasserstein-1 distance, она же Earth Mover's Distance.

Идея гениальна. Wasserstein-расстояние - 'сколько массы нужно переместить и куда', чтобы превратить одно распределение в другое. Оно непрерывно везде. Никакой насыщенности. Дополнительная награда: само значение loss теперь *коррелирует* с качеством. В оригинальном GAN loss колеблется хаотично, в WGAN он плавно падает.

Цена - D (теперь называется 'critic') должен быть 1-Lipschitz, иначе математика разваливается. Сначала это делали через weight clipping - тупо обрезали веса в $[-0.01, 0.01]$. Потом Гулраджани предложил gradient penalty (WGAN-GP) - штраф за норму градиента, отличную от 1. Сейчас GP - стандарт.

**Связь с RL:** policy gradient методы (PPO, TRPO) тоже борются с тем же зверем - нестабильность оптимизации, где landscape слишком крутой. Trust region и clipping в PPO - идейные родственники Lipschitz-ограничения в WGAN. Шульман читал статью WGAN, прежде чем писать TRPO.

Зачем в WGAN накладывают ограничение 1-Lipschitz на critic?

StyleGAN: разложить лицо на части управления

2018. NVIDIA. Tero Karras делает StyleGAN. Идея: разделить *то, что* генерируется (latent identity), и *как* оно генерируется (style). Вместо одного $z$ - vector $w$, который инжектится в каждый разрешённый блок отдельно через AdaIN-нормализацию. Каждый слой получает свой 'style' - от грубых черт (поза, овал лица) до тонких (цвет глаз, веснушки).

Mapping network $f: z \to w$ - 8-слойный MLP, который выравнивает скрытое пространство. Затем style modulation в каждом блоке: $y = \sigma_w \cdot \text{normalize}(x) + \mu_w$. Те же scale-shift трансформации, что в LayerNorm трансформера, только параметры приходят извне - от mapping network.

Результат - thispersondoesnotexist.com. Лица, неотличимые от настоящих, ни один из которых не существует. StyleGAN3 чинит aliasing, обучается на FFHQ за дни, генерирует $1024 \times 1024$ за миллисекунды. На потомках StyleGAN построены FaceApp, Remini, частично Reface.

**Style mixing:** на инференсе можно скрестить два $w$ - брать $w_1$ для первых блоков (структура), $w_2$ для последних (детали). Получается лицо с позой одного человека и текстурой кожи другого. Тот же приём - 'позаимствовать стиль' - используется в text-to-image моделях через cross-attention.

GAN - устаревшая технология, всё генерируется diffusion-моделями

GAN всё ещё лидер по скорости инференса: 1 forward pass vs 50+ шагов denoising у diffusion

StyleGAN генерирует $1024 \times 1024$ за 10 мс на одной A100. Stable Diffusion - за 1-3 секунды. Для real-time приложений (видеозвонки с фильтрами, игры, AR) GAN остаётся королём. Diffusion выигрывает на качестве и контролируемости, но платит в 100x latency. Архитектуры дополняют друг друга, а не отменяют

Что принципиально нового в StyleGAN по сравнению с обычным GAN?

Связанные темы

Куда GAN ведёт дальше:

  • Diffusion Models — Преемник GAN - стабильное обучение, лучшее качество, медленнее inference
  • Imitation Learning (GAIL) — Та же минимакс-игра, но в пространстве траекторий агента
  • Image Generation в продакшне — StyleGAN под капотом коммерческих фильтров и DeepFake-инструментов
  • Computer Vision — Discriminator - стандартный CNN, та же архитектура, что в задачах классификации

Ключевые идеи

  • GAN - две сети, играющие в минимакс: G рисует фейки, D ловит, обе становятся сильнее
  • Generator никогда не видит реальных данных напрямую, учится только через градиенты от D
  • Wasserstein-loss и gradient penalty - индустриальный стандарт стабильного обучения
  • StyleGAN - архитектурный прорыв: разделение latent identity и стиля через AdaIN
  • GAN не вытеснен diffusion - выигрывает в скорости inference, проигрывает в управляемости

Вопросы для размышления

  • Почему mode collapse - это не баг, а структурное свойство минимакс-игры?
  • Что общего между D в GAN и reward model в RLHF?
  • Когда выбрать GAN, а когда diffusion для конкретной задачи генерации?

Связанные уроки

  • dl-01 — Базовая архитектура нейросети - фундамент и для G, и для D
  • dl-15 — Diffusion - наследник GAN с более стабильным обучением
  • ml-25-neural-networks — Понимание MLP нужно, чтобы видеть, как G и D устроены внутри
  • prob-04-bayes — Дискриминатор оценивает posterior 'настоящее vs сгенерированное'
  • rl-14 — GAIL переносит мини-макс игру GAN в задачу имитации поведения
  • aie-26-image-generation — StyleGAN и его потомки - под капотом FaceApp и художественных продуктов
  • prob-01-intro
GAN: от теории к практике

0

1

Войти