Generative Adversarial Network (GAN)
Генеративно-состязательная сеть (GAN) обучает генератор состязаться с дискриминатором, пока его образцы не становятся неотличимы от реальных. Рассматриваются обучение, варианты и применение.
Генеративно-состязательная сеть (GAN) — это модель генеративного ИИ, состоящая из двух нейросетей, которые обучаются в противостоянии: генератор превращает случайный шум в образцы, а дискриминатор пытается отличить эти образцы от реальных обучающих данных. После завершения обучения генератор создаёт новые изображения, аудио или табличные данные за один прямой проход. Иэн Гудфеллоу и его коллеги из Монреальского университета представили GAN в статье «Generative Adversarial Nets» 2014 года. GAN лидировали в синтезе изображений, пока в 2021 году их не обошли диффузионные модели.
Как работает обучение GAN#
Две сети участвуют в минимаксной игре. Дискриминатор — это бинарный классификатор, который выдаёт вероятность того, что входные данные реальны. Его обучают с помощью функции потерь на основе кросс-энтропии: реальные образцы получают оценку 1, а сгенерированные — 0. Генератор не видит реальные данные и обучается только на градиентах дискриминатора. В теоретическом оптимуме игры распределение сгенерированных данных совпадает с распределением данных, а дискриминатор выдаёт 0,5 для любого входа. В начале обучения подделки легко распознать, поэтому исходная целевая функция генератора даёт почти нулевой градиент — это разновидность проблемы затухания градиента. Поэтому в статье Гудфеллоу предложил генератору максимизировать вероятность того, что дискриминатор сочтёт его образцы реальными. В коде ниже используется эта несатурирующая функция потерь.
Одномерная GAN на PyTorch изучает гауссово распределение только по образцам:
import torch
from torch import nn
torch.manual_seed(0)
# Generator maps 8-D noise to a number; discriminator scores a number as real (high) or fake (low)
generator = nn.Sequential(nn.Linear(8, 32), nn.ReLU(), nn.Linear(32, 1))
discriminator = nn.Sequential(nn.Linear(1, 32), nn.LeakyReLU(0.2), nn.Linear(32, 1))
opt_g = torch.optim.Adam(generator.parameters(), lr=1e-3)
opt_d = torch.optim.Adam(discriminator.parameters(), lr=1e-3)
bce = nn.BCEWithLogitsLoss()
real_label, fake_label = torch.ones(64, 1), torch.zeros(64, 1)
for step in range(3000):
real = 4.0 + 1.25 * torch.randn(64, 1) # training data: samples from N(4, 1.25^2)
fake = generator(torch.randn(64, 8))
# Discriminator step: label real samples 1 and generated samples 0
loss_d = bce(discriminator(real), real_label) + bce(discriminator(fake.detach()), fake_label)
opt_d.zero_grad()
loss_d.backward()
opt_d.step()
# Generator step: push the discriminator to label generated samples 1
loss_g = bce(discriminator(fake), real_label)
opt_g.zero_grad()
loss_g.backward()
opt_g.step()
samples = generator(torch.randn(10000, 8)).detach()
print(f"Generated mean {samples.mean():.2f}, std {samples.std():.2f} (data: 4.00, 1.25)")
print(f"Discriminator's average P(real) on generated samples: {torch.sigmoid(discriminator(samples)).mean():.2f}")После 3 000 чередующихся шагов среднее значение сгенерированных образцов составляет 3,95, а стандартное отклонение — 1,20, тогда как для данных эти значения равны 4,00 и 1,25. Дискриминатор присваивает им среднюю вероятность 0,51 быть реальными — почти как при подбрасывании монеты, что соответствует теоретическому оптимуму.
Ключевые разновидности GAN#
- DCGAN: Разработка Алека Рэдфорда, Люка Метца и Суумита Чинталы 2015 года позволила надёжно обучать свёрточные генераторы и дискриминаторы: слои пулинга заменили свёртками с шагом, а также добавили пакетную нормализацию.
- Условные GAN и pix2pix: Если подавать метку класса или входное изображение в обе сети, генератор сможет создавать заданный результат. pix2pix Филлипа Изолы и его коллег (2017) обучается на парных преобразованиях, например карт меток в фотографии улиц и контуров в фотографии товаров.
- CycleGAN: Обучается преобразовывать изображения из одного набора в другой без парных примеров, например превращать лошадей в зебр или летние пейзажи в зимние. Для этого преобразованное изображение должно соответствовать исходному при обратном преобразовании.
- Wasserstein GAN (WGAN): Мартин Арьовский и его коллеги заменили классификатор критиком, оценивающим расстояние Вассерштейна между реальными и сгенерированными данными (2017). Это позволяет сохранять полезные градиенты, даже если распределения почти не пересекаются.
- StyleGAN: В StyleGAN (2018) и StyleGAN2 (2019) от NVIDIA обучаемый вектор стиля подаётся на каждый слой генератора. На лицах размером 1024 x 1024 из набора FFHQ StyleGAN2 достигла значения метрики Фреше—Инсепшена (FID) 2,84.
Применение#
- Сверхразрешение: SRGAN (2017), ESRGAN (2018) и Real-ESRGAN (2021) добавляют состязательную функцию потерь к сетям увеличения разрешения, восстанавливая чёткие текстуры там, где одна лишь попиксельная функция потерь приводит к размытию.
- Аугментация медицинских изображений: Мааян Фрид-Адар и её коллеги обучили GAN на КТ-снимках 182 поражений печени и добавили синтетические поражения в обучающие данные. Это повысило чувствительность классификатора с 78,6% до 85,7%, а специфичность — с 88,4% до 92,4%.
- Дипфейки: В исследовании Софи Найтингейл и Хани Фарида 2022 года участники определяли, настоящие или синтетические лица StyleGAN2, с точностью 48% — немного хуже случайного угадывания. Синтетические лица участники оценивали как более заслуживающие доверия.
Изображения, созданные GAN, служат синтетическими данными там, где реальных примеров мало, и дополняют аугментацию данных наряду с геометрическими преобразованиями, такими как отражение и поворот. Их добавляют в обучающую выборку YOLO26 так же, как любые другие изображения: в секции train файла YAML с описанием набора данных для обнаружения объектов Ultralytics можно указать список каталогов. Поэтому синтетические изображения могут храниться в отдельной папке рядом с реальными, а добавить или удалить их можно, изменив одну строку.
GAN, диффузионные модели и VAE#
Диффузионные модели обошли GAN по качеству изображений после того, как в 2021 году Прафулла Дхариуал и Алекс Никол из OpenAI сообщили, что диффузионная модель превзошла BigGAN-deep, лучшую на тот момент GAN, по метрике FID на ImageNet. Обучение диффузионных моделей — это стабильная задача регрессии без противника, которая полнее охватывает разнообразие данных. Обучение GAN может колебаться без сходимости или приводить к коллапсу мод, когда генератор ограничивается несколькими результатами, которые обманывают дискриминатор, и перестаёт создавать остальные. Вариационные автокодировщики также стабильно обучаются, но создают более размытые образцы. Преимущество GAN, которое сохраняется до сих пор, — скорость: для генерации нужен всего один прямой проход. В 2023 году GigaGAN от Adobe Research, Университета Карнеги — Меллона и POSTECH создавала результаты генерации изображений по тексту с разрешением 512 пикселей за 0,13 секунды. Состязательные функции потерь сохраняются и внутри диффузионных систем. Автокодировщик Stable Diffusion обучается с помощью дискриминатора на основе патчей, а SDXL Turbo от Stability AI использует дистилляцию диффузии с состязанием — разновидность дистилляции знаний с дискриминатором в функции потерь, — чтобы создавать изображение за один шаг.










