Генеративные модели: GAN и диффузия

До сих пор сети анализировали картинки. Генеративные модели делают обратное — создают новые изображения с нуля.

Генеративная модель — сеть, которая не классифицирует существующие картинки, а порождает новые, похожие на обучающие данные.

GAN: дуэль двух сетей

GAN (Generative Adversarial Network) — это две сети, соревнующиеся друг с другом:

  • Генератор получает случайный шум и пытается превратить его в правдоподобную картинку.
  • Дискриминатор — судья: ему показывают то настоящие фото, то поделки генератора, а он должен отличить подделку от реального.

Они учатся в противостоянии: генератор хочет обмануть судью, судья — не дать себя обмануть. Аналогия — фальшивомонетчик и эксперт. Сначала подделки грубые, эксперт легко их ловит. Но фальшивомонетчик учится на провалах, и со временем его «купюры» становятся неотличимы от настоящих. Так GAN научились генерировать фотореалистичные лица несуществующих людей.

# Цикл обучения GAN (идея)
шум -> Генератор -> фейковая картинка
                         \
настоящие картинки -----> Дискриминатор -> «настоящая / фейк?»
# Генератор хочет, чтобы судья ошибался; судья хочет угадывать.

Диффузия: из шума к картинке

Диффузионные модели (Stable Diffusion, DALL-E, Midjourney) сейчас задают тон в генерации. Их идея изящна и работает в два этапа:

  1. Прямой процесс (обучение): берут настоящую картинку и шаг за шагом добавляют шум, пока она не превратится в чистый «снег». Сеть учат обратному: по зашумлённой картинке предсказывать, как убрать чуть-чуть шума.
  2. Генерация: стартуют с чистого случайного шума и применяют сеть много раз, каждый раз убирая немного шума. Шаг за шагом из хаоса проявляется осмысленная картинка.

Идею легко прочувствовать на простом «расшумлении» одной строки чисел: будем приближать зашумлённый сигнал к среднему соседей, и за несколько шагов выбросы сгладятся.

signal = [10, 90, 12, 88, 11]   # «зашумлённый» сигнал

def denoise_step(s):
    out = list(s)
    for i in range(1, len(s) - 1):
        out[i] = round((s[i - 1] + s[i] + s[i + 1]) / 3)
    return out

print("Старт:", signal)
for step in range(3):
    signal = denoise_step(signal)
    print(f"Шаг {step + 1}:", signal)

Вывод:

Старт: [10, 90, 12, 88, 11]
Шаг 1: [10, 37, 63, 37, 11]
Шаг 2: [10, 37, 46, 37, 11]
Шаг 3: [10, 31, 40, 31, 11]

Это игрушка, но она передаёт суть: за несколько шагов сигнал сглаживается, хаос отступает. Настоящая диффузионная сеть на каждом шаге «угадывает», какой шум убрать, и за десятки шагов превращает случайный шум в детальную картинку — часто по текстовому описанию (text-to-image).

GAN против диффузии

GANДиффузия
Как генерируетза один проход генератораза много шагов расшумления
Скоростьбыстромедленнее (много шагов)
Обучениенестабильное (дуэль)стабильнее
Качество и разнообразиехорошеесейчас лидирует

Итог

  • Генеративные модели создают новые картинки, а не анализируют готовые.
  • GAN — дуэль генератора и дискриминатора (фальшивомонетчик против эксперта).
  • Диффузия учится убирать шум и генерирует, расшумляя случайный «снег» шаг за шагом.
  • Сейчас диффузионные модели лидируют в качестве и text-to-image генерации.
Проверьте себя
1. Как устроена GAN?
AОдна сеть, классифицирующая картинки
BДве соревнующиеся сети: генератор создаёт картинки, дискриминатор отличает их от настоящих
CСеть, убирающая шум за много шагов
DСеть для поиска границ
2. На какой идее основаны диффузионные модели?
AРезкое увеличение разрешения
BСеть учится убирать шум, и генерация идёт от случайного шума к картинке за много шагов расшумления
CПоиск ключевых точек
DКлассификация по эмбеддингам
3. Чем диффузия обычно отличается от GAN по процессу генерации?
AДиффузия генерирует за один проход, GAN — за много шагов
BGAN генерирует за один проход генератора, а диффузия — за много шагов постепенного расшумления
CОни идентичны
DДиффузия не использует нейросети
Поддержать проект