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

GAN

Генеративно-состязательные сети

классикаВ генерации изображений вытеснены диффузией; живы в узких доменах и в дистилляции.

Направления: Генеративный ИИ · GAN

и дискриминатор обучаются в игре с нулевой суммой, повышая реалистичность выборок.

Ключевые тезисы

  • задаёт обучаемую вместо фиксированной метрики.
  • Типичные проблемы: mode collapse и неустойчивость обучения.
  • WGAN, спектральная и StyleGAN стабилизировали процесс.

Какую задачу решает

Генеративная задача формулируется просто: выдавать новые объекты, похожие на обучающую выборку, но не совпадающие с ней. Сложность в слове «похожие» — его трудно записать формулой. Попиксельная усредняет все правдоподобные варианты и превращает лицо в размытое пятно; честное требует нормировочной константы, которую для изображений не посчитать.

снимает вопрос радикально: меру качества не задают руками, её обучают. Рядом с генератором ставится вторая сеть — дискриминатор, — которая учится отличать настоящие объекты от подделок. Её выход и служит функцией потерь генератора: чем труднее дискриминатору поймать подделку, тем лучше генератор. Обе сети учатся одновременно и работают друг против друга — отсюда «состязательные».

Формально это минимаксная игра двух игроков. В идеальном равновесии распределение генератора совпадает с распределением данных, а всюду выдаёт 0.5 — то есть окончательно перестаёт отличать настоящее от сгенерированного и просто угадывает.

Как это выглядит на одном шаге обучения

Берём 64 настоящих фотографии и 64 шума. превращает шум в 64 картинки. Дискриминатор смотрит на все 128 и говорит для каждой, насколько она настоящая: сначала он почти всегда прав, и его ошибка мала. Шаг 1 — обновляем дискриминатор, чтобы он ставил настоящим ближе к 1, а подделкам ближе к 0. Шаг 2 — обновляем генератор так, чтобы дискриминатор поставил его картинкам оценку повыше; идёт через дискриминатора в генератор, но веса дискриминатора при этом заморожены. Через тысячи таких шагов дискриминатор перестаёт отличать одно от другого — его точность падает до 50%, и это успеха, а не поломки.

Подробный разбор

7 подтем — объяснения, формулы, примеры и интерактивные графики.

— это обычная , которая берёт на вход случайный и выдаёт объект: картинку, спектрограмму, таблицу. Никакой особой математики внутри нет, вся необычность — в том, откуда генератор берёт сигнал для обучения.

Обозначения
  • нормальное распределение со средним μ и дисперсией σ²
  • обучаемые параметры сети
  • объект: вектор признаков
  • число объектов в выборке
Один латентный — один объект; ничего, кроме шума, на входе нет

Вход называют латентным вектором, а пространство, из которого он берётся, — латентным пространством. Размерность обычно 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 его нет в принципе.

Если зафиксировать , оптимального критика можно выписать явно — это отношение плотностей:

Обозначения
  • объект: вектор признаков
  • вероятность (или плотность распределения)
Там, где бывает так же часто, как реальные данные, критик даёт ровно 1/2

Подставив обратно, получаем, что минимизирует расхождение Дженсена — Шеннона между своим распределением и настоящим: . Минимум достигается при , и тогда — критик перестаёт отличать одно от другого. Именно поэтому падение точности к 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()
Один шаг обучения GAN: сначала критик, потом генератор
  1. fake.detach() в шаге — самая частая ошибка новичка. Без него критика утечёт в генератор и обучение развалится.
  2. В шаге генератора метка стоит 1, хотя объект поддельный: буквально просит критика ошибиться.
  3. Веса на втором шаге не обновляются — работает только opt_G, хотя проходит сквозь всю связку .
  4. 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)
Как поймать mode collapse

Сгенерируйте 10 000 объектов и прогоните их через классификатор, обученный на настоящих данных: если на MNIST 80% сэмплов получают метку «1», а остальные девять цифр делят оставшееся — это коллапс мод, хотя каждая отдельная единица нарисована безупречно. Второй дешёвый тест: сгенерируйте сетку из независимых и посмотрите глазами — при коллапсе половина клеток окажется почти одинаковой.

На практике

Оценивать по значению бессмысленно: лосс измеряет положение в игре, а не качество результата, и у прекрасной модели он может быть выше, чем у посредственной. Чекпойнт выбирают по FID, посчитанному каждые несколько тысяч шагов, плюс контрольный взгляд человека.

ВариантЧто изменилЗачем берут
DCGAN вместо полносвязных слоёв, batch norm, без пулингабазовая рабочая схема для картинок
cGANи , и критик получают метку классауправляемая генерация: «нарисуй цифру 7»
WGAN-GPрасстояние Вассерштейна вместо JSD, штраф на устойчивое обучение, хоть немного связан с качеством
SN-GANспектральная в критикедешёвая стабилизация без второго прохода по
pix2pixвход — не шум, а картинка; PatchGAN-критикперевод «карта → фото» по парным данным
CycleGANдва генератора и цикл-консистентностьперевод между доменами без парных примеров
StyleGAN 2/3mapping-сеть, модуляция стиля по уровнямлучшее качество лиц и раздельный контроль атрибутов

Общая логика развития: сначала чинили архитектуру (DCGAN), потом меру расхождения (WGAN), потом ограничение на критика (спектральная ), потом устройство латентного пространства (StyleGAN). Каждый шаг лечил свой источник нестабильности, и по отдельности эти приёмы совместимы.

CycleGAN без парных данных

Есть 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%

Оценка плотности · Обучение без учителя

Восстановление распределения данных: где объекты встречаются часто, а где почти никогда.

Кому эта тема нужна

Профильная компетенция для роли: Исследователь.

Усиливает профиль: CV-инженер.

Спрашивают на собеседовании: Яндекс — ASR / TTS, Сбер — Речевые технологии.

Проверить себя

Тема встречается в тесте по направлениям — ошибки приведут обратно на эту страницу.

Следующий шагПроверить себя: Речь: ASR и TTSТема встречается в этом тесте 2 раза. Ошибка приведёт обратно на эту страницу — с объяснением, что именно не сошлось.Перейти →

Глава «Глубокое обучение» последний раз правилась . Нашли ошибку — напишите.