Проект Heart of Machines GitHub: полное теоретическое обоснование и реализация GAN, отлично!

GitHub Нейронные сети JavaScript Perfect
Сердце машины Оригинал
Автор: Цзян Сиюань
Эта статья является вторым проектом реализации Heart of Machines на GitHub, последним проектом реализации GitHub было создание сверточной нейронной сети с нуля. В этой статье мы начнем с оригинальной статьи и завершим вывод, доказательство и реализацию оригинальной GAN с помощью выступления Гудфеллоу на NIPS 2016 и объяснения Ли Хунъи из Национального Тайваньского университета.
Эта статья в основном разделена на четыре части: в первой части описывается интуитивно понятная концепция GAN, во второй части описывается формальное выражение концепции и оптимизация, в третьей части проводится подробный теоретический вывод и анализ GAN, и, наконец, мы реализовать предыдущий теоретический анализ.
В этой статье основное внимание уделяется теории и деривации. Дополнительные концепции и приложения генеративно-состязательных сетей см. по адресу:

Основные понятия генеративно-состязательной сети

Чтобы понять генеративно-состязательные модели (GAN), сначала необходимо понять, что генеративно-состязательные модели можно разделить на два модуля: один — дискриминационная модель, а другой — генеративная модель. Проще говоря: двое играют, смотрим, мощно ли копье у А или силен щит Б. Например, у нас есть некоторые реальные данные, а также куча случайно сгенерированных поддельных данных. А отчаянно имитирует поддельные данные, которые он взял под руку, в реальные данные и смешивает их с реальными данными. B отчаянно пытается отличить настоящие данные от поддельных.
Здесь А — это генеративная модель, похожая на фальшивую валюту, которая пытается научиться обманывать Б. А Б — дискриминационная модель, похожая на инспекционную полицию, которая учится распознавать мошеннические навыки А.
Таким образом, по мере того, как навыки идентификации В становятся все более и более мощными, навыки А в области фальшивомонетничества становятся все более и более совершенными, и нам нужен первоклассный производитель фальшивых денег. Хотя идея, лежащая в основе GAN, очень интуитивно понятна и проста, нам нужно более внимательно взглянуть на доказательства и выводы, лежащие в основе теории.
В целом, GAN, предложенная Гудфеллоу и др., представляет собой новую основу для оценки генеративных моделей посредством состязательного процесса. В этой структуре нам необходимо одновременно обучать две модели, а именно генеративную модель G, которая фиксирует распределение данных, и дискриминативную модель D, которая оценивает вероятность того, что данные получены из реальных выборок. Процесс обучения генератора G заключается в том, чтобы максимизировать вероятность ошибок дискриминатора, то есть дискриминатор ошибочно думает, что данные представляют собой реальную выборку, а не фальшивую выборку, сгенерированную генератором. Таким образом, эта схема соответствует минимаксной игре с двумя игроками. Среди всех возможных функций G и D мы можем найти единственное равновесное решение, то есть G может генерировать то же распределение, что и обучающие выборки, а вероятность решения D везде равна 1/2. Вывод и доказательство этого процесса будут быть позже Текст объясняет подробно.
Структура состязательного моделирования может применяться наиболее непосредственно, когда все модели представляют собой многослойные персептроны. Чтобы узнать распределение P_g генератора по данным x, мы сначала определяем априорную входную шумовую переменную P_z(z), а затем отображаем ее в пространство данных в соответствии с G(z; θ_g), где G является многократным. Восприятие слоя Дифференцируемая функция, представленная машиной. Нам также необходимо определить второй многослойный персептрон D(s;θ_d), выход которого является одним скаляром. D(x) представляет собой вероятность того, что x получен из реальных данных, а не из P_g. Мы обучаем D, чтобы максимизировать вероятность правильного назначения реальных выборок и сгенерированных выборок, поэтому мы можем одновременно обучать G, минимизируя log(1-D(G(z))). Другими словами, дискриминатор D и генератор выполняют минимаксную игру с функцией ценности V(G,D):

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



Как показано на рисунке выше, генеративно-состязательная сеть будет обучать и обновлять дискриминантное распределение (т. е. D, синяя пунктирная линия).После обновления дискриминатора реальное распределение данных (линия, состоящая из черных точек) может быть изменено. из сгенерированного распределения P_g(G) (зеленая сплошная линия). Нижняя горизонтальная линия представляет область выборки Z, где эквидистантные линии представляют равномерное распределение выборок в Z, а верхняя горизонтальная линия представляет долю истинных данных X. Стрелка вверх показывает, как отображение x=G(z) налагает неравномерное распределение P_g на выборки шума (равномерно отобранные). (a) Рассмотрим состязательное обучение вокруг точки сходимости: P_g и P_data уже очень похожи, а D является локально точным классификатором. (b) Обучить D отличать истинные выборки от данных во внутреннем цикле алгоритма, который в конечном итоге сходится к D(x)=p_data(x)/(p_data(x)+p_g(x)). (c) Затем дискриминатор фиксируется, и после обновления G генератор обучается, градиент D направляет G (z) в направлении, которое с большей вероятностью будет классифицировано D как реальные данные. (d) После нескольких тренировок, если G и D имеют достаточную сложность, они достигнут точки равновесия. В это время p_g=p_data, то есть функция плотности вероятности генератора равна функции плотности вероятности реальных данных, то есть сгенерированные данные такие же, как и реальные данные. Ни D, ни G не могут быть дополнительно улучшены в точке равновесия, и дискриминатор не может сказать, являются ли данные реальными образцами или поддельными данными, т. Е. D (x) = 1/2.
Основные концепции генеративно-состязательных сетей кратко представлены выше, а в следующем разделе эти концепции будут формализованы и описан общий процесс оптимизации.

Формализация понятий и процессов

Теоретический идеальный генератор
Цель алгоритма состоит в том, чтобы генератор генерировал выборки, которые почти неотличимы от реальных данных, то есть поддельный первоклассный A, что нам и нужно для генеративной модели. Математически случайные величины генерируются в определенное распределение вероятностей, и можно также сказать, что функции плотности вероятности равны: P_G(x)=P_data(x). Это именно та стратегия, которая позволяет математически доказать эффективность генераторов: то есть определить задачу оптимизации, в которой оптимальный генератор G удовлетворяет условию P_G(x)=P_data(x). Если мы знаем, что решенная G в конечном итоге будет удовлетворять этому соотношению, то мы можем разумно ожидать, что нейронная сеть получит оптимальное G при типичном обучении SGD.
задача оптимизации
Как мы узнали о деле полиции и фальшивомонетчика в начале, метод определения задачи оптимизации может состоять из следующих двух частей. Сначала нам нужно определить дискриминатор D, чтобы определить, взята ли выборка из распределения P_data(x), поэтому есть:



где E относится к ожиданию замещения. Этот термин построен на основе логарифмической функции потерь, которая является «положительной» (т. Е. Признает, что x принадлежит реальным данным). Максимизация этого члена эквивалентна тому, что дискриминатор D точно предсказывает D (x) = 1, когда x подчиняется плотности вероятности данных, то есть:



Другой — это генератор G, который пытается обмануть дискриминатор. Этот член строится из логарифмической функции потерь «отрицательного класса», а именно:



Поскольку логарифм x



Учитывая генератор G, это означает, что дискриминатор D правильно идентифицировал реальные и ложные точки данных. Для генератора G оптимальный дискриминатор, полученный из приведенной выше формулы, может быть выражен как
(представлен D_G* ниже). Определите функцию значения как:


Тогда мы можем сформулировать задачу оптимизации как:


Теперь цель G поменялась на противоположную. Когда D=D_G*, оптимальное G состоит в том, чтобы минимизировать предыдущее уравнение. В статье авторы предпочитают решать G и D функции оптимального значения для решения минимаксной игры:

Для D попытайтесь максимизировать формулу (сильная способность к распознаванию), а для G постарайтесь минимизировать ее (сгенерированные данные близки к фактическим данным). Все обучение представляет собой повторяющийся процесс. На самом деле минимаксную игру можно понимать отдельно, то есть при заданном G сначала максимизировать V(D,G) и взять D, затем зафиксировать D и минимизировать V(D,G), чтобы получить G. где при данном G максимизация V(D,G) оценивает разницу или расстояние между P_G и P_data.
Наконец, мы можем сформулировать задачу оптимизации следующим образом:
Формальное выражение концепции GAN и процесса оптимизации приведено выше. С помощью этих выражений мы можем понять основной процесс и метод оптимизации всей генеративно-состязательной сети. Конечно, с этими концепциями мы можем напрямую найти фрагмент кода GAN на GitHub с небольшой модификацией и хорошо его запустить. Но если мы хотим более тщательно понять GAN и более полно понять код реализации, нам все равно нужно много знать о процессе деривации. Например, когда D может заставить функцию значений V(D,G) принимать максимальное значение, G может заставить V(D,G) принимать минимальное значение, и какую нейронную сеть (или функцию) должны использовать D и G , их потеря Что нужно использовать функции и так далее. Короче говоря, есть еще много теоретических деталей и процессов вывода, которые требуют дальнейшего изучения.
теоретический вывод
В исходной статье GAN мерой различия или расстояния между сгенерированным распределением и истинным распределением была дивергенция JS, которую мы построили с использованием дивергенции KL в процессе обучения деривации. Таким образом, эта часть начнется с теоретической основы и далее выведет условия, которым должны соответствовать оптимальные дискриминатор и генератор, и, наконец, мы будем использовать результаты вывода для математического переформулирования процесса обучения. Эта часть предоставляет сильную теоретическую поддержку для нашего понимания конкретной реализации в следующей части.
KL-расхождение
В теории информации мы можем использовать энтропию Шеннона для количественной оценки общего количества неопределенности во всем распределении вероятностей:
Если у нас есть два отдельных распределения вероятностей P(x) и Q(x) для одной и той же случайной величины x, мы можем использовать расхождение KL (расхождение Кульбака-Лейблера) для измерения разницы между двумя распределениями:
В случае дискретных переменных расхождение KL измеряется, когда мы отправляем сообщение, содержащее символы, созданные распределением вероятностей P, с использованием кодирования, предназначенного для минимизации длины сообщения, созданного распределением вероятностей Q. Количество требуемой дополнительной информации.
Дивергенция KL обладает многими полезными свойствами, наиболее важным из которых является то, что она неотрицательна. Дивергенция KL равна 0 тогда и только тогда, когда P и Q являются одним и тем же распределением в случае дискретных переменных или «почти везде» в случае непрерывных переменных. Поскольку дивергенция KL неотрицательна и измеряет разницу между двумя распределениями, ее часто используют как своего рода расстояние между распределениями. Однако на самом деле это не расстояние, поскольку оно несимметрично: для некоторых P и Q D_KL(P||Q) не равно D_KL(Q||P). Эта асимметрия означает, что выбор D_KL(P||Q) или D_KL(Q||P) оказывает большое влияние.
В объяснении Ли Хунъи расхождение KL может быть получено из оценки максимального правдоподобия. Учитывая распределение выборочных данных P_data(x) и сгенерированное распределение данных P_G(x; θ), GAN надеется найти набор параметров θ, чтобы сделать расстояние между распределением P_g(x; θ) и P_data(x) Самый короткий, то есть найти такой набор параметров генератора, чтобы генератор мог генерировать очень реалистичную картинку.
Теперь мы можем нарисовать набор реальных изображений из обучающего набора, чтобы обучить параметр θ в распределении P_G(x; θ) для аппроксимации реального распределения. Поэтому теперь нарисуйте m реальных отсчетов {x^1,x^2,…,x^?} из P_data(x), где символ «^» означает верхний индекс, т. е. i-й отсчет по x. Для каждой истинной выборки мы можем вычислить P_G (x ^ i; θ), вероятность появления выборки x ^ i в порождающем распределении, определяемом θ. Таким образом, мы можем построить функцию правдоподобия:



Среди них «∏» представляет кумулятивное умножение, а P_G(x^i;θ) представляет вероятность появления i-го образца в сгенерированном распределении. Из этой функции правдоподобия мы видим, что значение вероятности всех m реальных выборок, извлеченных нами из распределения P_G(x;θ), может быть выражено как L. И поскольку, если распределение P_G(x;θ) похоже на распределение P_data(x), то реальные данные, скорее всего, появятся в распределении P_G(x;θ), поэтому все m выборок появятся в P_G(x; θ) распределение Вероятность будет очень высока.
Затем мы можем максимизировать функцию правдоподобия L, чтобы найти порождающее распределение, ближайшее к истинному распределению (т. е. оптимальный параметр θ):


В приведенном выше выводе мы хотим максимизировать функцию правдоподобия L. Если логарифмировать функцию правдоподобия, то накопление ∏ можно преобразовать в накопление ∑, и этот процесс не меняет результат оптимизации. Таким образом, мы можем уменьшить оценку максимального правдоподобия как θ, что максимизирует математическое ожидание log[P_G(x;θ)], а математическое ожидание E[logP_G(x;θ)] можно представить в интегральной форме по x: ∫ P_data( х)logP_G(x;θ)dx. А поскольку процесс оптимизации предназначен для θ, мы можем добавить -∫P_data(x)logP_data(x)dx, добавив интеграл без θ, который не повлияет на эффект оптимизации. После добавления этого интеграла мы можем объединить два интеграла и построить форму, подобную дивергенции KL. Процесс выглядит следующим образом:



Этот интеграл является интегральной формой дивергенции KL, поэтому, если нам нужно сделать сгенерированное распределение P_G(x; θ) как можно более близким к параметру θ истинного распределения P_data(x), то нам нужно только запросить наименьший параметр дивергенции KL тета. Если будет получен оптимальный параметр θ, изображение, сгенерированное генератором, будет выглядеть очень реалистично.
Проблемы вывода
Далее мы должны доказать, что задача оптимизации имеет единственное решение G*, и это единственное решение удовлетворяет условию P_G=P_data. Однако, прежде чем мы приступим к выводу оптимального дискриминатора и оптимального генератора, нам необходимо понять точку зрения Скотта Роума на вывод исходной статьи, который считает, что исходная статья игнорирует обратимое условие, поэтому вывод оптимального решения не является идеально.
В исходной статье GAN есть идея, отличная от многих других методов, то есть генератору G не нужно удовлетворять условию обратимости. Скотт Роум считает, что это важно, потому что на практике G необратима. И многие примечания к доказательствам игнорируют этот момент, ошибочно используя формулу интегральной замены в доказательстве, а интегральная замена как раз основана на обратимом условии G. Скотт считает, что доказательства могут быть основаны только на справедливости следующих уравнений:


Это уравнение выводится из теоремы Радона-Никодима в теории меры, представленной в предложении 1 оригинальной статьи, и выражается в виде следующего уравнения:


Мы видим, что в раздаточном материале используется формула интегрального обмена, но для интегрального обмена необходимо вычислить G^(-1), а обратное значение G не предполагается. И в практике нейронных сетей его тоже нет. Возможно, этот метод настолько распространен в литературе по машинному обучению и статистике, что мы его игнорируем.
оптимальный дискриминатор
На первом шаге минимаксной игры по генератору G максимизируйте V(D,G), чтобы получить оптимальный дискриминатор D. где максимизация V(D,G) оценивает разницу или расстояние между P_G и P_data. Потому что в оригинальной статье функция ценности может быть записана как интеграл по x, что расширяет математическое ожидание до интегральной формы:


Фактически, нахождение максимального значения интеграла можно преобразовать в нахождение максимального значения подынтегральной функции. Целью нахождения максимального значения подынтегральной функции является нахождение оптимального дискриминатора D, поэтому члены, не включающие дискриминатор, можно рассматривать как постоянные члены. Как показано ниже, и P_data(x), и P_G(x) являются скалярами, поэтому подынтегральная функция может быть выражена как a*D(x)+b*log(1-D(x)).


Если дискриминатор D(x) равен y, то подынтегральная функция может быть записана как:


Чтобы найти оптимальную крайнюю точку, если a + b ≠ 0, мы можем использовать следующую производную для решения:


Если продолжить нахождение второй производной выражения f(y) в стационарной точке:


где а,b∈(0,1). Поскольку первая производная равна нулю, а вторая производная меньше нуля, мы знаем, что a/(a+b) является максимальным. Если a=P_data(x) и b=P_G(x) подставлены в экстремальное значение, то оптимальный дискриминатор D(x)=P_data(x)/(P_data(x)+P_G(x)).
Наконец, мы можем записать выражение функции значения как:


Если мы сделаем D(x)=P_data/(P_data+P_G), то сможем максимизировать функцию значения V(G,D). Поскольку f(y) имеет единственный максимум в области, оптимальное D также уникально, и никакое другое D не может достичь максимума.
На самом деле этот оптимальный D практически не вычислим, но он очень важен с математической точки зрения. Мы не знаем предыдущие P_data(x), поэтому никогда не используем их во время обучения. С другой стороны, его существование позволяет нам доказать, что оптимальное G существует, и нам нужно только аппроксимировать D во время обучения.
оптимальный генератор
Конечно, цель процесса GAN — сделать P_G=P_data. Что это означает для оптимального D? Мы можем подставить это уравнение в выражение для D_G*:


Это означает, что дискриминатор полностью запутался, он вообще не может определить разницу между P_data и P_G, то есть вероятность судить о том, что выборка исходит как из P_data, так и из P_G, равна 1/2. Опираясь на эту точку зрения, авторы ГАН доказали, что G является решением минимаксной игры. Теорема такова:
«Тогда и только тогда, когда P_G = P_data, может быть достигнут глобальный минимум критерия обучения C (G) = maxV (G, D)».
Вышеупомянутая теорема является вторым шагом минимаксной игры, чтобы найти генератор G, который минимизирует V (G, D *) (где G * представляет оптимальный дискриминатор). Причина, по которой функция значения может быть минимизирована, когда P_G(x)=P_data(x), заключается в том, что JS-расхождение двух распределений [JSD(P_data(x) || P_G(x))] равно нулю в это время. , этот процесс Подробное объяснение заключается в следующем.
Эта теорема в оригинальной статье является утверждением «тогда и только тогда», поэтому нам нужно доказать ее в двух направлениях. Сначала мы аппроксимируем и доказываем значение C(G) из обратного, а затем используем новое знание, полученное из обратного, для доказательства его из прямого. Пусть P_G=P_data (обратное относится к знанию оптимальных условий заранее и выполнению вывода), мы можем сделать обратный вывод:



Это значение является кандидатом на глобальный минимум, поскольку оно возникает только тогда, когда P_G=P_data. Теперь нам нужно доказать из положительного, что это значение часто является минимальным значением, то есть условия «если» и «только если» выполняются одновременно. Теперь откажитесь от предположения, что P_G=P_data, для любого G мы можем заменить оптимальный дискриминатор D*, полученный на предыдущем шаге, на C(G)=maxV(G,D):


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

Основная цель использования этой техники - построить форму с расхождением log2 и JS.После упрощения приведенной выше формулы можно получить следующее выражение:
Из-за определения плотности вероятности интегралы P_G и P_data по их интегральным областям равны 1, то есть:
Кроме того, по определению логарифмов имеем:

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


Теперь, если читатель прочитает приведенное выше расхождение Кульбака-Лейблера, то мы увидим, что каждый интеграл является именно им. Конкретно:


Дивергенция KL неотрицательна, поэтому сразу видно, что -log4 является глобальным минимумом C(G).
Если мы дополнительно докажем, что только один G может достичь этого значения, поскольку P_G=P_data будет единственной точкой, где C(G)=-log4, все доказательство может быть завершено.
Из вышеизложенного видно, что расхождение KL асимметрично, поэтому левый и правый два элемента KL(P_data || (P_data+P_G)/2) в C(G) нельзя поменять местами, но если добавить еще один элемент KL(P_G | | (P_data+P_G)/2), их сумма может стать симметричным членом. Сумма этих двух расхождений KL может быть выражена как расхождение JS (расхождение Дженсона-Шеннона):

Если предположить, что имеются два распределения P и Q, а среднее распределение этих двух распределений M=(P+Q)/2, то расхождение JS между двумя распределениями равно расхождению KL между P и M плюс расхождение KL между Q а М делится на два.
Дивергенция JS принимает значения от 0 до log2. Если два распределения вообще не пересекаются, то расхождение JS принимает максимальное значение log2; если два распределения абсолютно одинаковы, то расхождение JS принимает минимальное значение 0.
Таким образом, C(G) можно переписать в соответствии с определением дивергенции JS как:

Это расхождение на самом деле является квадратом метрики расстояния Дженсона-Шеннона. По своим свойствам: когда P_G=P_data, JSD(P_data||P_G) равен 0. Подводя итог, мы можем получить оптимальный генератор тогда и только тогда, когда генеративное распределение равно реальному распределению данных.
конвергенция
Теперь основная часть статьи доказана: P_G=P_data является оптимальной точкой maxV(G,D). Кроме того, в исходной статье есть дополнительное доказательство того, что при наличии достаточного количества данных для обучения и правильной среды процесс обучения будет сходиться к оптимальному G, который мы подробно не обсуждаем.
Подведем итоги тренировочного процесса
Ниже приведен последний шаг вывода, мы повторим весь процесс оптимизации параметров и кратко опишем различные процессы, связанные с фактическим обучением.
1. Процесс оптимизации параметров
Если нам нужно найти оптимальный генератор, то при наличии дискриминатора D мы можем рассматривать maxV(G,D) как функцию потерь L(G) для обучения генератора. Теперь, когда функция потерь установлена, мы можем использовать алгоритмы оптимизации, такие как SGD и Adam, для обновления параметров генератора G. Процесс оптимизации параметров градиентного спуска выглядит следующим образом:

Среди них нахождение частной производной L(G) по θ_G включает в себя нахождение частной производной max{V(G,D)}, Этот способ дифференцирования функции max существует и доступен.
Теперь, учитывая начальное G_0, нам нужно найти D_0*, которое максимизирует V(G_0,D), поэтому процесс обновления дискриминатора также можно рассматривать как процесс обучения с функцией потерь -V(G,D). И из предыдущего вывода V (G, D) на самом деле всего лишь постоянный член от расхождения JS между распределениями P_data (x) и P_G (x). Следовательно, такой циклический процесс противоборства может быть выражен как:
  • Учитывая G_0, максимизируйте V(G_0,D), чтобы найти D_0*, что равно max[JSD(P_data(x)||P_G0(x)];
  • Зафиксируйте D_0*, вычислите θ_G1 ← θ_G0 −η(dV(G,D_0*)/dθ_G), чтобы получить обновленный G_1;
  • Исправьте G_1 и максимизируйте V(G_1,D_0*), чтобы получить D_1*, что равно max[JSD(P_data(x)||P_G1(x)];
  • Зафиксируйте D_1*, вычислите θ_G2 ← θ_G1 −η(dV(G,D_0*)/dθ_G), чтобы получить обновленный G_2;
  • . . .
2. Собственно тренировочный процесс
В соответствии с предыдущим определением функции ценности V(G,D) нам нужно найти два математических ожидания, а именно E[log(D(x))] и E[log(1-D(G(z))) ], где x соответствует реальному распределению данных, а z соответствует распределению инициализации. Но на практике у нас нет возможности использовать интеграцию для нахождения этих двух математических ожиданий, поэтому обычно мы можем выбирать из бесконечных реальных данных и бесконечных генераторов для аппроксимации реальных математических ожиданий.
Если теперь задан генератор G и вы хотите вычислить maxV(G,D), чтобы найти дискриминатор D, то нам сначала нужно выбрать m выборок из P_data(x) {x^1,x^2,...,x ^ m}, выборка m выборок из генератора P_G(x)
. Таким образом, функция максимального значения V(G,D) может быть аппроксимирована следующим выражением:


Если нам нужно вычислить описанный выше процесс максимизации, можно использовать эквивалентную форму метода обучения. Если у нас есть бинарный классификатор D (параметр θ_d), который, конечно, может быть глубокой нейронной сетью, то результатом процесса максимизации является классификатор D(x). Теперь мы берем выборки из P_data(x) как положительные выборки, из P_G(x) как отрицательные выборки и функцию, аппроксимирующую отрицательную V(G,D) как функцию потерь, поэтому мы выражаем ее как стандарт. бинарный классификатор:
На практике мы должны реализовать минимаксный игровой процесс с использованием итерационных и численных методов. Полная оптимизация D во внутреннем цикле обучения вычислительно недопустима, а ограниченные наборы данных также могут привести к переобучению. Таким образом, мы можем чередовать k шагов для оптимизации D и один шаг для оптимизации G. Тогда нам нужно только медленно обновлять G, а D всегда будет рядом с оптимальным решением, эта стратегия аналогична способу обучения SML/PCD.
Подводя итог, мы можем описать весь процесс обучения для каждой итерации:
  • Нарисуйте m выборок из истинного распределения данных P_data
  • нарисовать m выборок шума из предыдущего распределения P_prior(z)
  • Генерируйте данные, бросая зашумленные сэмплы в G
, параметр дискриминатора θ_d обновляется путем максимизации аппроксимации V, т. е. максимизации
, а формула итерации обновления параметров дискриминатора

Выше описан процесс обучения дискриминатора D. Поскольку процесс обучения D — это процесс вычисления расхождения JS, и мы хотим максимизировать функцию ценности, этот шаг повторяется k раз.
  • нарисовать еще m выборок шума {z ^ 1,..., z ^ m} из предыдущего распределения P_prior (z)
  • Параметр генератора θ_g обновляется путем минимизации V^тильды, т.е. максимизации
, а итерация обновления параметров генератора


Выше описан процесс изучения параметров генератора.Этот процесс будет выполняться только один раз за итерацию, поэтому вы можете избежать слишком большого количества обновлений и увеличить расхождение JS.
выполнить
В последнем выпуске проекта Heart of the Machine GitHub мыРеализовал простую CNN с нуля, используя TensorFlow., мы не только знакомим с базовыми операциями TensorFlow, но и просто реализуем LeNet-5, начиная с полносвязных нейронных сетей. В первой реализации GitHub мы загрузили один за другим три куска кода реализации, вторая загрузка была дополнена полносвязной сетью для распознавания изображений MNIST, мы аннотировали весь код модели построчно. Третья загрузка была дополнена построением простой CNN с помощью Keras, а также добавлено множество аннотаций. Эта статья является вторым этапом реализации GitHub. Сначала мы предоставляем код реализации GAN и аннотации. Затем мы объединим приведенный выше теоретический анализ и код реализации и отобразим их в Jupyter Notebook. Хотя в первой реализации используется относительно простой высокоуровневый API (Keras), позже мы добавим код и аннотации для построения GAN с использованием TensorFlow.
Heart of the Machine впервые реализовала эту генеративную состязательную сеть, используя Keras с бэкендом TensorFlow, и мы обучили модель набору данных MNIST и создали серию рукописных шрифтов. В этой главе лишь кратко объясняется часть кода реализации. Более полные и подробные комментарии можно найти по адресу проекта на GitHub.
генеративная модель
Во-первых, нам нужно определить генератор G, который должен преобразовывать входной случайный шум в изображение. Ниже приведена определенная генеративная модель, которая начинается с вектора из 100 элементов, случайным образом сгенерированного из распределения. Затем используйте два полносвязных слоя, чтобы расширить входной вектор до 1024 измерений и 128*7*7 измерений, а затем начните изменять форму одномерного тензора, сгенерированного полносвязным слоем, в двумерный тензор, то есть серый в MNIST.График степени. Мы заметили, что в модели используется функция активации tanh, поэтому мы также попытались преобразовать ее в функцию relu, но обнаружили, что если бы генеративная модель была преобразована в функцию relu, ее вывод был бы серым.
Данные, передаваемые полным соединением, будут проходить через несколько слоев повышения дискретизации и слоев свертки.Мы замечаем, что ядро ​​свертки, используемое в последнем слое свертки, равно 1, поэтому изображение, сгенерированное последним слоем свертки, представляет собой двумерную шкалу серого. см. проект Heart of the Machine GitHub для более подробного анализа.
соединение
Предыдущее определение — это модель G(z;θ_g), которая может генерировать изображения, и когда мы обучаем генеративную модель, нам нужно исправить дискриминантную модель D, чтобы минимизировать функцию ценности и искать лучшую генеративную модель, что означает, что нам нужно Генеративная модель сшивается вместе с дискриминационной моделью, а веса D фиксируются для обучения весов G. Процесс описан ниже: сначала мы добавляем генеративную модель, определенную ранее, затем соединяем определенную дискриминативную модель с генеративной моделью и устанавливаем дискриминативную модель как необучаемую. Следовательно, обучение этой комбинированной модели может фактически обновить параметры генеративной модели.
дискриминантная модель
Дискриминантная модель является относительно традиционной моделью распознавания изображений, мы можем использовать несколько сверточных слоев и слоев максимального пула по классическому методу, а затем развернуть ее в одномерный тензор и использовать в качестве архитектуры несколько полносвязных слоев. Мы попытались изменить функцию активации tanh на функцию активации relu, и в первые две эпохи существенных изменений практически не было.
тренироваться
Учебная часть довольно длинная и заслуживает подробного обсуждения. В целом следующий тренировочный процесс можно кратко описать так:
  • Загрузить данные MNIST
  • Разделите данные на обучающие и тестовые наборы и назначьте их переменным.
  • Установите гиперпараметры для обучения модели
  • Скомпилируйте процесс обучения модели
  • На каждой итерации сгенерированное изображение и реальное изображение извлекаются и маркируются.
  • Затем данные вводятся в дискриминативную модель, обучаются и рассчитываются потери.
  • Исправьте дискриминативную модель, обучите генеративную модель, рассчитайте потери и завершите эту итерацию.
Вышеизложенное является кратким введением в процесс обучения ниже, и мы объединим приведенный выше теоретический вывод, чтобы показать более подробный анализ в GitHub.
контрольная работа
На практике мы получаем следующие хорошие результаты генерации после обучения на 30 эпох:
Конечно, мы также обнаружили много проблем с обучением посередине, таких как скорость обучения, размер партии, функция активации и т. д. Скорость обучения обычно устанавливается от 0,001 до 0,0005, и есть много других скоростей обучения, которые не тестировались. Размер пакета, который мы используем, относительно мал, например, 16, 32, 64 и т. д. Меньший размер пакета может не требовать столько эпох для обучения. Мы обнаружили, что если функция активации генеративной модели изменена на relu, сгенерированное изображение, вероятно, будет выделено серым цветом, а потери при обучении генеративной модели и дискриминационной модели могут быть выражены как:
Вышеупомянутое — это то, что происходит после 2000 итераций: потери дискриминационной модели уменьшаются, а потери генеративной модели увеличиваются. При нормальных обстоятельствах я обнаружил, что потери генеративной модели и потери дискриминантной модели будут попеременно возрастать и падать в определенном диапазоне, а потери при обучении после 2000 итераций составляют:
Кроме того, мы также обнаружили много проблемных шаблонов генерации, таких как следующие результаты генерации, которые имеют тенденцию быть больше 0 и 1:

Наконец, прикрепите флажок, что мы закончили тренировку.



использованная литература:
  • Оригинальная статья о генеративно-состязательных сетях: https://arxiv.org/pdf/1406.2661.pdf
  • Учебное пособие Goodfellow NIPS 2016: https://arxiv.org/abs/1701.00160
  • Ли Хунъи MLDS17: http://speech.ee.ntu.edu.tw/~tlkagk/courses_MLDS17.html
  • Скотт Роум. Вывод GAN: http://srome.github.io//An-Annotated-Proof-of-Generative-Adversarial-Networks-with-Implementation-Notes/
Эта статья является оригинальной в основе машины, пожалуйста, свяжитесь с этой общедоступной учетной записью для разрешения на перепечатку.