Что такое генеративно-состязательные сети (GAN)

Рассмотренные на предыдущих занятиях вариационные автоэнкодеры способны формировать компактное скрытое пространство и генерировать на его основе выходной сигнал, в частности, изображения цифр. И для решения этой задачи мы задавали два критерия: дивергенция Кульбака-Лейблера (для формирования желаемой формы ПРВ точек скрытого пространства) и квадрат рассогласования между входным и выходным изображениями VAE. Именно этот второй критерий «заставлял» декодер восстанавливать сигнал близкий к входному:

Однако, изображения на выходе получались смазанными. Почему так происходит? Дело в том, что любая НС в процессе обучения старается уловить, сформировать закономерности между входными и выходными данными так, чтобы минимизировать заданный критерий. Теперь представьте, что у нас есть множество похожих пятерок и декодер для них должен сформировать адекватный ответ:

Именно такая сглаженная пятерка будет удовлетворять минимуму среднего квадрата ошибки рассогласования между всеми этими входами. Но, в данном случае, результат не совсем такой, какой бы мы хотели. Было бы куда лучше иметь нормальное, четкое изображение цифры, пусть даже с бОльшим значением показателя MSE. Визуально это воспринималось бы естественнее. Тогда, может быть, взять какой-то другой критерий для формирования четких цифр? К сожалению, таких чисто математических формул не существует. Все они будут, так или иначе, приводить к усреднению или выделению какого-то одного наблюдения. Как же тогда решить эту задачу?

В 2014-м году Ян Гудфеллоу (Ian Goodfellow) предложил новую концепцию, известную сейчас под названием:

генеративно-состязательные сети (Generative Adversarial Networks)

Ключевая идея заключается в формировании критерия качества для генератора с помощью еще одной НС:

И здесь возникает вопрос: как выбрать показатель качества для генерации реалистичных изображений? Ян Гудфеллоу предложил оригинальное решение. Давайте подавать на вход второй НС и сгенерированные и реальные изображения, а она должна будет отличать первых от вторых. Такая сеть получила название дискриминатор:

То есть, на вход дискриминатора сначала можно подать реальное изображение, получить значение на выходе (назовем его real), а потом подать сгенерированное и определить второе значение (fake). Как видим, дискриминатор на выходе выдает всего одно число:

  • real – для реальных изображений;
  • fake – для сгенерированных.

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

Так как мы делаем различия между двумя классами (реальное, не реальное), то в качестве показателя качества целесообразно взять бинарную кросс-энтропию:

где  - желаемые отклики сети. Упрощая и суммируя эти потери, получаем:

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

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

Значит, в режиме обучения генератора в бинарной кросс-энтропии требуемый отклик . Получаем критерий качества:

То есть, здесь получается, что дискриминатор и генератор конкурируют друг с другом и обучаются так, чтобы дискриминатор понимал входы от генератора, а генератор, наоборот, пытается «замаскировать» свою деятельность под реальные изображения. В результате такой конкуренции дискриминатор все лучше и лучше различает реальные и фейковые изображения, а генератор все точнее и точнее создает реалистичные изображения. В идеале генератор должен формировать изображения неотличимые от реальных и дискриминатор уже не сможет их различать. Это пример того, как взаимная конкуренция приводит к развитию обеих нейронных сетей. Отсюда и пошло название «генеративно-состязательные».

Я думаю идея, предложенная Яном Гудфеллоу, в целом, понятна. Мы берем наборы реальных изображений близких к тем, что должен выдавать генератор. Затем, подаем на вход дискриминатора случайно выбранное одно реальное изображение, вычисляем значение real. Затем, подаем сгенерированное, вычисляем значение fake. И в соответствии с функцией потерь loss_dis (дискриминатора) обучаем его алгоритмом обратного распространения ошибки. На следующем шаге подаем на вход дискриминатора сгенерированное изображение и по значению fake выполняем обучение уже генератора. Так, поочередно, обучая то одну, то другую сеть, мы их улучшаем в соответствии с нашими критериями.

Возможно, у вас остался один важный вопрос: что подавать на вход генератора? По идее, можно взять вариационный автоэнкодер из предыдущих занятий и выполнять его обучение, чтобы он генерировал реалистичные изображения, а не смазанные. Схема этой сети будет выглядеть так:

Кому интересно, реализацию этой схемы можно посмотреть по этой ссылки на gihub:

ССЫЛКА НА ГИХАБ lesson 32. VAE+GAN.py

А мы, в рамках следующего занятия, реализуем другую идею: от вариационного автоэнкодера оставим только декодер (назовем его генератор) и на его вход будем подавать просто случайные величины, распределенные по нормальному закону с нулевым МО и единичной дисперсией:

Сделаем это с помощью пакета Keras и Tensorflow 2.0. Но об этом уже на следующем занятии. Здесь же, в заключение отмечу, что генеративно-состязательные сети используются для самых разных задач, где требуется генерировать реалистичные изображения. Например, повышение разрешения:

(взято из: Ledig, C., Theis, L., Huszar, F., Caballero, J., Aitken, A. P., Tejani, A., Totz, J., Wang, Z., and Shi, W. (2016). Photo-realistic single image super-resolution using a generative adversarial network.)

Формирование изображений по схеме и, наоборот, построение схемы карты по изображению:

(взято из: Isola, P., Zhu, J.-Y., Zhou, T., and Efros, A. A. (2016). Image-to-image translation with conditional adversarial networks.)

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

(взято из: Radford, A., Metz, L., and Chintala, S. (2015). Unsupervised representation learning with deep convolutional generative adversarial networks.)

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

Видео по теме