С тех пор как Ян Гудфеллоу впервые предложил идею GAN (https://arxiv.org/abs/1406.2661), она стала модным словом в сообществе машинного обучения просто потому, что работает потрясающе хорошо (учитывая, что вы придумали идеальный архитектура). Многие люди, особенно Ян ЛеКун, которого считают одним из гигантов глубокого обучения, в какой-то момент заявили, что GAN - это значительный прорыв в глубоком обучении.

Я заметил одну вещь: многие люди, утверждающие, что знакомы с GAN, не имеют теоретической основы, лежащей в основе этого, что очень важно.

ПРЕДУПРЕЖДЕНИЕ ЧИТАТЕЛЯ: Этот пост не для абсолютных новичков. Я предполагаю, что у вас есть базовое понимание того, что на самом деле делают GAN с практической точки зрения, поскольку я не буду их здесь обсуждать. Я буду использовать такие термины, как Дискриминатор и Генератор, без особых пояснений, предполагая, что вы это уже знаете. Вкратце, GAN - это набор генеративных моделей, которые могут научиться генерировать данные (в идеале), идентичные заданному распределению данных. В настоящее время он в основном используется в области компьютерного зрения для создания семантически значимых изображений для различных целей.

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

Хватит разговоров ... Итак, поехали ...

Во-первых, мы сосредоточимся на самом важном уравнении всей статьи.

Давайте внимательно обратим внимание на каждый член этого уравнения.

D (x): функция дискриминатора. Проще говоря, если вы введете точку данных «x» (сгенерированную или из исходного набора данных) через D, она выдаст значение масштабатора от 0 до 1. Это значение вероятность того, что "x" взято из исходного набора данных. Повторюсь. Имейте в виду, что D (x) выводит вероятность того, что "x" взято из исходного набора данных. А не наоборот. В идеале мы хотим, чтобы D (x) (в точке равновесия) выводил 0,5 для каждой точки данных распределения x, будь то от генератора или из исходного набора данных. Интуитивно это означает, что D (x) не может отличить сгенерированные данные от исходных данных, что означает, что генератор генерирует данные, идеально соответствующие исходному распределению.

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

Если вы внимательно посмотрите на уравнение 1, то увидите две петли. Цель внутреннего цикла - максимизировать выражение правой части, насколько это возможно (только путем настройки параметров D). Цель внешнего цикла - минимизировать выражение правой части, насколько это возможно (только путем настройки параметров G).

Посмотрим, что это означает интуитивно.

Чтобы вся функция была максимизирована, первый член E (log (D (x)) должен быть максимизирован. Это означает, что D (x) должен быть максимизирован. Если вы помните график log (x), вы поймете, что когда D (x) становится близким к 1, E (log (D (x )) становится близким к 0. Когда D (x) становится близким к 0, E (log (D (x)) становится близким к - бесконечность. Это означает, что при максимальном увеличении первого члена D (x) будет пытаться вывести значения, близкие к 1, для исходных данных. Это цель D ( х).

Тогда давайте посмотрим на второй срок. Максимальное значение 1-log (D (G (z)) положительное бесконечность, и оно получает это значение, когда D (G (z)) = 0. Это означает, что при максимальном увеличении второго члена D (G (z)) будет пытаться вывести значения, близкие к 0, что является целью D (x ).

Теперь посмотрим на внешний цикл.

Цель внешнего цикла состоит в том, чтобы минимизировать уравнение правой части, только настраивая параметры G. Это означает, что мы будем изменять только G. Теперь первый член правой части не зависит от G. Это означает, что мы можем игнорировать первый член при рассмотрении внешнего цикла. При попытке минимизировать второй член самое низкое его значение - -infinity, которое достигается, когда D (G (z)) = 1. Но D должен выводить 1 только в том случае, если на входе исходные данные. Это означает, что G (z) придется настроить свои параметры таким образом, чтобы выходные данные G (z) были как можно ближе к исходным данным. распределение.

Правильно ... Теперь, после этого анализа, вы должны понять, что игра в эту минимаксную игру приводит к тому, что G (z) максимально приближается к исходному распределению данных, т.е. D (x) = 1 , если x взят из исходных данных, и сделать D (G (z)) = 0. Теперь это момент, когда большинство людей перестают читать анализ и полагают, что они поняли всю статью. Кажется довольно простым, правда?

Нет ... Это непросто. Остальная часть анализа более интересна и содержит всю идею GAN (особенно в отношении конвергенции GAN).

Теперь давайте посмотрим, чего не хватает в приведенном выше объяснении. Обратите внимание, что внутренний цикл минимаксной игры пытается подтолкнуть P_g ~ D (G (z)) к 0, в то время как внешний цикл пытается подтолкнуть P_g ~ D (G (z)) к 1. Итак, где бы эта игра закончилась? Что произойдет, если внутренний цикл выиграет? Или если победит внешний цикл? Есть ли вообще точка равновесия? Если да, создает ли эта точка равновесия оптимальный генератор? Остальная часть анализа предназначена исключительно для того, чтобы ответить на эти вопросы.

Я еще раз повторю два ключевых вопроса.

  1. Есть ли в этой минимаксной игре точка равновесия?
  2. Если да, то производит ли эта точка оптимальный генератор?

Нам нужен ответ «да» на оба эти вопроса. Посмотрим, так ли это.

По определению E (f (x) некоторой функции f (x) относительно распределения вероятностей p (x)) является средним значение f (x), когда x извлекается из p (x). Тогда E (x) рассчитывается как,

Следовательно, мы можем переписать V (D, G) как,

А теперь самое сложное. Теорема LOTUS, сопровождающая статистику, гласит, что если g (x) = x и кто-то знает p (x), но не p (g (x)) , E (g (x)) все еще можно найти с помощью,

Теперь позвольте,

Мы знаем это,

Тогда по теореме LOTUS,

Следовательно, мы можем переписать V (D, G) как,

Рассмотрим функцию,

Теперь визуализируйте трехмерный сюжет,

Как видно на графике, разные функции D (x) будут давать разные кривые f (pdata, pg) для одних и тех же точек данных pdata и pg. V (G, D) - это площадь под кривой f (pdata, pg). Итак, если мы сможем найти D * (x) для каждой точки (pdata, pg), что даст максимальное значение f (pdata, pg) для каждой из этих точек, интегрирование по кривой D * (x) даст нам наибольшую площадь под кривой f (pdata, pg).

Как найти максимум функции? легкий. Мы дифференцируем его и находим места, где он равен нулю. Учитывая каждую постоянную точку данных (pdata, pg) и дифференцируя по D (x),

Это уравнение довольно интуитивно понятно. В нем говорится, что для заданных двух распределений, pdata (original), pg (generated), идеальный дискриминатор должен уметь идентифицировать исходную часть данных.

Как видите, для любой точки данных (pdata, pg), если мы выберем D (x) = D * (x), мы получим максимально возможное значение для f (pdata, pg). Таким образом, интегрирование по этой кривой даст нам максимальное значение для V (G, D). Обратите внимание, что D * (x) не является статической функцией. Он попытается изменить его значение в сторону D * (X) в каждой точке (pg, pdata) во время максимизации V (G, D) . Фактически, именно это градиентный спуск пытается сделать с D (x) во время обучения. Попытка приблизить его к D * (x) в каждой точке (pg, pdata), настраивая его параметры с помощью обратного распространения. Вы также должны заметить, что распределения pg и pdata статичны во время этой процедуры, поскольку мы не меняем параметры генератора (G).

Итак, мы можем переписать уравнение,

Правильно ... Теперь мы сосредоточимся на минимизации игры на C (G), настроив параметры G (Z), где C (G),

Некоторые из вас могут быть сбиты с толку, так как теперь вы не видите G (z) в уравнении, и, должно быть, задавались вопросом, как мы собираемся минимизировать уравнение, настраивая G (Z) . Обратите внимание, что pg и pdata оба зависят от G (Z). Итак, G (Z) встроено в уравнение. Кроме того, настраивая G (Z), мы меняем D * (x ) тоже. Вот почему нас интересует выяснение во всем пространстве x, есть ли точка, которая удовлетворяет условию для D * (x) (что является целью максимизации игры), а также минимум C (G) (что является целью минимизации игры). Другими словами, если такая точка существует, то в этой минимаксной игре есть точка равновесия. В противном случае два игрока будут играть в эту игру вечно без соглашения. Кроме того, еще один важный момент: дает ли этот момент нам оптимальный генератор? (Как видите, я просто перефразирую наши два основных вопроса)

Мы задаемся вопросом: «Какое ограничение налагает оптимальный генератор на pg и pdata?». Очевидно, ответ - pg = pdata. Другими словами, сгенерированное распределение данных должно быть идентично исходному распределению данных. Итак, начнем с этого момента.

Пусть pg = pdata. Тогда D * (x) = 1/2, максимизируя игру. Тогда C (G) = log (1/2) + log (1/2) = -log4. Чтобы увидеть, что это также глобальная точка минимума C (G), мы вычитаем,

из C (G) и получите,

Я полагаю, вы слышали о расхождении KL. Если нет, то это показатель того, насколько данное распределение отличается от второго. Определение дивергенции KL таково:

Применяя это к приведенному выше уравнению, мы получаем,

По определению расхождение Дженсона-Шенона между двумя распределениями задается как,

Используя это, мы получаем,

Теперь расхождение Дженсона-Шенона между двумя распределениями является неотрицательным значением, поэтому мы получаем,

Таким образом, доказано, что глобальное минимальное значение, которое может иметь C (G), равно -log (4), и это достигается с помощью D * (x) = 1/2.

Итак, теперь должно быть ясно, что в точке pg = pdata и максимизация игрока, и минимизация игрока достигнут своих целей. Другими словами, это наша точка равновесия! Что отвечает «да» на наш первый главный вопрос. И, что наиболее важно, в этой точке равновесия pg = pdata, которая дает нам ответ «да» на второй вопрос и ОПТИМАЛЬНЫЙ ГЕНЕРАТОР. УРА !!!

Итак, все готово? Кажется, да, не так ли? Ну остается один небольшой глюк.

Как мы собираемся достичь этой оптимальной точки? Верно, что игра на минимизацию и максимизацию приведет нас к этому, но это всего лишь слова и числа. Какой практический алгоритм мы собираемся использовать, чтобы этого добиться.

Чтобы ответить на этот вопрос, авторы разработали алгоритм, доказывающий, что этот алгоритм приведет нас к оптимальной точке. Давайте посмотрим на этот алгоритм.

Давайте быстро подумаем, как выглядит этот глобальный оптимум. Помните, что D необходимо максимизировать V (G, D) для данного G, и снова G попытается чтобы минимизировать V (G, D) при оптимальном D. Так что это нам дает?

Если вы правильно угадали, это будет седловая точка. Что-то близкое к вышеуказанному сюжету. Я использовал Pg вместо G для облегчения понимания следующей части этой статьи. Поскольку Pg зависит исключительно от G, мы можем использовать Pg вместо G. Обратите внимание, что это не 100% точный график, поскольку D не будет оптимальным при одном и том же значении для каждого заданного Pg.

Наша цель - попасть в красную точку сюжета. Затем в газете говорится примерно следующее.

«Подпроизводные супремума выпуклых функций включают производную функции в точке, где достигается максимум».

Что это значит на простом английском? Давайте посмотрим.

Я нарисую еще один график Pg против V (G, D), сделав D (x) = D * (x) (оптимальный D) в каждой точке Pg. Мы достигнем этой точки, применяя градиентный спуск для D для каждой фиксированной точки Pg, как во внутреннем цикле алгоритма сходимости (см. Алгоритм). Это просто означает, что на приведенном выше графике на каждом Pg я выберу максимальное значение V (G, D), варьируя D (x) и построить график Pg против V (G, D). Это даст мне сюжет, как показано ниже.

В приведенном выше утверждении просто говорится, что если я получу набор производных от V (D *, g) w.r.t. pg, он будет включать в себя все частные производные от V (D, G) w.r.t. pg в местах, где V (D, G) является максимальным для данного Pg (см. график на рисунке 2). Это означает, что производная в красной точке на рисунке 2 находится где-то в наборе производных функции на рисунке 3. И применяя градиентный спуск к G (z) параметры (частичное дифференцирование V (D *, G) от pg), мы можем обновить pg и достичь этой красной точки. Кроме того, из предыдущих доказательств мы знаем, что в этом глобальном оптимуме pdata = pg и D (X) = 1/2, что именно то, что нам нужно.

Если эта последняя часть вам не очень понятна, давайте подумаем об этом простым языком. Посмотрите еще раз на рисунок 2.

Применяя градиентный спуск к D, для данного pg, мы получаем оптимальное D для этого pg. (Внутренний цикл алгоритма сходимости).

Затем, сохраняя D (X) фиксированным, мы применяем градиентный спуск к pg и приближаемся к красной точке. (Внешний цикл алгоритма сходимости)

Поскольку частные производные pg в оптимальных точках D включают красную точку, учитывая достаточную пропускную способность для D и G, мы в конечном итоге достигнем красной точки, используя алгоритм сходимости.

Вот и все!! Это полное теоретическое объяснение статьи Гудфеллоу и др. «Генеративные состязательные сети». Прежде чем закончить, для полноты картины я быстро пройдусь по нескольким моментам, упомянутым в статье. Я намеренно сохранил их в конце концов, так как их легче понять после полного объяснения. В документе содержится следующий рисунок,

Зеленая линия - это pg, черная линия - это pdata, а синяя линия - это D (x). Давайте рассмотрим каждый из них по очереди. (а) - начальная ситуация. pg распространяется далеко от pdata, и D может примерно различать их (низкое значение на pg и высокое значение в pdata). Мы обновляем D, используя приличный градиент, который даст нам (b). Теперь D может лучше различать pg и pdata. Затем в (c) мы обновляем G, который перемещает pg ближе к pdata. После нескольких итераций pg = pdata и D = 1/2 везде, как в (d).

Затем в Paper упоминается, что на практике

вместо того, чтобы тренировать G для минимизации (log (1-D (G (z)))), лучше обучать G, чтобы максимизировать log (D (G (z))).

Как мы можем понять это теоретически?

Давайте посмотрим на графики log (D (G (z))) и log (1-D (G (z))).

На практике изначально G неэффективен и дает данные, которые четко отличаются от исходных данных. Следовательно, изначально D (G (z)) ~ 0. Теперь посмотрим на два сюжета. S1 и S2 - градиенты двух графиков, где D (G (z)) близко к 0 . Как | S1 | ›› | S2 |, log (D (G (z))) изначально будет иметь гораздо более сильные градиенты, чем log (1-D (G (z))) . Помните, что наша цель - довести D (G (z)) до 1/2. В то время как игра при сворачивании пытается подтолкнуть D (G (z)) к 1, игра при разворачивании пытается подтолкнуть D (G (z)) к нулю. Если изначально выигрывает максимизация плательщика (что означает раздельное определение сгенерированных и исходных данных с очень высокой точностью), D (G (z)) никогда не достигнет 1/2. Поэтому для минимизации игрока важно изначально иметь более сильные градиенты, чтобы не отставать от максимизирующего игрока и достичь точки равновесия.

Ну… вот и все !! :) Надеюсь, вам понравился пост: D

Если есть какие-либо вопросы или предложения, не стесняйтесь оставлять комментарии. Хорошего дня!!