Генеративно-Состязательные Сети

В последняя статья мы рассмотрели простейшую линейную генеративную модель PPCA. Вторая генеративная модель, которую мы рассмотрим, — это генеративно-состязательные сети, или сокращенно GAN. В этой статье мы рассмотрим самую базовую версию этой модели, оставив расширенные версии и сравнения с другими подходами генеративного моделирования для последующих глав.



Генеративно-состязательные сети



История

Генеративное моделирование включает в себя аппроксимацию невычислимых апостериорных распределений.

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

Предыдущие методы решения этой проблемы сложны в вычислительном отношении и в основном основаны на использовании Марковская цепь Монте-Карло , который плохо масштабируется.

Поэтому для обучения генеративных моделей необходим метод, основанный на масштабируемых методах, таких как Стохастический градиентный спуск (SGD) И обратное распространение ошибки .

Одним из таких методов является генеративно-состязательная сеть (GAN).

GAN были впервые предложены в этом статья в 2014 году.

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

Для этого генератор генерирует случайные объекты, а дискриминатор пытается отличить эти сгенерированные объекты от реальных объектов из обучающей выборки.

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

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



Модель

Для начала введем необходимую терминологию.

Через

Генеративно-состязательные сети

будем обозначать определенное пространство объектов.

Например, картинки

Генеративно-состязательные сети

пиксель.

В некотором вероятностном пространстве

Генеративно-состязательные сети

задана векторная случайная величина

Генеративно-состязательные сети

с распределением вероятностей, имеющим плотность

Генеративно-состязательные сети

такое, что подмножество пространства

Генеративно-состязательные сети

, на которой

Генеративно-состязательные сети

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

Нам дан случайный i.i.d. подбор фотографий лиц по размеру

Генеративно-состязательные сети

.

Дополнительно определим вспомогательное пространство

Генеративно-состязательные сети

и случайная величина

Генеративно-состязательные сети

с распределением вероятностей, имеющим плотность

Генеративно-состязательные сети

.



Генеративно-состязательные сети

— функция дискриминатора.

Эта функция принимает объект в качестве входных данных

Генеративно-состязательные сети

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



Генеративно-состязательные сети

— функция генератора.

Она принимает смысл

Генеративно-состязательные сети

и производит космический объект

Генеративно-состязательные сети

, то есть в нашем случае картинка.

Предположим, что у нас уже есть идеальный дискриминатор.



Генеративно-состязательные сети

.

Для любого примера

Генеративно-состязательные сети

он дает истинную вероятность того, что этот пример принадлежит данному подмножеству

Генеративно-состязательные сети

, из которого была получена выборка

Генеративно-состязательные сети

.

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

Таким образом, оптимальный генератор находится как

Генеративно-состязательные сети

.

Потому что

Генеративно-состязательные сети

является монотонно возрастающей функцией и не меняет положения экстремумов аргумента, перепишем эту формулу в виде

Генеративно-состязательные сети

, что будет удобно в будущем.

В действительности идеального дискриминатора обычно не существует, и его необходимо найти.

Поскольку задачей дискриминатора является подача сигнала для обучения генератора, то вместо идеального дискриминатора достаточно взять дискриминатор, идеально отделяющий реальные примеры от сгенерированных текущим генератором, т.е.

идеальный только на подмножестве

Генеративно-состязательные сети

из которых примеры генерируются текущим генератором.

Эту задачу можно переформулировать как поиск такой функции

Генеративно-состязательные сети

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

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

У каждого примера есть метка: он реальный или сгенерированный.

В первая статья описано решение задачи классификации с использованием метода максимального правдоподобия.

Запишем это для нашего случая.

Итак, наш образец

Генеративно-состязательные сети

.

Определим плотность распределения

Генеративно-состязательные сети

, Затем

Генеративно-состязательные сети

это переформулировка дискриминатора

Генеративно-состязательные сети

, что дает вероятность класса

Генеративно-состязательные сети

(реальный пример) как распределение по классам

Генеративно-состязательные сети

.

Потому что

Генеративно-состязательные сети

, это определение определяет правильную плотность вероятности.

Тогда оптимальный дискриминатор можно найти как:

Генеративно-состязательные сети

Сгруппируем факторы,

Генеративно-состязательные сети

И

Генеративно-состязательные сети

:

Генеративно-состязательные сети



Генеративно-состязательные сети



Генеративно-состязательные сети

И поскольку размер выборки стремится к бесконечности, мы получаем:

Генеративно-состязательные сети

Итого получаем следующий итерационный процесс:

  1. Установите произвольный инициал

    Генеративно-состязательные сети

    .

  2. Начинается

    Генеративно-состязательные сети

    -я итерация,

    Генеративно-состязательные сети

    .

  3. Ищем оптимальный дискриминатор для генератора тока:

    Генеративно-состязательные сети

    .

  4. Улучшим генератор, используя оптимальный дискриминатор:

    Генеративно-состязательные сети

    .

    Важно находиться рядом с генератором тока.

    Если отойти далеко от генератора тока, дискриминатор перестанет быть оптимальным и алгоритм перестанет быть корректным.

  5. Задача обучения генератора считается решенной, если

    Генеративно-состязательные сети

    для всех

    Генеративно-состязательные сети

    .

    Если процесс не сходится, то переходим к следующей итерации в пункте (2).

В оригинальной статье этот алгоритм сведен в одну формулу, которая в каком-то смысле определяет минимаксную игру между дискриминатором и генератором:

Генеративно-состязательные сети

Обе функции

Генеративно-состязательные сети

можно представить в виде нейронных сетей:

Генеративно-состязательные сети

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

Генеративно-состязательные сети

может аппроксимировать произвольное распределение вероятностей, что устраняет проблему выбора распределения

Генеративно-состязательные сети

.

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

Например,

Генеративно-состязательные сети

или

Генеративно-состязательные сети

.

Корректность этого алгоритма и сходимость

Генеративно-состязательные сети

К

Генеративно-состязательные сети

при достаточно общих предположениях это было доказано в оригинальной статье.



Нахождение параметров нормального распределения

С математикой мы разобрались, давайте теперь посмотрим, как она работает. Скажем так

Генеративно-состязательные сети

, т. е.

решаем одномерную задачу.



Генеративно-состязательные сети

.

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

Генеративно-состязательные сети

, Где

Генеративно-состязательные сети

.

Дискриминатором будет полносвязная трехслойная нейронная сеть с бинарным классификатором на конце.

Решение этой проблемы

Генеративно-состязательные сети

, то есть,

Генеративно-состязательные сети

.

Давайте теперь попробуем запрограммировать численное решение этой проблемы с помощью Tensorflow. Полный код можно найти здесь , в статье освещены лишь ключевые моменты.

Первое, что нужно установить, это входной образец:

Генеративно-состязательные сети

.

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

Кроме того, выборка параметризуется по среднему значению и стандартному отклонению.

  
  
  
  
  
  
  
  
  
  
  
   

def data_batch(hparams): """ Input data are just samples from N(mean, stddev).

""" return tf.random_normal( [hparams.batch_size, 1], hparams.input_mean, hparams.input_stddev)

Теперь давайте установим случайные входные данные для генератора.



Генеративно-состязательные сети

:

def generator_input(hparams): """ Generator input data are just samples from N(0, 1).

""" return tf.random_normal([hparams.batch_size, 1], 0., 1.)

Давайте определим генератор.

Возьмем абсолютное значение второго параметра, чтобы придать ему значение стандартного отклонения:

def generator(input, hparams): mean = tf.Variable(tf.constant(0.)) stddev = tf.sqrt(tf.Variable(tf.constant(1.)) ** 2) return input * stddev + mean

Создадим вектор реальных примеров:

generator_input = generator_input(hparams) generated = generator(generator_input)

И вектор сгенерированных примеров:

generator_input = generator_input(hparams) generated = generator(generator_input)

Теперь давайте прогоним все примеры через дискриминатор.

Здесь важно помнить, что нам нужны не два разных дискриминатора, а один, поэтому нужно попросить Tensorflow использовать одни и те же параметры для обоих входов:

with tf.variable_scope("discriminator"): real_ratings = discriminator(real_input, hparams) with tf.variable_scope("discriminator", reuse=True): generated_ratings = discriminator(generated, hparams)

Функция потерь в реальных примерах представляет собой перекрестную энтропию между единицей (ожидаемый ответ дискриминатора в реальных примерах) и оценками дискриминатора:

loss_real = tf.reduce_mean( tf.nn.sigmoid_cross_entropy_with_logits( labels=tf.ones_like(real_ratings), logits=real_ratings))

Функция потерь на поддельных примерах — это перекрестная энтропия между нулем (ожидаемый ответ дискриминатора на поддельных примерах) и оценками дискриминатора:

loss_generated = tf.reduce_mean( tf.nn.sigmoid_cross_entropy_with_logits( labels=tf.zeros_like(generated_ratings), logits=generated_ratings))

Функция потерь дискриминатора представляет собой сумму потерь на реальных примерах и на поддельных примерах:

discriminator_loss = loss_generated + loss_real

Функция потерь генератора — это перекрестная энтропия между единицей (желаемая реакция дискриминатора на поддельные примеры) и оценками дискриминатора этих поддельных примеров:

generator_loss = tf.reduce_mean( tf.nn.sigmoid_cross_entropy_with_logits( labels=tf.ones_like(generated_ratings), logits=generated_ratings))

К функции потерь дискриминатора дополнительно добавляется регуляризация L2. Обучение модели сводится к поочередному обучению дискриминатора и генератора в цикле до сходимости:

for step in range(args.max_steps): session.run(model.discriminator_train) session.run(model.generator_train)

Ниже приведены графики для четырех моделей дискриминаторов:

  • трехслойная нейронная сеть.

  • трехслойная нейронная сеть с L2-регуляризацией.

  • трехслойная нейронная сеть с регуляризацией отсева.

  • трехслойная нейронная сеть с L2 и регуляризацией отсева.



Генеративно-состязательные сети

Рис.

1. Вероятность того, что дискриминатор классифицирует реальный пример как реальный.



Генеративно-состязательные сети

Рис.

2. Вероятность того, что дискриминатор классифицирует сгенерированный пример как реальный.

Все четыре модели быстро сходятся к тому, что выдает дискриминатор.



Генеративно-состязательные сети

у всех входов.

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

Генеративно-состязательные сети

Рис.

3. Среднее сгенерированных распределений.



Генеративно-состязательные сети

Рис.

4. Стандартное отклонение сгенерированных распределений.

Ниже приведены распределения реальных и сгенерированных в процессе обучения примеров.

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



Генеративно-состязательные сети

Рис.

5. Распространение реальных данных.

Не меняется со временем.

Шаг обучения отложен на вертикальной оси.



Генеративно-состязательные сети



Генеративно-состязательные сети



Генеративно-состязательные сети



Генеративно-состязательные сети

Рис.

6. Распространение реальных данных.

Не меняется со временем.

Шаг обучения отложен на вертикальной оси.

Давайте посмотрим на процесс обучения модели:

Генеративно-состязательные сети

Рис.

7. Визуализация процесса обучения модели.

Стационарная гауссиана — это плотность распределения реальных данных, скользящая гауссиана — это плотность распределения сгенерированных примеров, синяя кривая — результат работы дискриминатора, т.е.

вероятность того, что пример реальный.

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

В конце концов, генератор настолько хорошо аппроксимирует данные, что дискриминатор становится константой.



Генеративно-состязательные сети

и проблема сходится.



Аппроксимация смеси нормальных распределений I

Давайте попробуем заменить

Генеративно-состязательные сети

на

Генеративно-состязательные сети

, тем самым моделируя мультимодальное распределение исходных данных.

Для этой модели вам нужно только изменить код для генерации реальных примеров.

Вместо возврата нормально распределенной случайной величины мы возвращаем смесь нескольких:

def data_batch(hparams): count = len(hparams.input_mean) componens = [] for i in range(count): componens.append( tf.contrib.distributions.Normal( loc=hparams.input_mean[i], scale=hparams.input_stddev[i])) return tf.contrib.distributions.Mixture( cat=tf.contrib.distributions.Categorical( probs=[1./count] * count), components=componens) .

sample(sample_shape=[hparams.batch_size, 1])

Ниже приведены графики для тех же моделей, что и в последнем эксперименте, но для данных с двумя режимами:

Генеративно-состязательные сети

Рис.

8. Вероятность того, что дискриминатор классифицирует реальный пример как повторный.

Теги: #Машинное обучение #теория вероятностей #python #нейронные сети #TensorFlow #программирование #программирование #Алгоритмы #математика #Машинное обучение

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.