Изучение передовой генеративной искусственной интеллекта | Условные VAE

Изучение условных VAE - передовой генеративной искусственной интеллекта

Введение

Добро пожаловать в эту статью, где мы погрузимся в увлекательный мир Генеративного искусственного интеллекта. Мы сосредоточимся в основном на условных вариационных автоэнкодерах или CVAE, которые являются следующим уровнем искусства искусственного интеллекта, объединяющими преимущества вариационных автоэнкодеров (VAE) с возможностью следовать конкретным инструкциям, давая нам точный контроль над созданием изображений. В течение этой статьи мы углубимся в CVAE и увидим, как и почему они могут использоваться в различных реальных сценариях, а также предоставим вам некоторые простые примеры кода для демонстрации их потенциала.

Источник: IBM

Эта статья была опубликована в рамках Data Science Blogathon.

Понимание вариационных автоэнкодеров (VAE)

Прежде чем погрузиться в CVAE, давайте сосредоточимся на основах VAE. VAE – это тип генеративных моделей, объединяющих сеть энкодера и декодера. Они используются для изучения скрытой структуры данных и генерации новых образцов.

Давайте рассмотрим простой пример, связанный с предпочтениями кофе, чтобы объяснить вариационные автоэнкодеры (VAE)

Представьте, что вы хотите представить предпочтения кофе каждого человека в вашем офисе:

  • Энкодер: Каждый человек суммирует свой выбор кофе (черный, латте, капучино) несколькими словами (например, крепкий, сливочный, нежный).
  • Вариация: Понимает, что даже в пределах одного и того же выбора (например, латте) есть вариации в молоке, сладости и т. д.
  • Латентное пространство: Создает гибкое пространство, в котором могут варьироваться предпочтения кофе.
  • Декодер: Использует эти суммы, чтобы делать кофе для коллег с небольшими вариациями, учитывая их предпочтения.
  • Генеративная мощность: Может создавать новые стили кофе, соответствующие индивидуальным вкусам, но не являющиеся их точными копиями.

VAE работает аналогично, изучая основные особенности и вариации данных для генерации новых, похожих данных с небольшими отличиями.

Вот простая реализация вариационного автоэнкодера (VAE) с использованием Python и TensorFlow/Keras. В этом примере используется набор данных MNIST для простоты, но вы можете адаптировать его для других типов данных.

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import numpy as np

# Загрузка и предобработка набора данных MNIST
(x_train, _), (x_test, _) = keras.datasets.mnist.load_data()
x_train = x_train.astype('float32') / 255.0
x_test = x_test.astype('float32') / 255.0

# Определение модели VAE
latent_dim = 2

# Энкодер
encoder_inputs = keras.Input(shape=(28, 28))
x = layers.Flatten()(encoder_inputs)
x = layers.Dense(256, activation='relu')(x)
z_mean = layers.Dense(latent_dim)(x)
z_log_var = layers.Dense(latent_dim)(x)

# Часть с репараметризацией
def sampling(args):
    z_mean, z_log_var = args
    epsilon = tf.keras.backend.random_normal(shape=(tf.shape(z_mean)[0], latent_dim))
    return z_mean + tf.exp(0.5 * z_log_var) * epsilon

z = layers.Lambda(sampling)([z_mean, z_log_var])

# Декодер
decoder_inputs = keras.Input(shape=(latent_dim,))
x = layers.Dense(256, activation='relu')(decoder_inputs)
x = layers.Dense(28 * 28, activation='sigmoid')(x)
decoder_outputs = layers.Reshape((28, 28))(x)

# Определение модели VAE
encoder = keras.Model(encoder_inputs, [z_mean, z_log_var, z], name='encoder')
decoder = keras.Model(decoder_inputs, decoder_outputs, name='decoder')
vae_outputs = decoder(encoder(encoder_inputs)[2])
vae = keras.Model(encoder_inputs, vae_outputs, name='vae')

# Функция потерь
def vae_loss(x, x_decoded_mean, z_log_var, z_mean):
    x = tf.keras.backend.flatten(x)
    x_decoded_mean = tf.keras.backend.flatten(x_decoded_mean)
    xent_loss = keras.losses.binary_crossentropy(x, x_decoded_mean)
    kl_loss = -0.5 * tf.reduce_mean(1 + z_log_var - tf.square(z_mean) - tf.exp(z_log_var))
    return xent_loss + kl_loss

vae.compile(optimizer='adam', loss=vae_loss)
vae.fit(x_train, x_train, epochs=10, batch_size=32, validation_data=(x_test, x_test))

Объяснение условных вариационных автоэнкодеров (CVAE)

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

Давайте разберемся на примере реального времени.

Онлайн-шопинг с использованием CVAE. Представьте, что вы покупаете кроссовки онлайн:

  • Базовый VAE (без условий): Веб-сайт показывает вам случайные кроссовки.
  • CVAE (с условиями): Вы выбираете свои предпочтения – цвет (красный), размер (10) и стиль (беговые).
  • Энкодер: Веб-сайт понимает ваши выборы и фильтрует кроссовки на основе этих условий.
  • Вариация: Признавая, что даже ваших условий существуют вариации (разные оттенки красного, стили беговых кроссовок), он учитывает их.
  • Латентное пространство: Он создает “пространство настройки кроссовок”, где разрешены вариации.
  • Декодер: Используя ваши индивидуальные условия, он показывает вам кроссовки, которые наиболее близко соответствуют вашим предпочтениям.

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

Продолжая с примером вариационного автоэнкодера (VAE), вы можете реализовать условный вариационный автоэнкодер (CVAE). В этом примере мы рассмотрим набор данных MNIST и будем генерировать цифры условно на основе метки класса.

# Определите модель CVAE
encoder = keras.Model([encoder_inputs, label], [z_mean, z_log_var, z], name='encoder')
decoder = keras.Model([decoder_inputs, label], decoder_outputs, name='decoder')
cvae_outputs = decoder([encoder([encoder_inputs, label])[2], label])
cvae = keras.Model([encoder_inputs, label], cvae_outputs, name='cvae')
Источник: ResearchGate

Разница между VAE и CVAE

VAE

  • VAE – это похожие на художников, которые создают произведения искусства с небольшой случайностью.
  • Они учатся создавать разнообразные вариации данных без каких-либо конкретных инструкций.
  • Полезно для генерации новых образцов данных без условий, например, случайного искусства.

CVAE

  • CVAE – это похожие на художников, которые могут следовать конкретным запросам.
  • Они генерируют данные на основе заданных условий или инструкций.
  • Полезно для задач, где требуется точный контроль над генерируемым контентом, например, превращение лошади в зебру с сохранением основных особенностей.

Реализация CVAE: Примеры кода

Давайте рассмотрим простой пример кода на Python, используя TensorFlow и Keras, для реализации CVAE для генерации рукописных цифр.

# Импорт необходимых библиотек
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.models import Model

# Определение архитектуры модели CVAE
latent_dim = 2
input_shape = (28, 28, 1)
num_classes = 10

# Сеть энкодера
encoder_inputs = keras.Input(shape=input_shape)
x = layers.Conv2D(32, 3, padding='same', activation='relu')(encoder_inputs)
x = layers.Flatten()(x)
x = layers.Dense(64, activation='relu')(x)

# Условный вход
label = keras.Input(shape=(num_classes,))
x = layers.concatenate([x, label])

# Вариационные слои
z_mean = layers.Dense(latent_dim)(x)
z_log_var = layers.Dense(latent_dim)(x)

# Техника репараметризации
def sampling(args):
    z_mean, z_log_var = args
    epsilon = tf.keras.backend.random_normal(shape=(tf.shape(z_mean)[0], latent_dim))
    return z_mean + tf.exp(0.5 * z_log_var) * epsilon

z = layers.Lambda(sampling)([z_mean, z_log_var])

# Сеть декодера
decoder_inputs = layers.Input(shape=(latent_dim,))
x = layers.concatenate([decoder_inputs, label])
x = layers.Dense(64, activation='relu')(x)
x = layers.Dense(28 * 28 * 1, activation='sigmoid')(x)
x = layers.Reshape((28, 28, 1))(x)

# Создание моделей
encoder = Model([encoder_inputs, label], [z_mean, z_log_var, z], name='encoder')
decoder = Model([decoder_inputs, label], x, name='decoder')
cvae = Model([encoder_inputs, label], decoder([z, label]), name='cvae')
#import csv

Этот код предоставляет базовую структуру для модели CVAE. Для обучения и генерации изображений вам понадобится соответствующий набор данных и дальнейшая настройка.

Применения CVAE

CVAE имеют применение в различных областях, включая:

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

#импорт csv# Перевод изображения лошади в изображение зебры
translated_image = cvae_generate(horse_image, target="zebra")

Перенос стиля: CVAE позволяют переносить художественные стили между изображениями. Предположим, у вас есть фотография, и вы хотите, чтобы она выглядела как знаменитая картина, скажем, “Звездная ночь” Ван Гога. CVAE может применить этот стиль:

#импорт csv
# Применить стиль "Звездная ночь" к вашей фотографии
styled_image = cvae_apply_style(your_photo, style="Starry Night")
  • Обнаружение аномалий: Они эффективны в обнаружении аномалий в данных. У вас есть набор данных с нормальными сердечными ритмами, и вы хотите обнаружить неправильные сердечные ритмы. CVAE может обнаружить аномалии:
# Обнаружение неправильных сердечных ритмов
is_anomaly = cvae_detect_anomaly(heartbeat_data)
  • Поиск лекарств: CVAE помогают генерировать молекулярные структуры для поиска лекарств. Допустим, вам нужно найти новые молекулы для спасительного препарата. CVAE может помочь в разработке молекулярных структур:
#импорт csv# Генерация потенциальных молекул-лекарств
drug_molecule = cvae_generate_molecule("антираковый")

Эти применения показывают, как CVAE могут преобразовывать изображения, применять художественные стили, обнаруживать аномалии и помогать в таких важных задачах, как поиск лекарств, при этом сохраняя основные данные значимыми и полезными.

Трудности и направления развития

Трудности

  • Обрушение режима: Представьте себе CVAE как художника, который иногда забывает использовать все цвета. Обрушение режима происходит, когда CVAE продолжает использовать одни и те же цвета (представления) для разных вещей. Таким образом, они могут рисовать всех животных одним цветом, потеряв разнообразие.
  • Генерация изображений высокого разрешения: Представьте, что вы просите художника нарисовать детальную, большую фреску на маленьком холсте. Это вызывает трудности. CVAE сталкиваются с аналогичной проблемой, пытаясь создать высокодетализированные большие изображения.

Будущие цели

Исследователи хотят сделать CVAE лучше:

  • Избежать обрушения режима: Они работают над тем, чтобы убедиться, что художник (CVAE) использует все цвета (представления), создавая более разнообразные и точные результаты.
  • Искусство высокого разрешения: Они стремятся помочь художнику (CVAE) рисовать большие и более детальные фрески (изображения) путем улучшения используемых техник. Таким образом, мы можем получить впечатляющие произведения искусства высокого качества от CVAE.

Заключение

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

Основные выводы

  1. Развитие генеративного искусственного интеллекта: Обеспечение генерации изображений с условными входными данными.
  2. Простая аналогия с кофе: Представьте VAE как сводку предпочтений кофе, позволяющую вариации при сохранении сути.
  3. Базовый код VAE: Предоставлен пример кода на Python для начинающих, использующий набор данных MNIST.
  4. Реализация CVAE: В статье приведен фрагмент кода для реализации CVAE для генерации изображений с условиями.
  5. Пример онлайн-шопинга: Аналогия онлайн-покупки кроссовок иллюстрирует способность CVAE настраивать данные на основе условий.

Часто задаваемые вопросы

Медиа, показанная в этой статье, не принадлежит Analytics Vidhya и используется по усмотрению автора.