GAN: генератор и дискриминатор
Минимаксная теория игр, нестабильность обучения GAN, коллапс мод, реализация DCGAN
«GAN: генератор и дискриминатор» — бесплатный урок Learn AI with Python на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn AI with Python, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn AI with Python содержит 4 уроков всего.
Что такое GAN?
Генеративно-состязательная сеть сталкивает две сети друг с другом: Generator, создающий поддельные данные, и Discriminator, который определяет, являются данные настоящими или поддельными. Они соревнуются, и генератор учится создавать убедительные образцы.
Состязательная игра
Представьте фальсификатора (генератор) и детектива (дискриминатора). Фальсификатор совершенствует подделки, чтобы обмануть детектива, а детектив учится внимательнее их распознавать. Эта гонка вооружений заставляет обоих становиться лучше, пока подделки не начинают выглядеть как настоящие.
Генератор
Генератор преобразует случайный вектор шума в поддельное изображение. Он учится превращать бессмысленные случайные числа в структурированные данные, похожие на настоящие.
class Generator(nn.Module):
def __init__(self):
super().__init__()
self.net = nn.Sequential(
nn.Linear(100, 256), nn.ReLU(),
nn.Linear(256, 784), nn.Tanh()
)
def forward(self, z):
return self.net(z)Вектор шума
Вход z выбирается из стандартного нормального распределения. Разные векторы шума создают разные изображения, поэтому шум служит «начальным зерном» генерации. Его размерность (здесь 100) — это размер латентного пространства.
z = torch.randn(batch_size, 100)
fake_images = generator(z)Discriminator
Дискриминатор принимает изображение и выдаёт одну вероятность: насколько вероятно, что оно настоящее. Sigmoid возвращает значение в диапазоне [0,1], где 1 означает настоящее изображение, а 0 — поддельное.
class Discriminator(nn.Module):
def __init__(self):
super().__init__()
self.net = nn.Sequential(
nn.Linear(784, 256), nn.LeakyReLU(0.2),
nn.Linear(256, 1), nn.Sigmoid()
)Обучение дискриминатора
Обучайте D на пакете настоящих изображений с меткой 1 и поддельных изображений с меткой 0. Дискриминатор учится повышать оценки для настоящих изображений и понижать их для поддельных с помощью бинарной кросс-энтропии.
d_real = criterion(D(real), ones)
d_fake = criterion(D(fake.detach()), zeros)
d_loss = d_real + d_fake
d_loss.backward()Зачем применять detach() к подделкам?
При обучении D мы используем fake.detach(), чтобы градиенты не проходили в генератор. На этом шаге мы обновляем только дискриминатор; генератор получит возможность обновиться отдельно.
Обучение генератора
Теперь обучайте G обманывать D: пропускайте подделки через D и поощряйте генератор, когда D выдаёт результат «настоящее» (метка 1). Генератор совершенствуется, заставляя D считать его подделки настоящими.
g_loss = criterion(D(fake), ones) # want D to say "real"
g_loss.backward()
g_optimizer.step()Чередование обучения
На каждой итерации шаги чередуются: сначала обновляется D, затем G. Важно поддерживать их примерно сбалансированными: если D станет слишком сильным, G не будет получать полезный градиент; если слишком слабым — у G не будет достаточного вызова.
# per step
# 1) update Discriminator
# 2) update GeneratorСхлопывание мод
Классическая проблема — схлопывание мод: генератор находит один или несколько выходов, которые обманывают D, и создаёт только их, игнорируя разнообразие данных. Признак проблемы: все сгенерированные образцы выглядят почти одинаково.
Нестабильность обучения
GAN печально известны своей нестабильностью: значения ошибок колеблются, одна сеть может получить слишком большое преимущество над другой, а сходимость хрупка. Такие приёмы, как LeakyReLU, аккуратный выбор скорости обучения и сглаживание меток, помогают стабилизировать обучение.
Быстрая проверка
Проверьте, насколько хорошо Вы поняли принцип работы GAN.
Повторение: GAN
Вы изучили состязательную схему: генератор превращает вектор шума в поддельные образцы, дискриминатор выдаёт вероятность того, что образец настоящий или поддельный, а обучение проходит с помощью чередования: сначала D, затем G. Вы также узнали, как распознавать схлопывание мод и общую нестабильность, из-за которой GAN трудно обучать.
Часто задаваемые вопросы
Урок «GAN: генератор и дискриминатор» бесплатный?
Да — полный текст урока «GAN: генератор и дискриминатор» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn AI with Python, подпишись на CoddyKit PRO. Курс Learn AI with Python содержит 4 уроков всего.
Чему я научусь в уроке «GAN: генератор и дискриминатор»?
Минимаксная теория игр, нестабильность обучения GAN, коллапс мод, реализация DCGAN Ты практикуешь Learn AI with Python с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Learn AI with Python?
Предыдущий опыт не требуется. Learn AI with Python на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «GAN: генератор и дискриминатор»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Learn AI with Python?
Да. Каждый урок Learn AI with Python включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Автокодировщики для обучения представлений
- Вариационные автокодировщики (VAE)
- GAN: генератор и дискриминатор
- Условные GAN и перенос стиля