Объяснение популярной игры GAN min-max и полной потери модели
Генеративно-состязательные сети (GAN) в последнее время стали очень популярны в мире искусственного интеллекта, особенно в области компьютерного зрения. С введением научной статьи «Генеративно-состязательные сети» Яна Дж. Гудфеллоу и др. [1], появилась мощная новая стратегия для разработки генеративных моделей, и с тех пор возникло множество исследований и исследовательских проектов, разрабатывающих новые приложения, которые мы видим в настоящее время, такие как последний DALL-E 2 [2]или GLIDE[3](оба приложения были разработаны с использованием диффузионных моделей, которые являются более новой парадигмой для генеративных моделей. Однако сегодня GAN продолжает быть широко используемой моделью, способной решать несколько задач)
Но так как все всегда начинается сначала, в этой статье я хотел бы показать смысл и аргументацию оригинальной функции оптимизации GAN, о которой все когда-либо слышали, и ее отличие от Функция Total Loss модели (вы должны знать, что многие другие варианты были созданы позже в зависимости от цели модели)
Оглавление
- Краткое введение в GAN
Обучение GAN - Функция оптимизации (игра мин-макс)
Функция потерь дискриминатора
Функция оптимизации
Функция потерь генератора - Функция полной потери
- Выводы
- Ссылки
1. Краткое введение в GAN
Генеративно-состязательные сети — это класс сред глубокого обучения, которые были разработаны как генеративные модели с целью создания новых сложных данных (выходных данных), таких как изображения или аудио, которые никогда раньше не существовали. сильный>.
Для обучения GAN нам нужен только набор данных (изображения, аудио…), которые мы хотим воспроизвести или сымитировать, и сеть найдет способы создания новых данных, похожих на примеры нашего набора данных.
Другими словами, мы даем модели несколько примеров в качестве входных данных, чтобы «вдохновиться» и даем ей полную свободу генерировать новые выходные данные.
Этот процесс обучения, когда мы просто подаем в сеть входные данные X, не сопровождая их какими-либо метками (или желаемыми выходными данными), называется Обучение без учителя.
Архитектура GAN состоит из двух конкурирующих друг с другом сетей (отсюда и название «Состязательные сети»). Обычно мы называем эти сети Генератором (G) и Дискриминатором (D). Задача Генератора состоит в том, чтобы изучить функцию, которая генерирует данные, начиная с случайного шума, в то время как Дискриминатор должен решить, являются ли сгенерированные данные «настоящими» или нет (здесь «настоящие» означает, что данные принадлежат к примерам нашего набора данных), чтобы мы могли измерить производительность модели и настроить параметры. Обе сети обучаются и учатся одновременно.
обучение ГАН
Существует множество различных вариаций и модификаций обучения GAN. Однако, если мы будем следовать исходной статье [1], цикл обучения ванильного GAN выглядит следующим образом:
дляколичества итераций обучения, выполняемых:
- Сгенерируйте m примеров (изображения, аудио…) из выборочного распределения (т. е. случайного шума z), которые мы будем обозначать: G(г)
- Возьмите m примеров из обучающего набора данных: x
- Смешайте все примеры (сгенерированный и обучающий набор данных) и загрузите их в Дискриминатор D. Вывод D будет между 0 и 1, что означает, что 0 означает поддельный пример, а 1 – настоящий пример.
- Измерьте функции потерь дискриминатора и отрегулируйте параметры
- Создать m новых примеров G’(z)
- Подайте G’(z) на Дискриминатор. Измерьте функцию потерь генератора и отрегулируйте параметры.
конец для
Примечание. Более поздние подходы к обучению GAN измеряют потери генератора и настраивают его параметры вместе с дискриминатором на 4-м шаге, пропуская 5 и 6 и экономя время и компьютерные ресурсы.
2. Функции оптимизации и потерь (игра min-max)
Если вы прочтете исходную статью GAN, вы увидите следующую функцию, которая определяет оптимизирующую функцию для модели.
Примечание. Приведенная выше формула представляет собой Функция оптимизации, то есть выражение, которое обе сети (Генератор и Дискриминатор) пытаются оптимизировать. В этом случае G хочет минимизировать его, а D стремится максимизировать. Однако это не общая функция потерь модели, которая говорит нам о ее производительности.
Чтобы понять игру микс-макс, мы должны подумать о том, что измеряет производительность нашей модели, чтобы сети могли ее оптимизировать. Поскольку архитектура GAN состоит из двух сетей, которые обучаются одновременно, нам необходимо вычислить две метрики: Потери генератора и Потери дискриминатора.
Функция потери дискриминатора
Согласно обучающему циклу, описанному в статье [1], Дискриминатор получает пакет из m примеров из набора данных и другие m примеры от Генератора и выходных данных. число ∈ [0,1], которое представляет собой вероятность того, что входные данные принадлежат распределению набора данных (т. е. вероятность того, что данные «реальны»).
Мы уже знаем, какие примеры являются реальными, а какие сгенерированы, прежде чем вводить их в Дискриминатор (примеры x из набора данных являются реальными, а выходные данные Генераторов G(z) сгенерировано), поэтому мы можем присвоить им метку: y = 0 (сгенерировано), y = 1 (реально).
Теперь мы можем обучить Дискриминатор как обычный бинарный классификатор, используя функцию потерь Binary Cross Entropy:
Однако, поскольку это бинарный классификатор, при суммировании чередуются члены:
— Когда ввод действителен, метка y = 1 → суммирование ∑ = log(D(k))< br />- Когда ввод сгенерирован, метка y = 0 → суммирование ∑ = log(1-D(k))
Таким образом, мы можем переписать выражение в более простом виде:
Функция оптимизации
Как мы знаем, Дискриминатор хочет минимизировать свои потери, таким образом, он хочет минимизировать приведенную выше формулу (argmin Dloss). Однако мы можем изменить формулу, убрав отрицательный символ. Теперь вместо того, чтобы минимизировать выражение, мы должны его максимизировать:
Наконец, мы можем оперировать терминами:
И переписать выражение:
С другой стороны, цель Генератора — подделать Дискриминатор. Затем Генератор должен сделать противоположное Дискриминатору и найти минимум V(G,D).
Теперь мы можем просуммировать оба выражения (функции оптимизации дискриминатора и генератора) и получить итоговое:
(Тадаа!) Наконец-то мы получили функцию оптимизации. Однако, как я уже говорил, это не функция Total Loss, которая говорит нам об общей производительности нашей модели. Но прежде чем добраться туда, нам нужно сначала вычислить потери генератора:
Функция потери генератора
Оглядываясь снова на функцию Оптимизации, мы видим, что Генератор участвует только во втором члене выражения E(log(1-D(G(z))), а первый остается постоянным Таким образом, функция потерь генератора, которую пытаются минимизировать, выглядит следующим образом:
Однако мы еще не закончили. Как поясняется в исходной статье, «В начале обучения, когда G неудовлетворительно, D может с высокой степенью достоверности отклонять выборки, поскольку они явно отличаются от обучающих данных».т.е. На ранних этапах обучения Дискриминатору очень легко отличить реальные изображения от сгенерированных, поскольку Генератор еще не обучен. В этом случае log(1 − D(G(z)) насыщается, так как D(G(z)) ∼ 0
Чтобы избежать этой ситуации, исследователи предлагают следующее: «Вместо того, чтобы обучать G минимизировать log(1 − D(G(z))), мы можем обучить G максимизировать log D(G(z ))”.
Это то же самое, что сказать, что вместо того, чтобы обучать Генератор минимизировать вероятность того, что изображение является поддельным, он будет максимизировать вероятность того, что изображение является реальным. .
По сути, обаподхода к оптимизации одинаковы, как видно на графике:
Итак, для наших целей функция потерь генератора, которую мы будем использовать:
Примечание. На практике при кодировании функции потерь генератора обычно используется отрицательная форма приведенной выше формулы, так что вместо максимизации функции цель состоит в том, чтобы минимизировать ее. Это облегчает настройку параметров с помощью таких библиотек, как Tensorflow. Это также важно для понимания функции общих потерь, которая находится в следующем разделе.
3. Функция полной потери
В статье описаны формулы потерь каждого компонента (Генератора и Дискриминатора), а также функция оптимизации модели. Но как мы можем измерить общую производительность модели?
Простой взгляд на функцию оптимизации не является хорошим показателем, потому что, как мы уже видели, функция оптимизации является модификацией функции потерь дискриминатора и, следовательно, не отражает производительность генератора (хотя функция потерь генератора выводится из это, мы просто учитываем производительность Дискриминатора в этой функции)
С другой стороны, можно подумать о добавлении обеих функций Loss (Discriminator и Generator) и, хотя это хорошая интуиция, нужно учитывать некоторые нюансы:
1. Обе отдельные функции потерь должны стремиться к минимизации или максимизации.
В противном случае добавление будет отражать большую или меньшую ошибку, чем та, которая должна быть.
Например, давайте возьмем функцию оптимизации, которую нужно максимизировать с помощью D:
и первая функция потерь генератора, которая должна быть минимизирована с помощью G:
Когда D работает плохо (низкая ошибка), а G работает отлично (низкая ошибка), общая производительность будет давать низкую ошибку, а это означает, что обе сети (G и D) работают отлично, хотя мы знаем, что одна из них это не так.
Более того, если одна из потерь направлена на минимизацию, а другая на максимизацию, мы не будем знать, является ли высокая ошибка хорошей или плохой.
Примечание. Если мы используем функции потерь, которые нацелены на максимизацию, может показаться нелогичным называть это «ошибкой», поскольку чем выше «ошибка», тем лучше производительность. Однако мы также можем преобразовать его, используя логарифмическую шкалу, так что log(1+"Error")
2. Для построения функции общих потерь отдельные потери должны находиться в одном диапазоне значений.
Давайте теперь возьмем в качестве примера первую потерю дискриминатора, о которой мы говорили (бинарная перекрестная энтропия):
И предыдущая функция потери генератора, использованная в последнем пункте:
Теперь обе функции удовлетворяют условию стремления к минимуму. Однако потери дискриминатора находятся в диапазоне [0, +∞), в то время как потери генератора выводят значения в (-∞, 0]. Сложение этих двух функций аналогично вычитанию потерь генератора, поэтому мы говорим, что общие потери - это Потеря Дискриминатора без влияния Генератора (т.е. E(log(D(xi))), где E обозначает ожидаемое значение), и это неверно.
Тем не менее, у нас есть еще одна добавляющая комбинация. Что, если мы добавим первую потерю дискриминатора и отрицательную форму модифицированной потери генератора?
(ура!) Это функция общих потерь GAN. Однако, если вы мне не верите, давайте проверим, удовлетворяет ли оно свойствам.
✅ 1. Мы знаем, что Dloss предназначен для минимизации и что отрицательная форма Modified Generator Loss также предназначена для минимизации.
✅ 2. Dloss выводит значения в диапазоне [0, +∞), и оказывается, что отрицательный Modified Generator Loss также отображает значения в том же диапазоне.
Таким образом, мы добавляем к ошибкам той же категории и, следовательно, вычисляем функцию общих потерь нашей модели.
4. Выводы
Резюмируя основные ключевые моменты этой статьи:
- Функция оптимизации GAN (также называемая игрой min-max) и Total Loss модели — это разные понятия:
Оптимизация min-max ≠ Total Loss - Происхождение функции оптимизации происходит от бинарной кросс-энтропии (которая, в свою очередь, является потерей дискриминатора), из которой также выводится функция потери генератора.
- На практике функция потерь генератора изменена таким образом, чтобы логарифмы не насыщались. И эта модификация также полезна для вычисления функции Total Loss для модели.
- Функция Total Loss = Dloss + Gloss. Однако не все формулы можно использовать, и нам необходимо принять во внимание два ключевых момента:
- Обе отдельные функции потерь должны стремиться к минимизации или максимизации.
- Отдельные потери должны быть одинаковыми. диапазон значений
Надеюсь, статья вам понравилась и помогла. Пожалуйста не стесняйтесь оставить комментарий. Любые отзывы или исправления будут приветствоваться
5. Ссылки
[1] Генеративно-состязательные сети. Ян Дж. Гудфеллоу и др. 2014
[2] Генерация иерархического текстового условного изображения с латентными данными CLIP (статья DALL-E 2). OpenAI 2022