Генеративные модели: GAN и диффузия
До сих пор сети анализировали картинки. Генеративные модели делают обратное — создают новые изображения с нуля.
Генеративная модель — сеть, которая не классифицирует существующие картинки, а порождает новые, похожие на обучающие данные.
GAN: дуэль двух сетей
GAN (Generative Adversarial Network) — это две сети, соревнующиеся друг с другом:
- Генератор получает случайный шум и пытается превратить его в правдоподобную картинку.
- Дискриминатор — судья: ему показывают то настоящие фото, то поделки генератора, а он должен отличить подделку от реального.
Они учатся в противостоянии: генератор хочет обмануть судью, судья — не дать себя обмануть. Аналогия — фальшивомонетчик и эксперт. Сначала подделки грубые, эксперт легко их ловит. Но фальшивомонетчик учится на провалах, и со временем его «купюры» становятся неотличимы от настоящих. Так GAN научились генерировать фотореалистичные лица несуществующих людей.
# Цикл обучения GAN (идея)
шум -> Генератор -> фейковая картинка
\
настоящие картинки -----> Дискриминатор -> «настоящая / фейк?»
# Генератор хочет, чтобы судья ошибался; судья хочет угадывать.
Диффузия: из шума к картинке
Диффузионные модели (Stable Diffusion, DALL-E, Midjourney) сейчас задают тон в генерации. Их идея изящна и работает в два этапа:
- Прямой процесс (обучение): берут настоящую картинку и шаг за шагом добавляют шум, пока она не превратится в чистый «снег». Сеть учат обратному: по зашумлённой картинке предсказывать, как убрать чуть-чуть шума.
- Генерация: стартуют с чистого случайного шума и применяют сеть много раз, каждый раз убирая немного шума. Шаг за шагом из хаоса проявляется осмысленная картинка.
Идею легко прочувствовать на простом «расшумлении» одной строки чисел: будем приближать зашумлённый сигнал к среднему соседей, и за несколько шагов выбросы сгладятся.
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 генерации.