Целью этого блога является базовое руководство по генеративным состязательным сетям (GAN), предложенное Яном Гудфеллоу из OpenAI. В первой части дается краткое введение в основы GAN и практическое приложение, называемое Deep конституционально-генеративно-состязательная Nerworks (DCGAN). Вторая часть представляет собой реализацию DCGAN на Python в базе данных с маленькими буквами: notMNIST. Исходный код этого руководства можно найти на Github.

Часть 1. Предпосылки и методологии
Генеративная модель - это тип модели, который может создавать новые данные, аналогичные тем, которые мы им вводим. Эти модели вызывают большой интерес в последние годы. В 2014 году Иэн Гудфеллоу опубликовал статью, знакомящую мир с потрясающей генеративной моделью: генеративными состязательными сетями, или сокращенно GAN. Новшество, лежащее в основе этой модели, заключается в том, что у нас есть две сети глубокого обучения: генеративная сеть и дискриминирующая сеть, борющиеся друг с другом, и после того, как две сети достигнут точки равновесия (равновесия Нэша), мы можем получить зрелую генеративную модель.

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

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

В докладе NIPS, сделанном Яном Гудфеллоу, он представил математический способ описания этого как игры минимакс, определяемой как:

J (D) - значение потерь дискриминатора, а J (G) - функция потерь дискриминатора. Поскольку это игра с нулевой суммой, сумма двух функций должна быть равна нулю. Равновесие - это седловая точка потери дискриминатора. Генератор минимизирует логарифмическую вероятность правильности дискриминатора.

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

Поскольку у нас есть две сети глубокого обучения, связанные вместе, очень сложно использовать обратное распространение для получения градиентов. Deep Convolutional GAN ​​(DCGAN) - одна из моделей, демонстрирующих, как построить практическую GAN, способную самостоятельно научиться синтезировать новые изображения.

Часть 2: Приложение для создания писем
В этом руководстве мы реализуем DCGAN на основе Keras на бэкэнде Tensorflow. Набор данных, который мы используем, - это база данных notMNIST. Из-за ограниченности вычислительной мощности мы выбрали небольшой набор, который содержит 18 000 изображений и 10 классов с буквами A – J, взятыми из разных шрифтов. Сначала мы используем пакет Skimage для загрузки изображения в виде матрицы numpy и преобразования размера в (28,28,1), что аналогично измерению данных MNIST.

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

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

Сначала мы создаем нашу CNN для генератора:

Генератор генерирует синтез поддельных изображений, которые в основном представляют собой сеть обратной свертки. Он принимает 100 случайных входных данных и в конечном итоге отображает их в пиксель [28,28,1], чтобы соответствовать форме данных notMNIST. Начните с создания плотного набора значений 7x7, затем прогоните несколько слоев свертки с различными размерами и количеством каналов и, в конечном итоге, обучитесь с помощью оптимизатора Adam для двоичной кросс-энтропии. Мы используем активацию tanh на выходном слое, чтобы отображать пиксели между -1 и 1, и используем расширенную активацию LeakyReLU в скрытых слоях, чтобы ускорить обучение.

Во-вторых, наш Дезриминатор:

Мы строим дискриминаторную сеть, которая принимает [28,28,1] векторов изображений и решает, являются ли они настоящими или фальшивыми, используя несколько сверточных слоев, плотный слой, множество отсевов и одноэлементное кодирование выходного сигмоидного слоя: [0, ›0,5] = фальшивка, а [0,5‹, 0] = настоящая. Это относительно простая сеть, но для того, чтобы состязательная сеть работала хорошо, мы предпочитаем меньше параметров, чем генератор, что означает, что наш генератор немного сложнее, чем наш дискриминатор.

Теперь мы соединили обе части, чтобы создать нашу Состязательную сеть:

Состязательная сеть - это просто собранный вместе генератор-дискриминатор. Часть генератора пытается обмануть Дискриминатор и одновременно учиться на его обратной связи.

Процесс обучения:

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

Вот некоторые результаты непосредственных результатов и результатов 1750-х годов:

Мы видим сначала 250 эпох, генератор может создавать только шум. с уменьшением значения потерь наш генератор начинает учиться по обратной связи дискриминатора, и, наконец, мы можем сказать некоторые очертания букв «B», «E» и «F» в 1750 эпохах. При ограниченных вычислениях мы не можем перейти к большим значениям эпох (каждая эпоха занимает 20 секунд). Ниже приведены еще несколько примеров результатов, полученных нашей сетью.

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

Ссылки

Рэдфорд, Алек, Люк Мец и Сумит Чинтала. «Неконтролируемое репрезентативное обучение с глубокими сверточными порождающими состязательными сетями». Препринт arXiv arXiv: 1511.06434 (2015).

Гудфеллоу, Ян и др. «Генеративные состязательные сети». Достижения в области нейронных систем обработки информации. 2014 г.