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

Это недавняя статья GANfather, Яна Гудфеллоу и нескольких других великих исследователей. Документ озаглавлен Сети противоборства, генерирующие самовнимание или для краткости SAGAN.

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

Эта проблема

Сверточные сети GAN (в будущем будем называть ее CGAN для краткости) испытывают трудности с изучением распределения изображений в различных мультиклассовых наборах данных, таких как Imagenet. Исследователи заметили, что эти CGAN испытывают трудности при моделировании одних классов изображений по сравнению с другими при обучении на мультиклассовых наборах данных. Они заметили, что CGAN могут легко генерировать изображения с более простой геометрией, такие как океан, небо и т. Д., Но не работают с изображениями с определенной геометрией, такими как собаки, лошади и многие другие. CGAN смог создать текстуру меха собаки, но не смог создать отдельные ноги.

Почему возникает эта проблема?

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

Вы спросите: нельзя ли увеличить пространственный размер, чтобы он захватил больше изображения? Да! Конечно, можем, но это снизит вычислительную эффективность, достигаемую меньшими фильтрами, и замедлит работу. Тогда вы снова спросите: нельзя ли сделать Deep CGAN с меньшими фильтрами, чтобы у более поздних слоев было большое принимающее поле? Да! мы можем, но для получения достаточно большого воспринимающего поля потребуется слишком много слоев, а слишком много слоев будет означать слишком много параметров. Следовательно, это сделало бы обучение GAN более нестабильным.

GAN с самовниманием

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

Что это за внимание?

Это одна из самых простых вещей для понимания. Предположим, есть 3 человека с именами query, key и value. Внимание - это когда запрос и ключ решают, насколько значение может говорить с внешним миром. В глубоком обучении все является вектором, поэтому на самом деле три человека были тремя векторами. Запрос и ключ умножаются таким образом, что они создают другой вектор вероятностей, который решает, какую часть значения предоставить следующему слою. И да, это то, что внимание в целом.

Давайте разберемся в этом с помощью диаграммы. Схема не требует пояснений. Q (запрос) и K (ключ) подвергаются матричному умножению, затем проходят через softmax, который преобразует результирующий вектор в распределение вероятностей, а затем, наконец, умножается на V (значение).

Тогда что это за самовнимание? При самовнимании запрос, ключ и значение одинаковы.

Модель

Если вы поняли приведенную выше часть, тогда понять, что это кусок пирога. Это слой самовнимания, предложенный в статье. Слева от изображения ниже мы получаем карты характеристик из предыдущего сверточного слоя. Предположим, он имеет размер (512 x 7 x 7), где 512 - количество каналов, а 7 - пространственное измерение. Сначала мы передаем карту функций через три свертки 1x1 по отдельности. Мы называем три фильтра f, g и, h.

Свертка 1x1 уменьшает количество каналов в изображении. Фактически фильтр 1 x 1 представляет собой измерение (# каналов в предыдущем слое x 1 x 1). Итак, f и g имеют 64 таких фильтра, поэтому размер фильтра становится (64 x 512 x 1 x 1). h содержит 512 таких фильтров. После прохождения изображения мы получаем три карты характеристик с размерами (64 x 7 x 7), (64 x 7 x 7) и (512 x 7 x 7). Угадайте, какие три вещи представляют собой наши пары запросов, ключей и значений. Чтобы сосредоточиться на полном изображении, мы сглаживаем последние два измерения, и размеры становятся (64 x 49), (64 x 49) и (512 x 49). Теперь мы можем провести над ним самовнимание. Мы транспонируем запрос и матрично умножаем его на ключ и берем softmax для всех строк. Итак, мы получаем выходную карту внимания формы (49 x 49). Затем мы матрично умножаем вектор значений на карту внимания, которая имеет форму (512 x 49). И последнее, что предлагается в статье, - это умножить конечный результат на обучаемый параметр масштаба и добавить обратно входные данные как остаточную связь. Допустим, x было изображением, а o - результатом, мы умножаем o на параметр y. Окончательный результат O становится следующим: O = y * o + x. Первоначально в документе рекомендуется инициализировать параметр масштаба как ноль, чтобы вначале на выходе была простая старая свертка. Они инициализировали y нулевым значением, потому что хотели, чтобы их сеть полагалась на сигналы в локальном окружении - поскольку это было проще, а затем постепенно сеть научится присваивать значение y параметр и используйте самовнимание.

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

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

Здесь z - это скрытый вектор, из которого будет создано изображение, а x и y - реальные изображения из данных. Потери генератора говорят о создании все более и более реалистичных изображений путем обмана дискриминатора, а дискриминатор, с другой стороны, пытается лучше классифицировать реальные и поддельные изображения.

Немного подробностей из бумаги

а) Они использовали этот слой самовнимания как в генераторе, так и в дискриминаторе.

б) Они применили спектральную нормализацию к весам как в генераторе, так и в дискриминаторе, в отличие от предыдущей статьи, которая нормализует только веса дискриминатора. Они устанавливают спектральную норму равной 1, чтобы ограничить константу Липшица весов. Он просто используется для управления градиентами. Идея спектральной нормализации была впервые предложена Miyato et. др.

c) Они использовали правило обновления двух шкал времени (TTUR), которое просто использует разную скорость обучения как для дискриминатора, так и для генератора.

d) В документе используются следующие показатели: начальный балл (IS, выше - лучше) и расстояние Фреше до начала (FID, чем ниже, тем лучше).

Полученные результаты

В документе с помощью экспериментов объясняется, как спектральная нормализация и TTUR помогли GAN лучше сойтись. Изображение того же показано ниже.

Мы можем видеть оценочные показатели IS и FID во всех трех случаях. Обучение очень нестабильно, когда спектральная норма находится только на весах дискриминатора. Даже когда мы применяем спектральную норму как к генератору, так и к дискриминатору, оценки отклоняются примерно на 200 000 итераций. Но с TTUR этого не происходит.

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

И, наконец, давайте посмотрим, что сгенерированы GAN самовниманием.

Большое спасибо за то, что дочитали до этого места. Если вам понравилась статья, пожалуйста, оставьте несколько аплодисментов. Я надеюсь, что вы сочтете это полезным. Пожалуйста, прочтите этот документ для получения более подробной информации и поверьте мне, это легко читать.

Это мой второй блог, поэтому, пожалуйста, простите меня за любые ошибки, которые я мог совершить. Я рад принять конструктивную критику за любую свою ошибку. Я буду писать больше, поэтому подписывайтесь или подписывайтесь на меня в твиттере. Ссылка на представленные мной слайды - здесь. Чтобы получить пояснения к аналогичным исследованиям, подпишитесь на канал Crazymuse AI на Youtube. Любые другие предложения не стесняйтесь обращаться ко мне в твиттере или по электронной почте.