GAN
Коротко
Definition
GAN, или Generative Adversarial Network, — это генеративная архитектура, в которой две нейронные сети обучаются в состязании: генератор создаёт объекты, а дискриминатор пытается отличить сгенерированные объекты от реальных.
GAN состоит из двух моделей:
- Generator — создаёт фейковые объекты из случайного latent vector ;
- Discriminator — оценивает, является объект реальным или сгенерированным.
Схематично:
Генератор пытается обмануть дискриминатор. Дискриминатор пытается не быть обманутым.
Интуиция
GAN можно понимать как игру между фальшивомонетчиком и экспертом.
Генератор — фальшивомонетчик. Он пытается создавать всё более реалистичные объекты.
Дискриминатор — эксперт. Он учится отличать реальные объекты от поддельных.
Во время обучения:
- Дискриминатор становится лучше в распознавании фейков.
- Генератор получает сигнал, какие фейки были распознаны.
- Генератор учится делать фейки правдоподобнее.
- Дискриминатор снова усложняет задачу.
Если обучение идёт хорошо, генератор постепенно приближается к распределению реальных данных.
Формальное описание
GAN — это генеративная модель.
| Характеристика | Значение |
|---|---|
| Тип модели | Генеративная нейросетевая модель |
| Тип обучения | Состязательное обучение |
| Основная задача | Генерация данных |
| Частые типы данных | Изображения, аудио, видео, представления объектов |
| Основные компоненты | Generator и Discriminator |
Генератор получает случайный вектор:
и создаёт объект:
Дискриминатор получает объект или и возвращает вероятность того, что объект реален:
Цель генератора — сделать похожим на реальные данные. Цель дискриминатора — отличить реальные данные от сгенерированных.
Входы и выходы
Вход генератора:
где обычно сэмплируется из простого распределения:
или из равномерного распределения.
Выход генератора:
Например, для генерации RGB-изображения выход может иметь форму:
Вход дискриминатора:
- реальный объект из обучающего датасета;
- сгенерированный объект .
Выход дискриминатора:
где значение близко к 1 означает «реальный объект», а значение близко к 0 — «фейковый объект».
Устройство
GAN состоит из генератора и дискриминатора.
Для изображений часто используют DCGAN-подобную архитектуру, где обе сети строятся на свёрточных блоках.
Генератор
Генератор преобразует latent vector в полноценный объект.
Для изображений типичная логика такая:
- Взять короткий случайный vector .
- Через Полносвязный слой превратить его в маленькую карту признаков.
- Сделать reshape, например в tensor
4 × 4 × 512. - Постепенно увеличивать пространственный размер.
- Уменьшать число каналов.
- Получить итоговое изображение, например
64 × 64 × 3.
В DCGAN-подобных генераторах часто используются:
- transposed convolutions;
- upsampling + convolution;
- Батч-нормализация;
- ReLU в скрытых слоях;
tanhна выходе, если изображения нормализованы в диапазон[-1, 1].
Транспонированные свёртки можно понимать как операцию, которая увеличивает пространственный размер карты признаков. Они не являются «обычной свёрткой наоборот» в строгом математическом смысле, но архитектурно используются для upsampling.
Дискриминатор
Дискриминатор — это бинарный классификатор.
Он получает объект и оценивает вероятность, что объект пришёл из реального датасета, а не от генератора.
Для изображений типичный дискриминатор похож на CNN:
- свёрточные слои;
- stride для уменьшения ширины и высоты;
- Leaky ReLU;
- финальный classifier;
- sigmoid на выходе в классическом GAN.
В DCGAN часто не используют pooling, потому что сеть сама учится уменьшать пространственный размер через свёртки со stride.
Important
В дискриминаторе часто используют Leaky ReLU, потому что обычный ReLU обнуляет отрицательные значения и может ухудшать прохождение градиента. Генератору нужен полезный градиент от дискриминатора, чтобы понимать, как менять сгенерированные объекты.
Функция потерь
Классический GAN обучается как minimax-игра:
Дискриминатор максимизирует:
То есть он хочет:
- для реальных объектов делать ;
- для фейковых объектов делать .
Генератор в классической minimax-форме минимизирует:
То есть он хочет, чтобы дискриминатор ошибался и считал фейковые объекты реальными.
На практике часто используют non-saturating generator loss:
Он даёт более сильный градиент генератору на ранних этапах обучения.
Как обучается
Обучение GAN обычно чередует шаги дискриминатора и генератора.
Типовой цикл:
- Взять batch реальных объектов .
- Сэмплировать noise vectors .
- Получить фейковые объекты .
- Обновить дискриминатор, чтобы он лучше отличал реальные объекты от фейковых.
- Сэмплировать новый batch .
- Обновить генератор так, чтобы стало ближе к
1. - Повторять много итераций.
Важно: когда обновляется дискриминатор, параметры генератора обычно не обновляются. Когда обновляется генератор, параметры дискриминатора обычно фиксируются.
Иначе игра становится ещё более нестабильной.
Гиперпараметры
Основные гиперпараметры GAN:
- размер latent vector ;
- архитектура генератора;
- архитектура дискриминатора;
- learning rate генератора;
- learning rate дискриминатора;
- batch size;
- число шагов дискриминатора на шаг генератора;
- optimizer;
- normalization layers;
- функции активации;
- тип GAN loss;
- регуляризация дискриминатора;
- способ оценки качества генерации.
GAN особенно чувствительны к гиперпараметрам. Небольшие изменения могут заметно влиять на стабильность обучения.
Когда использовать
GAN стоит использовать, если:
- нужно генерировать реалистичные объекты;
- особенно важна визуальная чёткость сэмплов;
- есть достаточно данных;
- есть ресурсы для нестабильного обучения;
- можно визуально или метриками оценивать качество генерации;
- задача связана с изображениями, стилями, domain translation или data augmentation.
GAN исторически особенно известны в генерации изображений.
Примеры применений:
- генерация лиц;
- image-to-image translation;
- super-resolution;
- style transfer;
- data augmentation;
- генерация синтетических примеров.
Когда не использовать
GAN может быть плохим выбором, если:
- данных мало;
- обучение должно быть простым и стабильным;
- нужна хорошая likelihood-оценка;
- нужно покрывать всё распределение данных;
- нельзя долго подбирать гиперпараметры;
- mode collapse критичен;
- есть более подходящая диффузионная модель или VQ-VAE.
Современные диффузионные модели часто обучаются стабильнее и дают сильное качество в генерации изображений, хотя могут быть медленнее при сэмплировании.
Типичные проблемы
Mode collapse
Mode collapse возникает, когда генератор создаёт мало разнообразных объектов.
Например, вместо разных лиц он генерирует почти одно и то же лицо с небольшими изменениями.
Это значит, что генератор нашёл способ обманывать дискриминатор, но не выучил всё распределение данных.
Нестабильность обучения
GAN — это игра двух моделей. Если одна модель становится слишком сильной, обучение другой может ухудшиться.
Если дискриминатор слишком хорош, генератор получает слабый или бесполезный градиент.
Если генератор слишком быстро обманывает дискриминатор, дискриминатор перестаёт давать полезный сигнал.
Saturating gradient
В классическом GAN, если дискриминатор уверенно распознаёт фейки, выражение может давать слабый градиент для генератора.
Поэтому часто используют non-saturating loss:
Сложность оценки качества
GAN не даёт простой reconstruction loss, как Автоэнкодер, и не даёт прямую likelihood-оценку.
Качество часто оценивают через:
- визуальную проверку;
- FID;
- Inception Score;
- diversity metrics;
- domain-specific metrics.
Чувствительность к архитектуре
GAN часто требует аккуратной архитектуры, нормализации, learning rate и баланса между generator и discriminator.
Метрики оценки
Для GAN используют специальные метрики генерации.
Для изображений часто применяют:
- FID;
- Inception Score;
- precision and recall for generative models;
- diversity metrics.
Но метрики не всегда полностью совпадают с человеческим восприятием качества.
Также важно смотреть:
- разнообразие сэмплов;
- признаки mode collapse;
- артефакты;
- качество на редких типах объектов;
- соответствие предметной области.
Минимальный пример
Пусть нужно генерировать изображения цифр.
- Сэмплируем случайный vector:
- Генератор создаёт изображение:
-
Дискриминатор получает реальные цифры и фейковые цифры .
-
Дискриминатор учится различать:
- Генератор учится делать так, чтобы:
Если обучение успешно, постепенно начинает выглядеть как настоящие цифры.
Практические замечания
Хороший workflow для GAN:
- Начать с простой проверенной архитектуры.
- Нормализовать данные в диапазон, соответствующий выходной активации генератора.
- Следить за балансом generator/discriminator.
- Использовать Leaky ReLU в discriminator.
- Проверять сэмплы визуально во время обучения.
- Следить за mode collapse.
- Использовать FID или другие метрики, если доступны.
- Сравнить с VAE/VQ-VAE или диффузионной моделью.
- Не полагаться только на loss-кривые.
- Сохранять промежуточные checkpoints.
GAN loss может выглядеть неинтуитивно: хороший loss не всегда означает хорошие изображения, а ухудшение одного компонента может быть частью нормальной динамики игры.