[Машинное обучение] Генеративно-состязательная сеть (GAN) — нейронная сеть, генерирующая новые данные
[Машинное обучение] Генеративно-состязательная сеть (GAN) — нейронная сеть, генерирующая новые данные
Генеративный против сети (Generative Adversarial Сети (сокращенно GAN) — это инновационная нейронная сеть. структура сети, в последние годы в машинном обучение и область искусственного интеллекта привлекли широкое внимание на. Основная идея GAN — через две нейронные сетевая состязательная тренировка для создания качественных и реальных данныеаналогичный новыйданные。это внутригенерация изображения、создание видео、увеличение данныхпродемонстрировали большой потенциал в。в этом блоге,Подробно обсудим принцип работы и сценарии применения GAN.,И продемонстрируйте процесс его реализации на примерах кода.

1. Основные понятия ГАН

GAN состоит из двух частей: генератора и дискриминатора. Две сети конкурируют друг с другом за постоянное улучшение своих возможностей, в конечном итоге генерируя реалистичные данные.

  • Генератор (Г): Задача генератора — из случайного шума генерировать реальное данные аналогичные образцы. генератор пытается «обмануть» дискриминатора, чтобы он не мог отличить сгенерированные данные от реальных. данные。
  • Дискриминатор (Д): Задача дискриминатора — отличить реальные данные и генератор сгенерировали поддельные данные. дискриминатор снижает вероятность обмана генератора за счет улучшения его распознавательной способности.

Процесс обучения GAN похож на игру: генератор пытается сделать дискриминатор неспособным различать настоящие и поддельные данные, а дискриминатор изо всех сил старается правильно отличать реальные данные от сгенерированных. Цель GAN — сделать сгенерированные генератором выборки всё ближе и ближе к реальному распределению выборок и в конечном итоге добиться того эффекта, при котором сгенерированные данные практически неотличимы от реальных данных.

2. Процесс обучения ГАН

1. Случайный шум выборки

Генератор GAN принимает на вход случайный шум, поэтому генерируемые данные каждый раз разные. Шум обычно отбирается из простого распределения, такого как стандартное нормальное распределение или равномерное распределение:

  • стандартное нормальное распределение Z∼N(0,1)Z \sim N(0, 1)Z∼N(0,1):Это общий выбор,Потому что его среднее значение равно 0,Дисперсия равна 1,Способен эффективно рассеивать случайные векторы,Убедитесь, что генератор имеет доступ к широкому спектру начальных условий.
  • равномерно распределенный Z∼U(−1,1)Z \sim U(-1, 1)Z∼U(−1,1): еще один распространенный выбор, особенно подходящий для задач, требующих относительно равномерного покрытия в сгенерированном пространстве.

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

Язык кода:javascript
копировать
noise = np.random.normal(0, 1, (batch_size, noise_dim))
2. Генератор генерирует образцы.

Генератор GGG представляет собой нейронную сеть, которая получает вектор шума zzz и посредством серии нелинейных преобразований генерирует выборки, аналогичные реальному распределению данных. Задача генератора — сгенерировать максимально реалистичные образцы, чтобы обмануть дискриминатор. Выходные данные генератора должны быть очень близки к реальным данным по форме, характеристикам и распределению.

генераторизвходитьимеет низкую размерностьизслучайный шум,И этовыходЭто многомерныйиз Генерировать данные (например, изображение или аудио). На ранних этапах обучения образцы генераторвыхода могут быть такими же, как реальные. данные сильно различаются, но по мере обучения генератор учится улавливать реальные функции данных и генерировать реалистичные поддельные образцы.

генераториз Основная цель –Максимизируйте частоту ошибок дискриминатора,То есть снижается способность дискриминатора различать истину и ложь за счет создания более реалистичных образцов.

Язык кода:javascript
копировать
generated_samples = generator.predict(noise)
3. Дискриминационное суждение

Задача дискриминатора DDD — классифицировать входные данные и определить, является ли это реальной выборкой или сгенерированной выборкой. Он принимает два типа ввода:

  • реальные данные xxx: Реальные образцы из набора обучающих данных.
  • Генерировать данные G(z)G(z)G(z): поддельный образец, созданный генератором.

Дискриминатор выводит значение вероятности D(x)D(x)D(x), которое представляет вероятность того, что выборка получена из реальных данных. В идеале дискриминатор может точно различать эти два типа выборок:

  • Для реальных образцов,дискриминаторизвыходблизко к1;
  • Для сгенерированной выборки выход дискриминатора близок к 0.

Функция потерь дискриминатора обычно использует двоичную кросс-энтропийную потерю, рассчитываемую отдельно для реальных данных и сгенерированных данных. Целью оптимизации дискриминатора является максимизация точности классификации, то есть правильная идентификация реальных выборок и правильное обнаружение поддельных выборок, генерируемых генератором.

Язык кода:javascript
копировать
real_loss = discriminator.train_on_batch(real_data, real_labels)
fake_loss = discriminator.train_on_batch(generated_samples, fake_labels)
4. Рассчитайте потери и обновите веса.

функция потерь генератора

Цель генератора — заставить дискриминатор думать, что сгенерированные им данные реальны, поэтому он выполняет обратное распространение ошибки, чтобы минимизировать Генератор. данныеизпотеря。функция потерь генератора Разработан какМаксимизируйте вероятность ошибки дискриминатора。поэтому,Потери генератора определяются как:

LG=−log⁡(D(G(z)))L_G = - \log(D(G(z)))LG​=−log(D(G(z)))

в D(G(z))D(G(z))D(G(z)) представляет прогнозируемое значение дискриминатора для поддельной выборки, сгенерированной генератором. генератор надеется, что дискриминатор поверит, что эти фейковые образцы настоящие,поэтомуоно пытаетсяминимизироватьэто значение。

Функция потерь дискриминатора

Задача дискриминатора — отличить реальные данные от сгенерированных, поэтому его функция потерь состоит из двух частей:

  1. дляреальные данные, дискриминатор надежды выход1, поэтому функция потерь равна: Lreal=−log⁡(D(x))L_{\text{real}} = - \log(D(x))Lreal​=−log(D(x))
  2. для Генерировать данных, дискриминатор надеется на выход 0, поэтому функция потерь равна: Lfake=−log⁡(1−D(G(z)))L_{\text{fake}} = - \log(1 - D(G(z)))Lfake​=−log(1−D(G(z)))

Конечная функция потерь дискриминатора представляет собой взвешенную сумму этих двух частей потерь:

LD=−(log⁡(D(x))+log⁡(1−D(G(z))))L_D = - \left( \log(D(x)) + \log(1 - D(G(z))) \right)LD​=−(log(D(x))+log(1−D(G(z))))

Процесс оптимизации

GANизтренироватьсяиспользоватьАлгоритм обратного распространениягенератор Масса обновлений и дискриминаторов. Процесс обучения обычно делится на два этапа:

  1. Обновить дискриминатор:Первое исправлениегенераторизмасса,Оптимизированы только параметры дискриминатора. дискриминатор, различающий настоящие и поддельные образцы,Постоянно совершенствуйте свою способность суждения.
  2. генератор обновлений:Затем исправьтедискриминаторизмасса,Оптимизированы только параметры генератора. Потеря генератора путем минимизациидискриминатора,Постоянно совершенствовать свою Генерировать данныеизкачество。

Процесс обучения GAN представляет собой процесс попеременного обновления, а генератор и дискриминатор постоянно совершенствуются посредством этого конфронтационного обучения. В идеале обучение продолжается до тех пор, пока данные, сгенерированные генератором, не станут неразличимы дискриминатором.

Язык кода:javascript
копировать
# Обновить дискриминатор
discriminator.trainable = True
d_loss_real = discriminator.train_on_batch(real_samples, real_labels)
d_loss_fake = discriminator.train_on_batch(generated_samples, fake_labels)

# генератор обновлений
discriminator.trainable = False
g_loss = gan.train_on_batch(noise, real_labels)
5. Конвергенция и проблемы обучения GAN

В ГАН спортивный процесссередина,Баланс между генератором и дискриминаторомэто ключевой вопрос。тренироватьсяиз Идеальный результат – этогенераторгенерироватьиз Образцы становятся более реалистичными,дискриминатор Не могу сказатьреальные данныеи Генерировать данные. Однако в ходе реального обучения часто встречаются следующие проблемы:

а. Свернуть режим

свернуть Режим — распространенная проблема при обучении GAN, что означает, что генератор начинает концентрироваться на генерации определенного типа данных, игнорируя при этом другие закономерности в распределении данных. Несмотря на то, что результат генератора выглядит аутентично, ему не хватает разнообразия, чтобы охватить реальные данныеизвесь дистрибутив。Чтобы решить эту проблему,Исследователи предложили множество способов улучшить,Если используетсяпакетная регуляризацияИли используйте большегенератор Архитектура。

б. Обучение нестабильно.

Обучение GAN очень чувствительно к настройкам параметров. Неправильная настройка скорости обучения, сложности модели и веса функции потерь генератора и дискриминатора может привести к нестабильному обучению или даже к сбою. Общие решения включают использование WGAN (Wasserstein GAN) для уменьшения нестабильности обучения и создание более сбалансированной конкуренции между генератором и дискриминатором за счет соответствующей настройки гиперпараметров.

в. Дисбаланс между дискриминатором и генератором.

Либо дискриминатор слишком силен, либо генератор слишком слаб, что приводит к сбою обучения. Если дискриминатор слишком мощный, он быстро отличит реальные данные от сгенерированных, оставляя генератору мало шансов на обучение. В это время баланс обучения можно улучшить, ограничив количество шагов обновления дискриминатора или скорректировав структуру модели.

6. Улучшения и варианты GAN

Благодаря широкому применению и углубленному исследованию GAN было предложено множество улучшенных версий, устраняющих его ограничения, такие как:

  • Wasserstein GAN(WGAN): За счет улучшения функции потерь обучение становится более стабильным, а проблема коллапса мод эффективно устраняется.
  • состояниеGAN(Условный GAN, cGAN): Добавляя дополнительную информацию о метках в генератор и дискриминатор, можно генерировать образцы определенных категорий.
  • CycleGAN: Используется для задач преобразования изображений в изображения, таких как преобразование стилей фотографий.

Эти варианты решают различные проблемы обучения GAN, еще больше расширяя возможности и эффекты GAN в практических приложениях.


3. Реализация кода GAN

Ниже приведен простой пример кода GAN с использованием платформы TensorFlow и Keras на Python, показывающий, как обучить GAN генерировать изображения рукописных цифр (на основе набора данных MNIST).

Язык кода:javascript
копировать
import tensorflow as tf
from tensorflow.keras import layers
import numpy as np

# Загрузка набора данных MNIST
(x_train, _), (_, _) = tf.keras.datasets.mnist.load_data()
x_train = (x_train.astype(np.float32) - 127.5) / 127.5
x_train = np.expand_dims(x_train,axis=-1)

# создаватьгенератор
def build_generator():
    model = tf.keras.Sequential()
    model.add(layers.Dense(256, input_dim=100))
    model.add(layers.LeakyReLU(alpha=0.2))
    model.add(layers.BatchNormalization(momentum=0.8))
    model.add(layers.Dense(512))
    model.add(layers.LeakyReLU(alpha=0.2))
    model.add(layers.BatchNormalization(momentum=0.8))
    model.add(layers.Dense(1024))
    model.add(layers.LeakyReLU(alpha=0.2))
    model.add(layers.BatchNormalization(momentum=0.8))
    model.add(layers.Dense(28 * 28 * 1, activation='tanh'))
    model.add(layers.Reshape((28, 28,1)))
    return model

# создаватьдискриминатор
def build_discriminator():
    model = tf.keras.Sequential()
    model.add(layers.Flatten(input_shape=(28, 28, 1)))
    model.add(layers.Dense(512))
    model.add(layers.LeakyReLU(alpha=0.2))
    model.add(layers.Dense(256))
    model.add(layers.LeakyReLU(alpha=0.2))
    model.add(layers.Dense(1, activation='sigmoid'))
    return model

# Определить модель GAN
def build_gan(generator, discriminator):
    discriminator.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
    discriminator.trainable = False
    gan_input = layers.Input(shape=(100,))
    generated_image = generator(gan_input)
    gan_output = discriminator(generated_image)
    gan = tf.keras.Model(gan_input, gan_output)
    gan.compile(loss='binary_crossentropy', optimizer='adam')
    return gan

generator = build_generator()
discriminator = build_discriminator()
gan = build_gan(generator, discriminator)

# Обучение ГАН
def train_gan(epochs,batch_size=128):
    for epoch in range(epochs):
        # тренироватьсядискриминатор        noise = np.random.normal(0, 1, (batch_size, 100))
        generated_images = generator.predict(noise)
        real_images = x_train[np.random.randint(0, x_train.shape[0], batch_size)]
        labels_real = np.ones((batch_size, 1))
        labels_fake = np.zeros((batch_size, 1))
        
        d_loss_real = discriminator.train_on_batch(real_images, labels_real)
        d_loss_fake = discriminator.train_on_batch(generated_images, labels_fake)
        d_loss = 0.5 * np.add(d_loss_real, d_loss_fake)

        # обучающий генератор
        noise = np.random.normal(0, 1, (batch_size, 100))
        labels = np.ones((batch_size, 1))
        g_loss = gan.train_on_batch(noise, labels)

        if epoch % 100 == 0:
            print(f"Epoch {epoch}, D loss: {d_loss[0]}, G loss: {g_loss}")

# Начать обучение
train_gan(epochs=10000)

4. Сценарии применения GAN.

  1. генерация изображения Одним из самых известных приложений GAN является генерация изображение. Например, GAN может генерировать реалистичные человеческие лица, природные сцены и т. д. и даже создавать новые художественные стили в области художественного творчества. Яркими примерами являются StyleGAN, который генерирует реалистичные изображения лиц с высоким разрешением.
  1. увеличение данных Когда данных недостаточно, GAN может генерировать новые образцы, чтобы увеличить разнообразие набора данных и улучшить способность модели к обобщению. Например, в области медицины GAN используется для создания медицинских изображений с конкретными характеристиками заболевания, тем самым улучшая производительность диагностических моделей.
  2. Реконструкция изображения сверхвысокого разрешения GAN Он широко используется в задачах сверхвысокого разрешения изображений и может преобразовывать изображения с низким разрешением в изображения с высоким разрешением. Это имеет важные применения в фотографии, наблюдении и обработке спутниковых изображений.
  3. Генерация и перевод текста Хотя GAN в основном используется в области изображений, он также используется в Генерации. и перевод текст. Благодаря улучшенной генеративно-состязательной структуре GAN может генерировать реалистичный текст на естественном языке и достигать впечатляющих результатов в задачах перевода.
  4. Создавайте видео и 3D-модели Расширяя временные и пространственные измерения, GAN могут генерировать не только статические изображения, но также непрерывное видео и 3D-модели. Это открывает больше творческих возможностей для виртуальной реальности, кинопроизводства и разработки игр.

5. Резюме

Генеративно-состязательные сети (GAN) открыли совершенно новую область машинного обучения и особенно хороши в создании высококачественных изображений, видео и других форм данных. Благодаря состязательному обучению двух нейронных сетей GAN способна генерировать поддельные данные, которые практически неотличимы от реальных данных. Несмотря на то, что в процессе обучения существуют проблемы, благодаря постоянным улучшениям, таким как WGAN, условный GAN и т. д., потенциал GAN был проверен во многих областях. Ожидается, что в будущем GAN будет играть более важную роль в более практических приложениях, от генерации изображений до творческих областей искусственного интеллекта, и принесет нам больше сюрпризов.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose