09 / 33 · GAN
Генеративно-состязательные сети
GAN как минимаксная игра двух игроков, функция ценности как бинарная кросс-энтропия, цикл обучения с чередованием шагов, оптимальный дискриминатор, тождество с дивергенцией Йенсена–Шеннона, стоящее за глобальным оптимумом, почему на практике используется ненасыщающаяся функция потерь генератора, вычисляемая по логитам, практические правила, благодаря которым обучение работает (архитектура DCGAN, баланс двух игроков, сглаживание меток, средства против коллапса мод), а также условный GAN, f-GAN и GAN наименьших квадратов.
Энтропия, кросс-энтропия и KL-дивергенция · Бинарная кросс-энтропия · Математическое ожидание
На этой странице 12
VAE обучает свой генератор через нижнюю оценку правдоподобия и расплачивается за это размытыми сэмплами. Генеративно-состязательная сеть (generative adversarial network, GAN) обходится без правдоподобия вовсе (Goodfellow et al., 2014). Генератор — это сеть, которая превращает шум в сэмплы, и обучается он только через вторую сеть, дискриминатор, которая пытается отличить сгенерированные сэмплы от настоящих. Модель неявная (implicit): из неё можно сэмплировать, но нельзя вычислить её плотность.
Эту заметку организуют два факта; всё остальное показывает, откуда они берутся.
- Если дискриминатор оптимален, целевая функция генератора — это, по сути, дивергенция Йенсена–Шеннона (Jensen–Shannon divergence) в другой записи: . Тогда обучение генератора означает минимизацию .
- Если носители (supports) двух распределений не перекрываются, а дискриминатор (почти) оптимален, минимаксная функция потерь генератора не даёт полезного градиента: JS застревает на своём максимуме , где бы ни находилось , а оптимальный дискриминатор постоянен вокруг сгенерированных сэмплов.
Обозначения. — плотность данных, — априорное распределение шума, — генератор с параметрами , — плотность сгенерированных сэмплов , — дискриминатор с параметрами ; — вероятность того, что настоящий, причём . Сеть с сигмоидой на выходе принимает значения в и может лишь приближаться к концам отрезка. Логарифмы натуральные.
Порядок чтения. При первом чтении достаточно игры, чередующихся обновлений, оптимального дискриминатора и его связи с JS, ненасыщающейся функции потерь через логиты, коллапса мод, а затем GAN Вассерштейна. Расширения f-GAN и GAN наименьших квадратов — дополнительный материал.
Постановка#
Сэмплируем шум , например из стандартного гауссовского распределения, и пропускаем его через генератор. Выход — сгенерированный сэмпл, а его распределение — . Дискриминатор получает либо сгенерированный сэмпл с меткой (подделка), либо точку данных с меткой («настоящие») и выдаёт вероятность того, что его вход настоящий.
Игра GAN в виде схемы
Генератор никогда не видит настоящих данных напрямую. Он учится только через выход дискриминатора, а дискриминатор учится разделять два потока.
Минимаксная игра#
Две сети играют в минимаксную игру: дискриминатор максимизирует свой успех, а генератор минимизирует успех дискриминатора. Успех измеряется функцией ценности (value function)
а сама игра — это .
Дискриминатор хочет, чтобы было близко к на настоящих данных, а — близко к на подделках; и то и другое увеличивает . Генератор хочет, чтобы было близко к , и тогда второе слагаемое становится сильно отрицательным.
Откуда берётся функция ценности: бинарная кросс-энтропия#
Дискриминатор — бинарный классификатор, поэтому начнём с бинарной кросс-энтропии (binary cross-entropy, BCE) между меткой и предсказанием :
- Для настоящего сэмпла , и .
- Для поддельного сэмпла , и .
Для одного настоящего и одного поддельного сэмпла сумма равна . Усреднение по многим таким парам превращает суммы в математические ожидания:
что для непрерывных распределений записывается как
Это в точности . Итак, — это бинарная кросс-энтропия дискриминатора со знаком минус: максимизировать по — то же самое, что обучать как обычный классификатор с функцией потерь BCE. Два слагаемых входят с равными весами, потому что классификатор видит настоящие и поддельные сэмплы в равной пропорции, то есть априорная вероятность класса равна . При других пропорциях меняются и , и оптимальный дискриминатор, найденный ниже.
Как оптимизировать: игроки ходят по очереди#
Два игрока ходят по очереди, каждый на мини-батче размера (Goodfellow et al., 2014, алгоритм 1).
- Фиксируем . Берём настоящих сэмплов и сэмплов шума и обновляем градиентным подъёмом вдоль
- Фиксируем . Берём новых сэмплов шума и обновляем градиентным спуском вдоль
В шаге генератора участвует только второе слагаемое, потому что первое слагаемое не зависит от : содержит только настоящие данные и , поэтому его градиент по равен нулю. Шаг 1 можно повторять раз на каждый шаг генератора; в исходной статье . Как выбирать , обсуждается в разделе о балансе двух игроков.
Глобальный оптимум: генератор совпадает с данными#
Игра выиграна, когда распределение генератора совпадает с распределением данных. Доказательство состоит из двух шагов (Goodfellow et al., 2014, предложение 1 и теорема 1).
Шаг 1: оптимальный дискриминатор при фиксированном генераторе#
Как и в Goodfellow et al. (2014), раздел 4, предположим, что оба распределения имеют плотности на одном и том же пространстве и что может быть любой функцией (неограниченная ёмкость, infinite capacity). Когда , первое предположение нарушается; этот случай разобран ниже, в абзаце о неперекрывающихся носителях.
Перепишем второе математическое ожидание через сгенерированные сэмплы: имеет плотность , поэтому . Тогда при фиксированном
можно выбирать свободно в каждой точке , поэтому подынтегральное выражение можно максимизировать поточечно. Обозначим , и . Если , то для функции на
поэтому — единственный максимум, и он лежит внутри . Если обращается в нуль ровно одна плотность, монотонна на и её максимум достигается на конце отрезка: там, где (только данные), и там, где (только подделки). Формула даёт и эти значения; выход с сигмоидой может к ним лишь приближаться. Там, где обе плотности равны нулю, не имеет значения (Goodfellow et al., 2014, предложение 1).
В каждой точке x — максимизация по одной переменной
Следовательно, при фиксированном генераторе наилучший дискриминатор равен
Оптимальный дискриминатор сравнивает две плотности
Шаг 2: подставляем оптимальный дискриминатор и узнаём JS#
Подставим обратно в . Поскольку ,
Дивергенция Йенсена–Шеннона (определение здесь) сравнивает каждое распределение со смесью . Через математические ожидания
Чтобы знаменатели совпали, разделим каждый из них на внутри логарифма и заплатим за это в каждом математическом ожидании, поскольку . При
то есть
Поскольку и равенство достигается только при , минимум по достигается только при :
и при этом всюду. Для двух плотностей с рисунка об оптимальном дискриминаторе ната (nats) и ; оба значения получены численным интегрированием — и по определению , и по формуле через JS.
Это объясняет и предупреждение о неперекрывающихся носителях. Если и сосредоточены на непересекающихся множествах, то на данных и на подделках, и независимо от того, где именно находится . Значит, постоянна по параметрам генератора. Однако обратное распространение ошибки дифференцирует не : оно передаёт градиент через фиксированный , и этот градиент содержит в сгенерированных сэмплах. Когда носители — непересекающиеся компактные множества или многообразия, которые не выровнены идеально (do not perfectly align), существует оптимальный дискриминатор, равный на целой окрестности сгенерированных сэмплов, поэтому там и градиент генератора исчезает (Arjovsky and Bottou, 2017, теоремы 2.1–2.2). Для дискриминатора, который отличается от не более чем на по значению и по градиенту, норма градиента не превосходит , где — верхняя граница нормы якобиана генератора (теорема 2.4).
Это не экзотический случай. Генератор, составленный из аффинных отображений и поэлементных нелинейностей, переводит в счётное объединение многообразий размерности не выше (лемма 1), а естественные изображения, как считается, сосредоточены вблизи многообразия малой размерности. Два таких многообразия почти никогда не перекрываются на множестве положительной меры: они могут пересекаться, но только по множеству меньшей размерности (леммы 2–3). Поэтому идеальный дискриминатор существует и , как бы близко ни находились два многообразия (теоремы 2.2–2.3). Это то же насыщение JS, которое мы наблюдали в одномерном случае в заметке о подгонке распределений. Чтобы исправить его, заметка о WGAN заменяет JS на расстояние Вассерштейна-1.
Обучение в картинках#
Как движутся два игрока во время обучения
- В начале далеко от , а дискриминатор произволен.
- После обновления дискриминатор приближается к : он высок над данными и низок над сгенерированными сэмплами.
- После обновления градиент направляет в области, которые относит к данным, поэтому сдвигается к .
- В итоге , и дискриминатор не может их различить: .
Эта картина идеализирована. Теория предполагает, что достигает оптимума после каждого шага генератора и что оба игрока могут представить любую функцию. На практике оба — нейронные сети, которые обучаются по нескольку шагов за раз, и чередующиеся обновления могут колебаться или схлопываться к нескольким модам данных (коллапс мод, mode collapse) вместо того, чтобы сходиться (Goodfellow, 2016, раздел 5.1.1). Средства против него собраны в разделе о коллапсе мод и борьбе с ним.
Какая функция потерь генератора используется на практике?#
Минимаксную функцию потерь генератора редко минимизируют напрямую. Уже исходная статья рекомендует (Goodfellow et al., 2014, раздел 3) вместо этого обучать генератор максимизировать , то есть минимизировать
ненасыщающуюся функцию потерь (non-saturating loss). В коде это BCE между выходом дискриминатора на сгенерированных сэмплах и меткой «настоящий».
Проблема минимаксной функции потерь. Когда хорош, он уверенно отвергает подделки: . Тогда . Малое значение само по себе не означает малого градиента; важен наклон функции потерь по и дальше, при обратном проходе через сеть:
При наклоны равны и . Дискриминатор заканчивается сигмоидой, , и . Поэтому по логиту градиенты равны для минимаксной функции потерь и для ненасыщающейся. Минимаксная функция потерь насыщается по логиту, то есть там, где градиент входит в сеть: её градиент исчезает именно тогда, когда генератор хуже всего, а градиент ненасыщающейся функции потерь там как раз наибольший.
Насыщающаяся и ненасыщающаяся функции потерь генератора
Обе функции потерь убывают с ростом , поэтому толкают генератор в одном направлении, и при оптимальном дискриминаторе у них общая неподвижная точка (Goodfellow et al., 2014, раздел 3). Ненасыщающийся вариант уже не является в точности минимаксной игрой. При его ожидаемый градиент равен градиенту (Arjovsky and Bottou, 2017, теорема 2.5). Первое слагаемое — обратная KL (reverse KL): она сильно штрафует неправдоподобные, не похожие на настоящие сэмплы и лишь слабо — пропущенные моды; это одно из объяснений пропуска мод (mode dropping). Ненасыщающаяся функция потерь устраняет слабые градиенты в начале обучения, но не проблему непересекающихся носителей из предыдущего раздела: если моделировать ошибку дискриминатора вокруг как независимый шум, обновления генератора не исчезают, а становятся неустойчивыми, с бесконечной дисперсией (теорема 2.6).
Вычисление функций потерь по логитам#
Сеть дискриминатора заканчивается логитом , и . Оба логарифма в функциях потерь — функции от , для которых само значение вычислять не нужно:
где . Первая строка следует из , а вторая использует . Softplus вычисляют как , поэтому экспонента никогда не переполняется. Функция потерь дискриминатора принимает вид , а ненасыщающаяся функция потерь генератора — .
Если сначала вычислить , а потом логарифм, вычисление ломается именно там, где дискриминатор уверен. В 32-битной арифметике с плавающей точкой округляется ровно до , как только превышает примерно 17, поэтому возвращает там, где форма через softplus даёт около , и через округлённую сигмоиду не проходит никакой градиент. Библиотеки глубокого обучения предоставляют устойчивую форму как бинарную кросс-энтропию по логитам (binary_cross_entropy_with_logits в PyTorch).
Обучение GAN на практике#
Теория выше предполагает оптимальный дискриминатор и сети неограниченной ёмкости. Настоящий GAN — это две сети конечной ёмкости, которые обучаются по нескольку шагов за раз, и будет ли обучение вообще работать, решает набор эмпирических правил. Ни одно из них не теорема; каждое приводится здесь вместе с причиной, по которой оно помогает.
Архитектура: рекомендации DCGAN#
Первые свёрточные GAN, которые надёжно обучались на изображениях, следовали пяти правилам (Radford, Metz and Chintala, 2016, раздел 3):
- Никакого пулинга (pooling). Дискриминатор понижает разрешение свёртками с шагом больше 1 (strided convolutions), а генератор повышает его свёртками с дробным шагом (fractionally strided), то есть транспонированными свёртками (transposed convolutions), так что обе сети сами учатся менять разрешение.
- Батч-нормализация (batch normalization) в обеих сетях, кроме выходного слоя генератора и входного слоя дискриминатора, где из-за неё сэмплы начинали колебаться.
- Никаких полносвязных скрытых слоёв. Первый слой генератора — матричное умножение, выход которого переформируется в небольшую пространственную карту: с 1024 каналами в генераторе из статьи. Последние свёрточные признаки дискриминатора вытягиваются в вектор и дают один выход с сигмоидой.
- ReLU в генераторе и Tanh на его выходе, чтобы изображения лежали в , как и обучающие изображения, отмасштабированные в этот диапазон.
- LeakyReLU в дискриминаторе с наклоном .
Стандартными стали и детали обучения (раздел 4): Adam с шагом обучения (learning rate) и , потому что обычное приводило к колебаниям; мини-батчи по 128 примеров; веса, инициализированные из ; и 100-мерный вектор шума из равномерного распределения.
У этих правил есть причины, которые объясняют предыдущие заметки. Свёртки с шагом и LeakyReLU сохраняют градиенты плотными: max-пулинг передаёт градиент только одному входу каждого окна, а ReLU при отрицательных входах не передаёт его вовсе, тогда как LeakyReLU сохраняет там наклон (см. распространённые решения проблемы затухающих градиентов). Именно батч-нормализация позволила глубоким генераторам начать обучаться, и она не давала им схлопнуть все сэмплы в одну точку (раздел 3). Внутри дискриминатора она к тому же делает каждый выход зависящим от статистик всего мини-батча — это слабая форма описанной ниже дискриминации по мини-батчу (minibatch discrimination; Salimans et al., 2016, разделы 3.2 и 3.5).
Более поздние архитектуры меняют часть правил, но сохраняют их назначение.
- Повышение разрешения. Транспонированная свёртка, размер ядра которой не делится на шаг, перекрывается неравномерно и может оставлять шахматные артефакты (checkerboard artifacts). Изменение размера с последующей обычной свёрткой избегает неравномерного перекрытия (транспонированная свёртка или повышение разрешения + свёртка?).
- Полностью свёрточный дискриминатор. Последним слоем может быть свёртка, ядро которой покрывает всю оставшуюся карту признаков, например на карте ; она возвращает один логит на изображение без полносвязного слоя. Radford et al. обнаружили, что глобальный усредняющий пулинг (global average pooling) на этом месте повышал устойчивость, но замедлял сходимость (раздел 3).
- Дропаут (dropout) в дискриминаторе. Случайное выбрасывание целых карт признаков, как в шумоподавляющем автоэнкодере (denoising autoencoder), регуляризует дискриминатор, так что он меньше подстраивается под обучающие изображения.
- Латентный код. Никакая теория не задаёт его размер. Слишком маленький код не может представить разнообразие данных; DCGAN использует 100 измерений, и обычны значения от 100 до 256. Свёрточный генератор может также начинать с небольшой пространственной сетки шума, например с несколькими каналами, и удваивать разрешение в каждом блоке: .
- Сэмплирование из суженного априорного распределения. Если при сэмплировании уменьшить масштаб шума, например брать вместо , изображения получаются более типичными, но менее разнообразными. Тогда сэмплы приходят не из того распределения, на котором обучался генератор. Такое сужение априорного распределения — эвристика, похожая на усечение, которую часто вольно называют трюком усечения (truncation trick); она жертвует полнотой (recall) ради точности (precision). Строго говоря, масштабирование гауссианы — не сэмплирование усечённой гауссианы, которое BigGAN выполняет, пересэмплируя значения за порогом. Любая метрика, посчитанная по таким сэмплам, измеряет изменённое распределение, поэтому масштаб сэмплирования нужно сообщать вместе с ней.
Баланс двух игроков#
Дискриминатор — единственный источник градиента для генератора, поэтому оба игрока должны улучшаться с сопоставимой скоростью. Уже исходная статья предупреждает, что генератор, который слишком долго обучается против фиксированного дискриминатора, отображает слишком много значений в один и тот же (Goodfellow et al., 2014, раздел 6). Регуляторы здесь — число шагов дискриминатора на шаг генератора, два шага обучения и ёмкость каждой сети.
- Дискриминатор насыщается: он почти наверняка отвергает подделки, и градиенты генератора уменьшаются. Минимаксная функция потерь насыщается, а при непересекающихся носителях даже оптимальный дискриминатор не указывает направления. Тогда дискриминатор обновляют реже, снижают его шаг обучения или уменьшают его ёмкость.
- Генератор не справляется или схлопывается к нескольким модам, а обратная связь от дискриминатора неустойчива: дискриминатор отстаёт и указывает плохие направления. Тогда его обновляют чаще, .
Ни одна из крайностей не работает. Слишком много шагов дискриминатора приводят к затуханию градиентов генератора; слишком мало — оставляют дискриминатор, который не может дать осмысленной обратной связи. Следующая заметка меняет целевую функцию так, чтобы сильный критик помогал, а не мешал.
Картину дополняют три привычки. Обрезка нормы градиента (gradient clipping; распространённые решения) защищает от редких взрывных обновлений; Nowozin, Cseke и Tomioka сочли Adam и обрезку полезными в своём самом крупном эксперименте (2016, раздел 3.2). Небольшая архитектура или небольшой набор данных сначала проверяют, что весь конвейер работает. И на сэмплы стоит смотреть часто: две функции потерь меняются в противоположные стороны и не измеряют качество сэмплов, поэтому заметить коллапс рано позволяют именно сэмплы, а позже и метрики вроде Inception Score.
Сглаживание и инвертирование меток#
Одностороннее сглаживание меток (one-sided label smoothing) обучает дискриминатор на настоящих сэмплах с целевым значением вместо , чтобы он никогда не становился полностью уверенным (Salimans et al., 2016, раздел 3.4). Почему только на настоящих сэмплах? Пусть целевые значения равны для настоящих и для поддельных сэмплов. Подынтегральное выражение из шага 1 принимает вид , где и , поэтому его максимум достигается в точке :
Рассмотрим область, где генератор помещает гораздо больше массы, чем данные, так что отношение мало. Там с точностью до первого порядка по имеем .
- При ненасыщающаяся функция потерь следует за логарифмом отношения плотностей, и её градиент не уменьшается вместе с .
- При она равна , и её градиент содержит малый множитель : подделки, далёкие от данных, почти не сдвигаются.
Поэтому сглаживают только метку настоящих сэмплов. При оптимальный выход не превосходит : там, где две плотности равны, он равен вместо .
Случайное инвертирование меток (random label flipping) меняет на противоположные метки небольшой случайной доли обучающих примеров дискриминатора. Бинарная кросс-энтропия линейна по целевому значению , поэтому в среднем инвертирование заменяет целевые значения и на и . Это двустороннее сглаживание меток с и плюс шум. Оно не даёт дискриминатору стать излишне уверенным, но, согласно рассуждению выше, его половина, относящаяся к подделкам, ослабляет притяжение далёких от данных подделок, поэтому его применяют осторожно, если применяют вообще.
Коллапс мод и борьба с ним#
При коллапсе мод генератор отображает большую часть своего шума в несколько выходов, которые принимает текущий дискриминатор. Salimans et al. (2016, раздел 3.2) описывают механизм. Дискриминатор рассматривает каждый сэмпл по отдельности, поэтому его градиент указывает в одну и ту же сторону для всех похожих сэмплов, и ничто не требует от выходов генератора отличаться друг от друга. Когда дискриминатор научится отвергать схлопнувшуюся моду, генератор переходит к другой, и они могут гоняться друг за другом бесконечно. Вторая причина — слагаемое с обратной KL в ненасыщающейся функции потерь (выше): пропуск моды обходится ей дёшево. Средства борьбы воздействуют на разные части этого механизма.
- Дискриминация по мини-батчу позволяет дискриминатору сравнивать сэмплы (Salimans et al., 2016, раздел 3.2). Промежуточный вектор признаков умножается на обучаемый тензор , что даёт матрицу . Для каждой её строки близость двух сэмплов равна , и слой выдаёт — сумму по мини-батчу. Вектор присоединяется к и подаётся на следующий слой, отдельно для мини-батчей настоящих и сгенерированных сэмплов. Схлопнувшийся батч содержит много почти одинаковых сэмплов и поэтому даёт большие значения , и дискриминатор может научиться такие батчи отвергать.
- Развёрнутые GAN (unrolled GANs) позволяют генератору предвидеть ответ дискриминатора (Metz et al., 2017, разделы 2.2–2.4). Запишем функцию ценности как . Начиная с , сделаем шагов градиентного подъёма дискриминатора, , и определим суррогат . Генератор спускается по , распространяя градиент обратно через все шагов, а дискриминатор по-прежнему обновляется по . По правилу дифференцирования сложной функции градиент состоит из двух слагаемых (раздел 2.4): обычной производной при развёрнутом дискриминаторе и слагаемого через , которое описывает, как дискриминатор отреагировал бы на ход генератора. Первое слагаемое само по себе толкает к коллапсу: против фиксированного дискриминатора наилучший генератор помещает всю массу в единственную точку, которая больше всего нравится дискриминатору. Второе слагаемое «видит», что схлопнувшийся генератор быстро был бы отвергнут, и тем самым препятствует коллапсу. — стандартный GAN. Если внутренних шагов сходятся к оптимальному дискриминатору, то при суррогат приближается к истинной целевой функции генератора ; у нейросетевого дискриминатора внутренний подъём может не сойтись или дойти лишь до локального оптимума, так что большое — приближение, а не гарантия.
- История. Историческое усреднение (historical averaging) добавляет к функции потерь каждого игрока слагаемое , где — параметры на прошлом шаге : это притяжение к среднему всех прошлых значений параметров, которое гасит колебания (Salimans et al., 2016, раздел 3.3). Если обучать дискриминатор частично на буфере сэмплов от прежних генераторов (в Shrivastava et al. (2017), раздел 2.3, это половина каждого мини-батча дискриминатора), он не забывает моды, которые генератор посещал раньше, и генератор не может безнаказанно к ним вернуться.
- Несколько дискриминаторов. GMAN обучает генератор против дискриминаторов и объединяет их значения сглаженным максимумом, который переходит от среднего к максимуму, когда параметр растёт от до (Durugkar, Gemp and Mahadevan, 2017, раздел 4.1). Среднее — снисходительный учитель, а максимум — суровый противник.
- Другое расстояние. GAN Вассерштейна (Wasserstein GAN) со штрафом на градиент (gradient penalty) или спектральной нормализацией критика даёт полезные градиенты, даже когда носители не перекрываются. Исходный WGAN, обученный с обрезкой весов (weight clipping), не показал признаков коллапса мод ни в одном из экспериментов его авторов (Arjovsky, Chintala and Bottou, 2017, раздел 4.3).
Расширения#
Условный GAN#
Условный GAN (conditional GAN; Mirza and Osindero, 2014) даёт обеим сетям метку , например класс: генератор выдаёт , а дискриминатор оценивает пары . Пусть — совместное распределение данных и меток, а — его маргинальное распределение меток. Функция ценности становится такой:
где второе математическое ожидание берётся по и . Это исходная игра, разыгранная на парах : у сгенерированных пар совместное распределение , и рассуждение из предыдущих разделов, применённое к парам, показывает, что в оптимуме совместные распределения совпадают: . Реалистичное изображение в паре с неверной меткой лежит вне совместного распределения данных, поэтому дискриминатор может его отвергнуть, и генератор учится следовать условию. Это аналог условного VAE для GAN.
f-GAN#
Дополнительный материал: игра для любой f-дивергенции через сопряжённые функции. Остальная часть заметки на него не опирается.
Исходный GAN минимизирует JS. f-GAN (Nowozin, Cseke and Tomioka, 2016) обобщает игру на любую f-дивергенцию (f-divergence)
где — выпуклая полунепрерывная снизу функция с ; даёт . Ключевой инструмент — сопряжённая по Фенхелю функция (convex conjugate) . После перестановки слагаемых определение даёт неравенство при любом : каждая прямая с наклоном и свободным членом лежит под графиком , а для дифференцируемой прямая с касается графика в точке . Для выпуклой полунепрерывной снизу эти прямые восстанавливают в точности: (теорема Фенхеля–Моро). Например, , половина порождающей функции дивергенции Пирсона, даёт : супремум достигается при .
Сопряжённая по Фенхелю функция как свободный член касательной
Подставим это представление в каждой точке, положив , и позволим наклону зависеть от (Nguyen, Wainwright and Jordan, 2010; Nowozin, Cseke and Tomioka, 2016, раздел 2.2, формулы 4–5):
Во второй строке наилучший наклон выбирается отдельно в каждой точке. Если пробегает все функции со значениями в области определения , при этом ничего не теряется: для дифференцируемой супремум достигается при . Неравенство появляется в третьей строке, где ограничена классом , например семейством нейронных сетей.
При , и нейронной сети правая часть — игра двух игроков: играет роль дискриминатора и максимизирует, а генератор минимизирует. Обоим математическим ожиданиям нужны только сэмплы, а не плотности, и именно поэтому оценка пригодна для неявной модели. Исходный GAN — один из частных случаев, с ненормированной порождающей функцией. При имеем , а не : эта — нормированная порождающая функция плюс константа , и поскольку , дивергенция сдвигается на ту же константу: , а сопряжённая функция равна при . Подстановка с даёт , и оценка превращается в точности в (Nowozin, Cseke and Tomioka, 2016, раздел 2.4, таблицы 1 и 6).
Выходные активации. Оценке нужно, чтобы лежало в области определения , а для большинства дивергенций это не вся вещественная прямая. Поэтому в f-GAN сеть выдаёт неограниченное число , которое затем проходит через фиксированную возрастающую выходную активацию (output activation) , так что (раздел 2.4, формула 7). Игра принимает вид
В таблице собраны обычные варианты (таблицы 1 и 2). Соглашение то же, что выше: при и , а порождающие функции взяты у Nowozin et al. Условие после задаёт её область определения.
| Дивергенция | |||
|---|---|---|---|
| , | |||
| Пирсона | |||
| квадрат расстояния Хеллингера | , | ||
| , | |||
| GAN: , без нормировки | , |
Три замечания к таблице.
- Каждая возрастает, поэтому большое всегда означает «выглядит настоящим».
- Nowozin et al. называют пятую строку дивергенцией Йенсена–Шеннона, но при этой получается удвоенная в смысле определения из заметки об энтропии. Её больше, чем в строке GAN, на , поэтому две дивергенции отличаются на константу , и обучение по этим двум строкам идёт одинаково.
- Строка Пирсона использует . Порождающая функция из примера выше даёт половину этой дивергенции и сопряжённую функцию .
Сначала композиция, потом вычисление. Если вычислять сначала , а затем , теряется точность — по той же причине, что и при с последующим (выше), и Nowozin et al. рекомендуют реализовывать композицию напрямую (раздел 2.4, сноска 1). Для каждой строки она проста: сверху вниз , , , , и . Для строки GAN , поэтому — в точности бинарная кросс-энтропия дискриминатора со знаком минус, вычисленная по его логиту .
Шаг генератора. Как и в GAN, генератор может максимизировать вместо того, чтобы минимизировать относящееся к подделкам слагаемое . Стационарная точка при этом сохраняется, и Nowozin et al. сочли такой шаг полезным и для дивергенций, отличных от дивергенции GAN (раздел 3.2).
GAN наименьших квадратов#
Дополнительный материал: квадратичная функция потерь дискриминатора и то, что минимизирует её оптимум. Остальная часть заметки на него не опирается.
Ненасыщающаяся функция потерь исправляет градиент для подделок, которые дискриминатор уверенно отвергает. GAN наименьших квадратов (least-squares GAN, LSGAN) исправляет и противоположный случай — подделки, которые дискриминатор уже принимает, но которые всё ещё далеки от данных (Mao et al., 2017). У его дискриминатора нет сигмоиды. Это регрессионная сеть с вещественным выходом, которую обучают выдавать значение на настоящих сэмплах и на подделках, а генератор хочет, чтобы его сэмплы получали значение (раздел 3.2, формула 2):
Обычный выбор — кодирование 0–1, , (формула 9): дискриминатор учится выдавать 1 на настоящих сэмплах и 0 на подделках, а генератор добивается значения 1. Mao et al. обнаружили, что это кодирование работает так же, как кодирование для , описанное ниже, и использовали его в своих экспериментах (раздел 3.2.3).
Почему помогают наименьшие квадраты. Граница решений (decision boundary) проходит там, где находится посередине между и . Подделка может лежать по «настоящую» сторону этой границы, так что дискриминатор уже считает её настоящей, и всё же быть далеко от данных. При сигмоиде и кросс-энтропии у такого сэмпла почти нет ни потерь, ни градиента: ненасыщающаяся функция потерь выполаживается с ростом логита , и её наклон . Квадратичная функция потерь плоская только при , поэтому подделку, получившую значение дальше , тянет обратно, но лишь до линии уровня . Во время шага генератора дискриминатор фиксирован, поэтому такие подделки сдвигаются к границе решений, а для успешного обучения граница должна проходить через данные (раздел 3.2.1).
Наименьшие квадраты тянут далёкие подделки обратно
Дополнительный градиент возникает из-за формы обученного дискриминатора с вещественным выходом, который продолжает расти по мере удаления от границы, как линейный дискриминатор на рисунке. Оптимальный дискриминатор, найденный ниже без ограничений на класс функций, всюду лежит между и , и вдали от обоих распределений его квадратичная функция потерь тоже может выполаживаться.
Оптимальный дискриминатор и Пирсона. При фиксированном генераторе функцию потерь дискриминатора можно минимизировать поточечно, как в шаге 1. Подынтегральное выражение — парабола по с минимумом в точке (формула 5)
Добавим к функции потерь генератора слагаемое ; оно не зависит от и потому не меняет ни одного градиента. При , используя , получаем расширенную функцию потерь (формулы 4 и 6)
Выберем и , например , , (формула 8). Тогда , и числитель равен . Для смеси имеем и , поэтому
то есть строка Пирсона из таблицы f-GAN, где стоит на месте , а — на месте . Это повторяет тождество с JS для исходного GAN, которое сравнивает оба распределения с той же смесью через KL-дивергенции. равна нулю, только когда , то есть . Mao et al. записывают ту же величину как (формула 7), с опорной мерой в качестве первого аргумента. Для двух гауссиан с рисунка (значение для игрушечного примера, полученное численным интегрированием).
Кодирование 0–1 этим условиям не удовлетворяет: в нём , и , что при равно , а не . Тем не менее минимум достигается именно там. Подынтегральное выражение выпукло по , а при его производная по , , равна в каждой точке — это и есть условие оптимальности для выпуклой целевой функции при ограничении .
Сильные и слабые стороны#
Сильные стороны.
- Сэмплирование — один прямой проход генератора, а для обучения нужно только обратное распространение ошибки: ни марковских цепей, ни вывода латентных переменных во время обучения, ни вычислительно неразрешимых (intractable) интегралов (Goodfellow et al., 2014, раздел 6).
- Модель может представлять очень острые, даже вырожденные распределения (раздел 6). Ничто не усредняет правдоподобные изображения в размытое пятно, как это делает квадратичная ошибка гауссовского декодера.
- Та же игра допускает метки, другие дивергенции и другие функции потерь, как показывают расширения выше.
Слабые стороны.
- Нет плотности. У нет явного выражения (раздел 6), поэтому правдоподобие тестовых данных вычислить нельзя, и сравнивать по нему модели тоже нельзя. Две функции потерь не измеряют качество сэмплов, и ясного критерия остановки нет. Для оценки качества нужны метрики, вычисляемые по сэмплам; им посвящены заметка об Inception Score и следующие за ней.
- Нет обратного пути. Генератор отображает в , но ничто не отображает изображение обратно в его код. Чтобы найти код данного изображения, нужна оптимизация по или дополнительная сеть, обученная для этой цели.
- Неустойчивое обучение. Чередующиеся обновления могут колебаться, и двух игроков нужно держать в равновесии.
- Коллапс мод. Генератор может хорошо покрывать несколько мод и пропускать остальные.
- Запоминание (memorization). Генератор может воспроизводить обучающие изображения, поэтому сэмплы стоит сравнивать с ближайшими к ним обучающими изображениями. Radford et al. удалили дубликаты из своего самого большого обучающего набора, чтобы сделать запоминание менее вероятным (2016, раздел 4.1.1).
Ноутбук#
Ноутбук о GAN из репозитория HSE-LAMBDA Deep Generative Models (закреплённый коммит; ячейки нумеруются с 1, считая все ячейки подряд) реализует все три модели. В ноутбуке нет сохранённых выходов, поэтому он документирует процедуры, а не результаты.
- Ячейки 1–2: минимаксная целевая функция и список приёмов, которые использует ноутбук: одностороннее сглаживание меток, обрезка градиентов, дропаут в дискриминаторе, уменьшенная дисперсия латентной переменной при сэмплировании, сбалансированное соотношение числа обновлений и батч-нормализация в генераторе.
- Ячейки 5–16: безусловный GAN на изображениях цифры 0 из MNIST, приведённых к размеру и отмасштабированных в , размер батча 128 с
drop_last=True.- Ячейка 9: сети. Латентная переменная — не вектор, а пространственная сетка, 4 канала на сетке , и сэмплируется она внутри метода
forwardгенератора. КаждыйUpsampleBlockудваивает разрешение билинейной интерполяцией, а затем дважды применяет свёртку , батч-нормализацию и LeakyReLU(0.2). Три блока переводят в с 32, 64 и 128 каналами, а свёртка с Tanh даёт изображение. КаждыйDownsampleBlockприменяет свёртку с шагом 2 и свёртку , после каждой из которых идут батч-нормализация, LeakyReLU(0.2) иDropout2d(0.3), и три блока переводят в . Дискриминатор полностью свёрточный: последняя свёртка превращает карту в один логит. Строки документации (docstrings) говорят о четырёх блоках и о глобальном усреднении, но в коде три блока и никакого пулинга. В отличие от рекомендаций DCGAN, генератор использует LeakyReLU вместо ReLU и изменение размера со свёрткой вместо транспонированных свёрток, число каналов генератора с ростом разрешения растёт, а не уменьшается, а дискриминатор применяет батч-нормализацию сразу после первой свёртки. - Ячейка 10 задаёт гиперпараметры: шаг обучения для обеих сетей, 30 эпох, один шаг дискриминатора на шаг генератора (
update_ratio = 1), обрезка нормы градиента на уровне и одностороннее сглаживание меток . - Ячейка 11 даёт рекомендации по соотношению числа обновлений, изложенные в разделе о балансе двух игроков.
- Ячейка 12 строит сети и оптимизаторы: Adam с betas по умолчанию для и betas для , каждый со ступенчатым расписанием, которое уменьшает шаг обучения вдвое каждые 20 эпох.
- Ячейка 13 — цикл обучения с
binary_cross_entropy_with_logits. Функция потерь дискриминатора — среднее BCE на настоящих изображениях (целевое значение 0.9) и на отсоединённых от графа вычислений подделках (целевое значение 0); это с точностью до множителя и сглаживания. Функция потерь генератора — ненасыщающаяся BCE с меткой «настоящий». При этом сглаженное целевое значение используется и для генератора, так что точная функция потерь равна и минимальна при , а не . Планировщики шага обучения вызываются раз в эпоху. Каждые 5 эпох цикл сохраняет контрольную точку (checkpoint) вweights/, как и условный цикл из ячейки 23; ноутбук нигде не создаёт эту папку, поэтомуtorch.saveзавершается ошибкой, если её ещё нет. - Ячейки 14–16 строят графики функций потерь, сэмплируют сетку изображений и перечисляют распространённые приёмы: одностороннее сглаживание меток, случайное инвертирование меток, батч-нормализацию в обеих сетях, «избегание разреженных градиентов» (avoiding sparse gradients) с помощью log-sigmoid (это форма функций потерь через логиты), а также коллапс мод и средства против него: дискриминацию по мини-батчу, историю прежних генераторов и WGAN. Ячейка 15 при сэмплировании умножает латентную переменную на , поэтому сетка показывает генератор, применённый к априорному распределению с уменьшенной дисперсией, а не сэмплы из самого , — это похожее на усечение сужение априорного распределения; ячейки 25 и 33 делают то же самое для двух других моделей.
- Ячейка 9: сети. Латентная переменная — не вектор, а пространственная сетка, 4 канала на сетке , и сэмплируется она внутри метода
- Ячейки 17–26: условный GAN на CIFAR-100. Ячейка 19 задаёт размер батча 32, шаг обучения и betas Adam для обеих сетей, без расписания шага обучения, 30 эпох, сглаживание (снова и в целевом значении генератора) и обрезку градиентов на уровне . В ячейке 22 генератор переводит метку в эмбеддинг слоем
Embedding(100, 16)и переформирует его в один канал рядом с 4 каналами шума, а дискриминатор — слоемEmbedding(100, 1024), переформированным в один канал рядом с RGB-изображением. Блоки те же, что в ячейке 9, с дропаутом 0.3 в дискриминаторе. Ячейка 23 чередует один шаг дискриминатора и один шаг генератора. Ячейка 26 перечисляет, что даёт условие: контроль над классом, сэмплы, сосредоточенные на признаках своего класса, и разнообразие между классами. - Ячейки 27–33: f-GAN.
Activation_gиConjugate_f(ячейка 29) реализуют и из таблицы для"KLD","RKL","CHI","SQH","JSD"и"GAN"в том же соглашении: сопряжённая функция Пирсона равна .VLoss— среднее , аQLoss— среднее . Ячейка 31 выбирает JS и повторно использует сети безусловной модели: шаг обучения , Adam с betas по умолчанию для и для , 100 эпох, без обрезки, сглаживания и расписания. В ячейке 32 генератор максимизирует на сгенерированных сэмплах, а не минимизирует относящееся к подделкам слагаемое оценки; это ненасыщающийся суррогат из абзаца о шаге генератора, а прямая форма оставлена закомментированной альтернативой. Два замечания о реализации. Активация и сопряжённая функция вычисляются одна за другой обычнымиexpиlog. В 32-битной арифметике с плавающей точкой сопряжённые функции для JS и GAN возвращают , как только выход на подделке превышает примерно 17, потому что или округляется до , а активация GAN возвращает при ниже примерно , гдеexp(-v)переполняется. Композиции и избегают обеих проблем (сначала композиция, потом вычисление). Кроме того,loss_real.backward(retain_graph=True)сохраняет граф, который больше нигде не используется. - Ячейки 34–36: выбор размерности латентного пространства (100-мерный вектор или небольшая сетка , разрешение которой удваивает каждый слой повышения разрешения), сравнение транспонированных свёрток с повышением разрешения и последующей свёрткой, сравнение вариантов (исходный GAN, WGAN, LSGAN, f-GAN и условный GAN), основные трудности и средства против них (штрафы на градиент, развёрнутые GAN и несколько дискриминаторов против коллапса мод; сглаживание меток, сбалансированные шаги обучения и спектральная нормализация для устойчивости; Inception Score, FID и KID для оценки качества), практические советы и список достоинств и недостатков. Основной текст разбирает их в разделах «Обучение GAN на практике», «GAN наименьших квадратов» и «Сильные и слабые стороны»; KID разобран вместе с FID.
Дальше#
Рассуждение о непересекающихся носителях показало, что JS не даёт градиента, когда носители не пересекаются, даже если сэмплы генератора близки к данным. Следующая заметка заменяет её расстоянием, которое непрерывно уменьшается по мере сближения двух распределений, — расстоянием Вассерштейна.
Литература#
- I. Goodfellow, J. Pouget-Abadie, M. Mirza, B. Xu, D. Warde-Farley, S. Ozair, A. Courville, Y. Bengio. Generative adversarial nets. NeurIPS, 2014. Препринт arXiv:1406.2661.
- M. Arjovsky, L. Bottou. Towards principled methods for training generative adversarial networks. ICLR, 2017.
- T. Salimans, I. Goodfellow, W. Zaremba, V. Cheung, A. Radford, X. Chen. Improved techniques for training GANs. NeurIPS, 2016.
- M. Mirza, S. Osindero. Conditional generative adversarial nets. arXiv:1411.1784, 2014.
- S. Nowozin, B. Cseke, R. Tomioka. f-GAN: Training generative neural samplers using variational divergence minimization. NeurIPS, 2016.
- X. Nguyen, M. J. Wainwright, M. I. Jordan. Estimating divergence functionals and the likelihood ratio by convex risk minimization. IEEE Transactions on Information Theory, 56(11), 2010.
- I. Goodfellow. NIPS 2016 tutorial: Generative adversarial networks. arXiv:1701.00160, 2016.
- A. Radford, L. Metz, S. Chintala. Unsupervised representation learning with deep convolutional generative adversarial networks. ICLR, 2016. DCGAN; раздел 3: рекомендации по архитектуре; раздел 4: детали обучения.
- X. Mao, Q. Li, H. Xie, R. Y. K. Lau, Z. Wang, S. P. Smolley. Least squares generative adversarial networks. ICCV, 2017. Раздел 3.2: функции потерь, их преимущества и связь с χ² Пирсона.
- L. Metz, B. Poole, D. Pfau, J. Sohl-Dickstein. Unrolled generative adversarial networks. ICLR, 2017.
- I. Durugkar, I. Gemp, S. Mahadevan. Generative multi-adversarial networks. ICLR, 2017.
- A. Shrivastava, T. Pfister, O. Tuzel, J. Susskind, W. Wang, R. Webb. Learning from simulated and unsupervised images through adversarial training. CVPR, 2017. Раздел 2.3: история сгенерированных изображений для дискриминатора.
- M. Arjovsky, S. Chintala, L. Bottou. Wasserstein GAN. arXiv:1701.07875, 2017; ICML 2017.
- HSE-LAMBDA, репозиторий курса Deep Generative Models:
GANs.ipynb.