Генеративные состязательные сети (GAN)

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

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

Его приложения интригуют, и он позволяет нам решать множество реальных проблем. Давайте сначала рассмотрим некоторые из его приложений:

  • Создание лиц, поразительно похожих на настоящие человеческие лица.
  • Преобразование изображения в изображение - при наличии изображения краев сеть может генерировать цветное изображение объекта или, учитывая изображение в ночных условиях, оно может преобразовать его в дневные условия, что имеет огромное значение при автономном вождении.

  • Inpainting - при наличии искаженного изображения он может сгенерировать полное изображение, которое отлично подходит для постобработки видео, восстановления поврежденного видео и редактирования видео.

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

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

Ниже приведен код архитектуры генератора. Он принимает случайный ввод фиксированного размера (random_size), а затем генерирует сплющенное изображение (1D-массив размера высота * ширина), чтобы визуализировать изображение из вывода, нам нужно будет изменить форму вектора вывода на соответствующий (высота, ширина) . Здесь я использовал полностью связанные слои для архитектуры генератора.

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

Ниже приведен код архитектуры дискриминатора. Он принимает сплющенное изображение (форма - ›высота * ширина) в качестве входных данных, а затем классифицирует входные данные как настоящие или поддельные. Здесь я использовал полностью связанные слои.

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

Генератор только для обучения

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

  • Первоначально он будет производить некоторый случайный результат (обозначается G (z)) из-за случайной инициализации весов нейронной сети. Когда он проходит через дискриминатор, он определенно классифицируется дискриминатором как подделка.

  • Наконец, когда мы обучили модель генератора, мы хотим, чтобы выходные данные были очень похожи на набор обучающих данных, то есть наш дискриминатор должен классифицировать выходные данные генератора (G (z)) как реальные.

Чтобы обучить генератор, мы вычисляем потери, используя выходной сигнал дискриминатора, принимая метку для G (z) как реальные данные, т.е. мы заставляем генератор производить выходные данные, которые дискриминатор может классифицировать. как реально. Таким образом дискриминатор помогает генератору. Для лучшего понимания взгляните на формулу потерь ниже:

В идеале для реального изображения вывод дискриминатора равен 0, а для поддельного изображения - 1. Чтобы минимизировать вышеуказанные потери, вывод D (G (z)) должно быть близко к 0, т. Е. Мы обучаем генератор, так что его выход классифицируется дискриминатором как действительный.

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

Дискриминатор только для обучения

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

Приведенная выше формула потерь заставляет дискриминатор классифицировать реальный выход как 1, а фальшивый / сгенерированный выход как 0.

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

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

Полное обучение

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

На этом мы закончим знакомство с GAN. Я надеюсь, что этот блог даст вам хорошее представление о работе GAN. Полную реализацию можно найти в следующем репозитории GitHub.



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