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