и дискриминатор обучаются в игре с нулевой суммой, повышая реалистичность выборок.
Ключевые тезисы
- задаёт обучаемую вместо фиксированной метрики.
- Типичные проблемы: mode collapse и неустойчивость обучения.
- WGAN, спектральная и StyleGAN стабилизировали процесс.
Какую задачу решает
Генеративная задача формулируется просто: выдавать новые объекты, похожие на обучающую выборку, но не совпадающие с ней. Сложность в слове «похожие» — его трудно записать формулой. Попиксельная усредняет все правдоподобные варианты и превращает лицо в размытое пятно; честное требует нормировочной константы, которую для изображений не посчитать.
снимает вопрос радикально: меру качества не задают руками, её обучают. Рядом с генератором ставится вторая сеть — дискриминатор, — которая учится отличать настоящие объекты от подделок. Её выход и служит функцией потерь генератора: чем труднее дискриминатору поймать подделку, тем лучше генератор. Обе сети учатся одновременно и работают друг против друга — отсюда «состязательные».
Формально это минимаксная игра двух игроков. В идеальном равновесии распределение генератора совпадает с распределением данных, а всюду выдаёт 0.5 — то есть окончательно перестаёт отличать настоящее от сгенерированного и просто угадывает.
Берём 64 настоящих фотографии и 64 шума. превращает шум в 64 картинки. Дискриминатор смотрит на все 128 и говорит для каждой, насколько она настоящая: сначала он почти всегда прав, и его ошибка мала. Шаг 1 — обновляем дискриминатор, чтобы он ставил настоящим ближе к 1, а подделкам ближе к 0. Шаг 2 — обновляем генератор так, чтобы дискриминатор поставил его картинкам оценку повыше; идёт через дискриминатора в генератор, но веса дискриминатора при этом заморожены. Через тысячи таких шагов дискриминатор перестаёт отличать одно от другого — его точность падает до 50%, и это успеха, а не поломки.
Подробный разбор
— это обычная , которая берёт на вход случайный и выдаёт объект: картинку, спектрограмму, таблицу. Никакой особой математики внутри нет, вся необычность — в том, откуда генератор берёт сигнал для обучения.
- нормальное распределение со средним μ и дисперсией σ²
- обучаемые параметры сети
- объект: вектор признаков
- число объектов в выборке
Вход называют латентным вектором, а пространство, из которого он берётся, — латентным пространством. Размерность обычно 100–512: этого хватает, чтобы закодировать позу, освещение, цвет и прочие факторы вариации. Само распределение берут простое ( или равномерное на сфере) именно потому, что сэмплировать из него тривиально — всю сложность берёт на себя сеть.
Ключевая особенность: генератор ни разу не видит настоящих данных. Он не сравнивает свою картинку с эталоном — эталона нет. Единственный источник информации — , пришедший от дискриминатора через его же выход. Поэтому качество генератора не может быть выше, чем качество критика, который его учит.
- DCGAN: стопка transposed-свёрток, каждая удваивает разрешение — . Базовая схема, с которой начинают.
- Progressive growing: обучение стартует на и добавляет слои по мере сходимости — так впервые получили честные .
- StyleGAN: сначала проходит через mapping-сеть в промежуточное пространство , а управляет на каждом уровне. Это и дало раздельный контроль над крупной структурой и мелкой текстурой.
Возьмите два и , дающие два разных лица, и постройте промежуточные для . У обученного генератора получится плавный морфинг: лицо поворачивается, меняется причёска, но каждый промежуточный кадр остаётся лицом. Если вместо этого вы видите наложение двух картинок или мусор — запомнил примеры, а не выучил многообразие.
Два практических правила из DCGAN, которые живут до сих пор: последний слой генератора — tanh (данные при этом масштабируют в ), а в этот последний слой не ставят. Иначе сеть не может выдавать насыщенные цвета и картинки выходят блёклыми.
— бинарный классификатор: на вход объект, на выходе вероятность того, что объект настоящий. Обучается он как самая обычная сеть, по , на смеси реальных примеров (метка 1) и продукции генератора (метка 0).
- математическое ожидание — среднее по распределению
- объект: вектор признаков
- вероятность (или плотность распределения)
- функция потерь — то, что минимизируется при обучении
- логарифм: превращает произведения в суммы и сжимает масштаб
Вся идея держится на одном сдвиге взгляда: выход дискриминатора — это и есть функция потерь генератора. В обычном обучении метрику качества пишет инженер и она фиксирована; здесь её обучают вместе с моделью, и она подстраивается под текущие слабости генератора. Как только перестаёт делать одну ошибку, критик находит следующую.
| Фиксированный () | Обучаемый критик () | |
|---|---|---|
| Что штрафует | отклонение каждого пикселя | , по которым подделку видно |
| Реакция на несколько верных ответов | усредняет их — получается размытие | любой из них принимает, если он реалистичен |
| Меняется ли во время обучения | нет | да, следует за генератором |
| Что с ним после обучения | остаётся метрикой | выбрасывается, в прод идёт только |
- PatchGAN: критик оценивает не картинку целиком, а каждый её участок . Меньше параметров и жёстче контроль текстуры — стандарт для pix2pix и CycleGAN.
- Спектральная нормализация: делит веса каждого слоя на его старшее сингулярное число, ограничивая константу Липшица. Самый дешёвый способ не дать критику стать слишком сильным.
- Label smoothing: настоящим объектам ставят метку 0.9 вместо 1.0 — критик перестаёт быть слишком уверенным и отдаёт генератору более информативный .
Если точность уехала к 100%, обучение фактически остановилось: он отличает подделку идеально, насыщается, и генератора обнуляется. Здоровое состояние — точность около 50–70%, то есть критик всё время немного проигрывает.
- математическое ожидание — среднее по распределению
- объект: вектор признаков
- вероятность (или плотность распределения)
- логарифм: превращает произведения в суммы и сжимает масштаб
Один и тот же функционал максимизирует, а генератор минимизирует. Это не минимизация функции, а поиск седловой точки, и отсюда все практические сложности: у обычной оптимизации есть монотонно убывающий , у GAN его нет в принципе.
Если зафиксировать , оптимального критика можно выписать явно — это отношение плотностей:
- объект: вектор признаков
- вероятность (или плотность распределения)
Подставив обратно, получаем, что минимизирует расхождение Дженсена — Шеннона между своим распределением и настоящим: . Минимум достигается при , и тогда — критик перестаёт отличать одно от другого. Именно поэтому падение точности к 50% считают успеха.
На практике исходную формулу для генератора не используют: в начале обучения подделки очевидны, , и выходит на плато с почти нулевым . Вместо минимизации берут non-saturating-вариант — максимизацию:
- математическое ожидание — среднее по распределению
- вероятность (или плотность распределения)
- функция потерь — то, что минимизируется при обучении
- логарифм: превращает произведения в суммы и сжимает масштаб
Расхождение Дженсена — Шеннона ведёт себя плохо, когда носители распределений почти не пересекаются, — а в начале обучения это ровно тот случай. Отсюда и выросла WGAN: расстояние Вассерштейна остаётся информативным даже у непересекающихся распределений.
Одна итерация — это два независимых обновления, каждое со своим . Порядок важен: сначала критик получает шанс поймать текущие подделки, потом пытается его обмануть.
for real in loader:
# --- 1. дискриминатор: учимся отличать ---
z = torch.randn(real.size(0), z_dim, device=dev)
fake = G(z)
d_real = D(real)
d_fake = D(fake.detach()) # detach: градиент в G не идёт
loss_D = bce(d_real, ones) + bce(d_fake, zeros)
opt_D.zero_grad(); loss_D.backward(); opt_D.step()
# --- 2. генератор: учимся обманывать ---
d_fake = D(fake) # тот же fake, но уже без detach
loss_G = bce(d_fake, ones) # non-saturating: хотим D(G(z)) -> 1
opt_G.zero_grad(); loss_G.backward(); opt_G.step()fake.detach()в шаге — самая частая ошибка новичка. Без него критика утечёт в генератор и обучение развалится.- В шаге генератора метка стоит 1, хотя объект поддельный: буквально просит критика ошибиться.
- Веса на втором шаге не обновляются — работает только
opt_G, хотя проходит сквозь всю связку . - Two-timescale (TTUR): критику дают выше, чем генератору (например, против ) — это заметно стабилизирует игру.
loss_D держится около 1.0–1.4, loss_G — около 0.7–2.0, и обе величины колеблются, не уходя в ноль. Если loss_D упал почти в 0, а loss_G растёт — критик победил, остался без : снижайте его или добавляйте спектральную . Если обе величины замерли и картинки перестали меняться — обучение застряло; чаще всего дешевле перезапустить с другим сидом, чем чинить.
- Mode collapse: находит несколько образцов, надёжно обманывающих критика, и выдаёт только их вариации. Картинки при этом отличные — теряется именно разнообразие, и по глазу это видно не сразу.
- Дисбаланс сил: слишком сильный насыщает и оставляет генератор без ; слишком слабый — пропускает мусор.
- Осцилляции: обновления двух игроков раскачивают друг друга, и точка равновесия обходится по кругу вместо того, чтобы достигаться.
Стандартный набор лечения — не один приём, а связка: Wasserstein-лосс с gradient penalty меняет саму меру расхождения на более гладкую, спектральная нормализация ограничивает критика по Липшицу, TTUR разводит , прогрессивное обучение снимает нагрузку с ранних итераций.
- математическое ожидание — среднее по распределению
- сила регуляризации: штраф за сложность модели
- объект: вектор признаков
- функция потерь — то, что минимизируется при обучении
- градиент: вектор частных производных
- норма — длина вектора
Сгенерируйте 10 000 объектов и прогоните их через классификатор, обученный на настоящих данных: если на MNIST 80% сэмплов получают метку «1», а остальные девять цифр делят оставшееся — это коллапс мод, хотя каждая отдельная единица нарисована безупречно. Второй дешёвый тест: сгенерируйте сетку из независимых и посмотрите глазами — при коллапсе половина клеток окажется почти одинаковой.
Оценивать по значению бессмысленно: лосс измеряет положение в игре, а не качество результата, и у прекрасной модели он может быть выше, чем у посредственной. Чекпойнт выбирают по FID, посчитанному каждые несколько тысяч шагов, плюс контрольный взгляд человека.
| Вариант | Что изменил | Зачем берут |
|---|---|---|
| DCGAN | вместо полносвязных слоёв, batch norm, без пулинга | базовая рабочая схема для картинок |
| cGAN | и , и критик получают метку класса | управляемая генерация: «нарисуй цифру 7» |
| WGAN-GP | расстояние Вассерштейна вместо JSD, штраф на | устойчивое обучение, хоть немного связан с качеством |
| SN-GAN | спектральная в критике | дешёвая стабилизация без второго прохода по |
| pix2pix | вход — не шум, а картинка; PatchGAN-критик | перевод «карта → фото» по парным данным |
| CycleGAN | два генератора и цикл-консистентность | перевод между доменами без парных примеров |
| StyleGAN 2/3 | mapping-сеть, модуляция стиля по уровням | лучшее качество лиц и раздельный контроль атрибутов |
Общая логика развития: сначала чинили архитектуру (DCGAN), потом меру расхождения (WGAN), потом ограничение на критика (спектральная ), потом устройство латентного пространства (StyleGAN). Каждый шаг лечил свой источник нестабильности, и по отдельности эти приёмы совместимы.
Есть 1000 фотографий лета и 1000 фотографий зимы — но не одних и тех же мест. Обучаются два генератора: и , каждый со своим критиком. К состязательному лоссу добавляется требование цикла: . Именно оно не даёт генератору нарисовать «какую-нибудь зиму» вместо зимней версии конкретного кадра.
У генерации нет правильного ответа, поэтому качество меряют не по объектам, а по распределениям: берут предобученной сети (обычно Inception) для 10–50 тысяч настоящих и стольких же сгенерированных объектов и сравнивают их статистики.
- среднее значение
- награда, полученная агентом на шаге
- норма — длина вектора
- FID ловит и качество, и разнообразие сразу, но одним числом — по нему не понять, что именно сломалось.
- Precision / Recall для генеративных моделей разделяют эти две вещи: — доля реалистичных сэмплов, — доля покрытых мод. Mode collapse виден как провал recall при высоком precision.
- Inception Score сегодня почти не используют: он не сравнивается с реальными данными и легко обманывается.
- Человеческая оценка остаётся арбитром: попарные сравнения «какая картинка реалистичнее» ловят артефакты, которые метрики пропускают.
FID сильно зависит от числа сэмплов и от реализации: значения из разных статей сравнивать нельзя. Сравнивайте только свои прогоны между собой, при одинаковом размере выборки и одинаковом коде метрики.
Где применяется
- Сверхразрешение и ESRGAN и Real-ESRGAN дорисовывают правдоподобную текстуру там, где данных в пикселях уже нет. Регрессионный апскейл даёт «мыло», состязательный — резкие детали, пусть и придуманные.
- Перенос стиля и image-to-imagepix2pix переводит карту в фотографию, CycleGAN учит перевод «лето ↔ зима» вообще без парных примеров. здесь проверяет, похож ли результат на нужный домен.
- Синтетика для обученияДорисовка редких классов в медицинских снимках и промышленном контроле дефектов, где настоящих примеров дефекта единицы, а размечать их дорого.
- Главная актуальная роль. Состязательный сжимает 50-шаговую диффузию до 1–4 шагов (ADD, LCM-подходы) — так работают модели генерации «в реальном времени».
- Редактирование через латентВ StyleGAN направления в латентном пространстве соответствуют осмысленным атрибутам: возраст, поза, освещение. Изображение проецируют в латент, двигают и получают правку.
Плюсы, минусы и альтернативы
Плюсы
- Одношаговая генерация: один прямой проход вместо десятков шагов — на порядки быстрее и дешевле в .
- Резкость. Обучаемый критерий не усредняет варианты, поэтому текстуры получаются чёткими там, где выдаёт размытие.
- Не требует ни явного , ни обратимой архитектуры: может быть любой сетью.
- Латентное пространство компактно и хорошо структурировано — удобно для редактирования и интерполяции.
- На узком домене (лица, текстуры, шрифты) при небольшом бюджете обучения до сих пор конкурентоспособен.
Минусы
- Обучение неустойчиво: равновесие двух сетей легко разваливается, и восстановить его перезапуском с другим сидом иногда проще, чем починить.
- Mode collapse — потеря разнообразия, которую по картинкам сразу не увидишь.
- Значение ничего не говорит о качестве: нельзя выбрать чекпойнт по лоссу, нужны FID и глаз человека.
- Нет оценки — не годится для и сжатия.
- Плохо масштабируется на разнородные данные: «всё на свете по тексту» уверенно выиграла .
- Много чувствительных : соотношение шагов и , , коэффициент gradient penalty.
Брать, если
- Нужна генерация в реальном времени или на слабом железе — счёт идёт на миллисекунды.
- Домен узкий и однородный: лица, текстуры, спутниковые тайлы, шрифты.
- Задача — превратить одну картинку в другую, особенно без парных данных (CycleGAN).
- Нужно ускорить уже обученную диффузионную модель .
Не брать, если
- Нужна генерация по произвольному текстовому запросу и широкое покрытие мира — берите диффузию.
- Нужны вероятности или (, сжатие) — смотрите в сторону нормализующих потоков и .
- Нет бюджета на возню с нестабильным обучением: сходится предсказуемее почти без подбора.
- Разнообразие важнее резкости — систематически теряет редкие моды.
Чем заменяют
Видеолекции
Тайм-кода именно на эту тему в записях нет. Но глава «Глубокое обучение» разобрана в курсах целиком — с той оговоркой, что место в записи придётся искать самому.
Связанные темы
Генеративные модели
VAE80%
Вариационный автоэнкодер · Глубокое обучениеВероятностный автоэнкодер: кодирует объект в распределение и учится генерировать из латентного пространства.
Diffusion Models80%
Диффузионные модели · Глубокое обучениеМодель учится обращать процесс постепенного зашумления, превращая шум в изображение за серию шагов.
Generative Models80%
Генеративные модели · Генеративный ИИМодели, обучающие распределение данных и умеющие порождать новые объекты из него.
Autoregressive Models80%
Авторегрессионные модели · Генеративный ИИПорождают объект по частям, каждый раз предсказывая следующий элемент по предыдущим.
VAE80%
Вариационный автоэнкодер · Генеративный ИИГенерация через непрерывное вероятностное латентное пространство.
GAN80%
GAN · Генеративный ИИСостязательная пара сетей, дающая резкие и реалистичные изображения.
Diffusion80%
Диффузия · Генеративный ИИИтеративное расшумление — текущий стандарт генерации изображений, видео и аудио.
Density Estimation80%
Оценка плотности · Обучение без учителяВосстановление распределения данных: где объекты встречаются часто, а где почти никогда.
Всё, что названо в описании, разобрано здесь же или в соседней теме — переходы под каждым определением.
Генератор
Сеть, превращающая случайный шума в объект. Настоящих данных не видит никогда — учится только по сигналу от . Это единственная часть, которая нужна после обучения.
Разбор ниже: Генератор: из шума в объектДискриминатор
Бинарный классификатор «настоящее или подделка». Играет роль обучаемой и после обучения выбрасывается — в проде остаётся только .
Разбор ниже: Дискриминатор: обучаемая функция потерьЛатентный вектор
Случайный вход генератора, обычно размерности 100–512. Один — один объект; движение по этому пространству плавно меняет результат.
Разбор ниже: Генератор: из шума в объектМинимаксная игра
минимизирует то, что дискриминатор максимизирует. Цель обучения — не минимум функции, а равновесие Нэша, поэтому привычные приёмы оптимизации работают хуже.
Разбор ниже: Минимаксная игра и что в ней оптимальноMode collapse
находит несколько образцов, которые надёжно обманывают дискриминатора, и выдаёт только их вариации. Качество картинки высокое, разнообразие потеряно.
Разбор ниже: Mode collapse и стабилизацияFID
Fréchet Inception Distance: расстояние между статистиками настоящих и сгенерированных изображений. Основная метрика качества, потому что по значению лосса о ничего сказать нельзя.
Отдельная тема: Generative Losses — Функции потерь генеративных моделейПрофильная компетенция для роли: Исследователь.
Усиливает профиль: CV-инженер.
Спрашивают на собеседовании: Яндекс — ASR / TTS, Сбер — Речевые технологии.
Тема встречается в тесте по направлениям — ошибки приведут обратно на эту страницу.
Глава «Глубокое обучение» последний раз правилась . Нашли ошибку — напишите.