13 / 33 · GAN
Автоэнкодирующие GAN: состязательные автоэнкодеры и α-GAN
Как дать GAN энкодер, а VAE — чёткие сэмплы: состязательные автоэнкодеры заменяют слагаемое KL дискриминатором на кодах, α-GAN заменяет ещё и пиксельное правдоподобие дискриминатором изображений, сохраняя реконструкцию L1, α-WGAN обучает оба дискриминатора как критиков WGAN-GP; как обучать и оценивать четыре сети и почему латентную интерполяцию следует вести по сфере (slerp), а не по хорде (lerp).
Вариационные автоэнкодеры · Генеративно-состязательные сети · GAN Вассерштейна и ограничение Липшица
На этой странице 13
Заметка о StyleGAN закончилась управлением генерацией, но без пути обратно: чтобы найти код настоящего изображения, StyleGAN приходится решать задачу оптимизации. WGAN и рецепты масштабирования оставили на месте две более старые проблемы. Два семейства моделей, с которыми мы уже познакомились, решают каждое лишь половину задачи. У VAE есть энкодер, так что у каждого изображения есть код, а слагаемое реконструкции заставляет декодер учитывать каждое обучающее изображение; но его сэмплы размыты. У GAN сэмплы чёткие, но пути назад от изображения к его коду нет, и ничто не мешает генератору пропускать моды данных. Эта заметка объединяет оба подхода. Состязательный автоэнкодер (adversarial autoencoder) заменяет слагаемое KL в VAE дискриминатором на кодах. α-GAN заменяет ещё и пиксельное правдоподобие дискриминатором на изображениях, сохраняя слагаемое реконструкции , чтобы энкодер по-прежнему защищал от коллапса мод (mode collapse). α-WGAN обучает оба дискриминатора как критиков WGAN-GP.
Обозначения. — изображение, — распределение данных, как в заметке о WGAN. — код с априорным распределением . Энкодер — детерминированная сеть, — код изображения , генератор (декодер) отображает коды в изображения, — реконструкция , а при — сэмпл. Агрегированное апостериорное распределение (aggregate posterior) — это распределение при . — дискриминатор изображений, — дискриминатор кодов. Обе сети выдают вещественное число — своё значение (score). Это логит, когда их обучают как классификаторы, так что — вероятность того, что — настоящее изображение ( — логистическая сигмоида; в заметке о GAN обозначало саму эту вероятность), и значение критика, когда их обучают с функцией потерь Вассерштейна. Для «настоящий» означает «взятый из априорного распределения». ; реализации обычно не суммируют по пикселям, а усредняют, что лишь меняет масштаб веса слагаемого реконструкции.
Чего не хватает каждому семейству#
VAE обучает энкодер и декодер на ELBO — слагаемом реконструкции минус слагаемое KL (заметка о VAE):
У каждого слагаемого есть цена и польза.
- Слагаемое правдоподобия с гауссовским декодером — это квадратичная ошибка. Если одному коду соответствует несколько правдоподобных изображений, её оптимум — их среднее, а оно размыто (заметка о VAE). Польза этого слагаемого — давление в сторону покрытия: каждое обучающее изображение должно восстанавливаться из своего кода, и это мешает модели игнорировать части данных. Это не гарантия: конечная обученная модель всё равно может плохо покрыть какие-то области данных, а степень размытости зависит от правдоподобия декодера и от того, насколько изображение неопределённо при данном коде.
- Слагаемое KL взимает с каждого изображения плату за информативный код. В среднем по данным оно распадается на взаимную информацию (mutual information) между изображениями и кодами, которая для хорошей реконструкции должна быть большой, и KL-дивергенцию агрегированного апостериорного распределения относительно априорного, которая для сэмплирования должна быть малой (заметка о VAE). Для генерации полезна только вторая часть.
GAN обходится без обоих слагаемых. Его дискриминатор смотрит на изображения целиком, поэтому размытость легко заметить, и сэмплы получаются чёткими. Но у GAN нет энкодера: он не может реконструировать изображение, найти его код или интерполировать между двумя настоящими изображениями. И у GAN нет ограничения на реконструкцию каждого примера: ничто не привязывает генератор к каждому обучающему изображению. Его идеальная целевая функция на уровне распределений, JS при оптимальном дискриминаторе, штрафует за пропущенную массу, но чередующаяся игра этот идеал не обеспечивает, поэтому генератор может свестись к нескольким модам. С ненасыщающейся функцией потерь (non-saturating loss) и оптимальным дискриминатором ожидаемый градиент генератора содержит обратную KL (reverse KL), которая сильно наказывает сэмплы, похожие на подделку, и лишь слабо — пропущенные моды (заметка о GAN). Функция потерь Вассерштейна из предыдущей заметки меняет градиент, но не добавляет энкодер, и генератор по-прежнему учится только через значения критика на собственных сэмплах, так что ничто не привязывает его к каждому обучающему изображению.
Модели ниже сохраняют энкодер VAE и его слагаемое реконструкции, а проблемные части ELBO передают дискриминаторам: сначала слагаемое KL, затем правдоподобие.
Состязательные автоэнкодеры: дискриминатор на кодах#
Состязательный автоэнкодер (AAE) Makhzani et al. (2015) — это обычный автоэнкодер, к коду которого присоединена третья сеть. Распределение кодов, которое он формирует, — агрегированное апостериорное распределение (формула 1),
которое для детерминированного энкодера — просто распределение . На каждом мини-батче обучение чередует две фазы (раздел 2).
-
Фаза реконструкции. и минимизируют ошибку реконструкции, в экспериментах статьи — квадратичную ошибку: .
-
Фаза регуляризации. Дискриминатор кодов учится помечать сэмплы из априорного распределения как настоящие, а коды — как подделки,
а затем энкодер, который играет роль генератора в этом маленьком GAN, обновляется так, чтобы его обмануть, например с ненасыщающейся функцией потерь .
Что сопоставляет дискриминатор кодов#
видит по одному коду за раз, вперемешку с кодами других изображений, и никогда не узнаёт, из какого изображения получен код. Поэтому он сравнивает с априорным распределением всё облако кодов: с , а не код каждого изображения с априорным распределением. Его оптимум следует из рассуждения об оптимальном дискриминаторе из заметки о GAN, применённого к кодам: , а в терминах значения это логарифм отношения плотностей:
С минимаксной функцией потерь и оптимальным энкодер минимизирует — по той же подстановке, что и в заметке о GAN. По сравнению с VAE, AAE сохраняет ту часть слагаемого KL, которая нужна для сэмплирования, — расхождение между и , измеряемое здесь через JS, а не через KL, — и отбрасывает часть, которая штрафует информативные коды. Makhzani et al. проводят то же сравнение: они записывают усреднённое слагаемое KL в VAE как кросс-энтропию между и минус среднюю энтропию апостериорных распределений и заменяют оба слагаемых состязательной игрой (раздел 2.1, формула 2).
Отсюда следуют три вещи.
- Подходит любое априорное распределение, из которого можно сэмплировать. Замкнутой формуле для KL в VAE нужна плотность априорного распределения; дискриминатору достаточно сэмплов из него. Статья накладывает на коды MNIST смесь десяти двумерных гауссиан и «швейцарский рулет» (Swiss roll; разделы 2.1 и 2.3).
- Меньше дыр. С двумерным гауссовским априорным распределением на MNIST коды отложенных (held-out) изображений заполняют априорное распределение без пробелов, тогда как VAE с той же архитектурой оставляет области, куда не кодируется ни одно изображение (рисунок 2). Дыры в — это места, где сэмплы из априорного распределения плохо декодируются.
- Детерминированного энкодера достаточно — в определённых пределах. Авторы пробовали детерминированный энкодер, гауссовский и энкодер с шумом на входе, получили близкие значения правдоподобия на тестовых данных и поэтому приводят результаты для детерминированного (раздел 2). Его единственный источник случайности — данные, и для конечной обучающей выборки — облако точек. Поэтому авторы рекомендуют размерность кода, близкую к внутренней размерности (intrinsic dimension) данных (от 5 до 8 для MNIST, от 10 до 20 для лиц и номеров домов), а для гораздо больших кодов — гауссовский энкодер (приложение A.1).
AAE поддерживает также классификацию с частичной разметкой (semi-supervised) и кластеризацию: для этого к категориальной части кода присоединяется второй дискриминатор (разделы 5–6). Здесь мы рассматриваем только его генеративное применение.
Почему дискриминатор, а не штраф на моменты? Более дешёвый способ подтянуть коды к — штрафовать средние и дисперсии каждой координаты по батчу. Rosca et al. (2017) попробовали именно это вместо дискриминатора кодов (приложение D). Штраф приблизил средние координат к нулю, но координаты остались сильно коррелированными, поскольку покоординатный штраф не видит корреляций; дискриминатор, который видит векторы кодов целиком, давал декоррелированные коды.
Чего AAE не меняет, так это обучающего сигнала декодера. по-прежнему учится только на пиксельной ошибке реконструкции, поэтому его выходы страдают тем же усреднением, что и у декодера VAE.
α-GAN: дискриминатор ещё и на изображениях#
Rosca et al. (2017) снова начинают с ELBO и заменяют каждое его слагаемое тем, что может оценить дискриминатор (раздел 3).
- Слагаемое KL превращается в дискриминатор кодов, как в AAE: — математическое ожидание значения классификатора, оптимум которого равен логарифму отношения (формула 6). Поскольку сравнивает агрегированное с , оценивается маргинальная KL (marginal KL) — та часть, которую мы выделили выше.
- Для слагаемого правдоподобия есть два кандидата (формула 7). Первый — явное правдоподобие Лапласа, , отрицательный логарифм которого — функция потерь реконструкции , , плюс константа. Второй — синтетическое правдоподобие (synthetic likelihood): значение дискриминатора изображений, обученного отличать данные от декодированных изображений; оно велико, когда декодированное изображение выглядит настоящим.
Два кандидата ошибаются противоположным образом. Дискриминатор даёт чёткие изображения, но, как в любом GAN, допускает коллапс мод. Слагаемое отводит массу каждому обучающему изображению, но размывает: для каждого пикселя его оптимум — медиана правдоподобных значений, тогда как у квадратичной ошибки — их среднее. α-GAN использует оба кандидата с весами (формула 8). В записи через значения и с детерминированным энкодером и максимизируют
Метод дополняют два практических изменения (раздел 3, «Improved techniques»).
-
Состязательная функция потерь и — значение со знаком минус. Обозначим значение через , а вероятность, которую выдаёт классификатор, через . Поскольку ,
Левая часть — функция потерь, которую Rosca et al. используют для обоих генераторов своей игры (алгоритм 1, и ), а правая показывает, что это просто логит со знаком минус. Её производная по логиту равна при любом , поэтому она никогда не насыщается: при минимаксная функция потерь даёт производную по логиту, а ненасыщающаяся — (заметка о GAN). При оптимальном классификаторе логит равен , где — распределение подделок, так что математическое ожидание функции потерь на подделках равно — обратной KL.
-
Сэмплы — тоже подделки. Дискриминатор изображений получает в качестве подделок не только реконструкции, но и сэмплы , ; с обоими видами справляется один дискриминатор. Rosca et al. обосновывают это неравенством Йенсена, , правая часть которого содержит декодированные сэмплы из априорного распределения, и, как и прежде, заменяют это правдоподобие синтетическим.
Четыре функции потерь#
Каждая сеть минимизирует свою функцию потерь при фиксированных остальных (алгоритм 1, формулы 11, 13, 15 и 17, здесь записанные через значения):
- Энкодер должен строить коды, из которых может восстановить изображение и которые дискриминатор кодов принимает за сэмплы из априорного распределения.
- Генератор должен восстанавливать изображение по его коду и делать так, чтобы и реконструкции, и сэмплы казались настоящими.
- Дискриминатор изображений отделяет данные от подделок обоих видов, а дискриминатор кодов — сэмплы из априорного распределения от кодов; оба используют обычную бинарную кросс-энтропию из заметки о GAN.
Что оценивает оценка дискриминатора изображений. учитывает настоящие изображения один раз и каждый из двух видов подделок тоже один раз, так что подделки весят вдвое больше. Поточечный оптимум тогда равен , где и — распределения реконструкций и сэмплов. Через их смесь с равными весами оптимальный логит равен , а не сбалансированному из пункта 1 выше. Сдвиг постоянен, поэтому градиенты, которые получают и , он не меняет, но сдвигает оценки и вероятности: когда подделки обоих видов совпадают с данными, , а не . α-WGAN ниже уравновешивает стороны иначе — множителем 2 при слагаемом на настоящих данных.
В экспериментах перебирали по значениям 1, 5, 10 и 50 отдельно для энкодера и для генератора, с весом 1 у обоих состязательных слагаемых (приложение H.1). Энкодер и генератор обновлялись дважды на одно обновление двух дискриминаторов (раздел 6). Все модели использовали Adam с и батчами по 64, а дискриминатор кодов был трёхслойным MLP с 750 нейронами в слое (приложение H).
Зачем нужны все три части#
Допустим, оба условия согласования выполнены точно: коды распределены как априорное распределение, , и каждое изображение восстанавливается, при . Тогда для величина распределена так же, как при , поскольку и одинаково распределены и к обоим применяется одна и та же функция . Это распределение и есть . Значит, сэмплы распределены как данные. Первое условие обеспечивает дискриминатор кодов, второе — слагаемое реконструкции, а поскольку оба выполняются лишь приближённо, дискриминатор изображений к тому же проверяет сэмплы напрямую.
То же рассуждение показывает, что предотвращает каждое слагаемое.
- Коллапс мод. Генератор, сведшийся к нескольким модам, не смог бы восстанавливать изображения из остальных мод, и слагаемое было бы большим. Rosca et al. приводят это как причину, по которой слагаемое реконструкции препятствует коллапсу мод (раздел 3, после формулы 9).
- Размытость. Реконструкции проверяет , поэтому усреднённую реконструкцию легко отвергнуть, и подталкивается к чёткому изображению, близкому к по , а не равному попиксельной медиане. Баланс задаёт вес .
- Дыры. Без дискриминатора кодов коды могли бы занимать любую область , и сэмплы из априорного распределения попадали бы туда, где ничему не научился, — это провал обычного автоэнкодера.
На ColorMNIST, CelebA и CIFAR-10 α-GAN был сопоставим с DCGAN (Radford, Metz and Chintala, 2016), WGAN-GP и AGE — моделью на основе автоэнкодера (Ulyanov, Vedaldi and Lempitsky, 2017), — но превосходил их не во всём. Независимый критик Вассерштейна, обученный на отложенных данных, поставил WGAN-GP на первое место на всех трёх наборах данных; на CIFAR-10 α-GAN получил лучший Inception Score, вычисленный сетью, обученной на ImageNet, при большом разбросе по гиперпараметрам (раздел 6, рисунки 2 и 5). Его реконструкции были лучше, чем у AGE (приложение C). Самым решающим фактором из всех авторы сочли архитектуры.
α-WGAN: два критика Вассерштейна#
Функции потерь и выше уже имеют вид значения со знаком минус, а это ровно вид функции потерь генератора WGAN (заметка о WGAN). От варианта Вассерштейна α-GAN отличается только обучением дискриминаторов. Kwon, Han and Kim (2019) сохраняют функции потерь энкодера и генератора и обучают и , и как критиков Вассерштейна со штрафом на градиент (gradient penalty); модель они называют 3D-α-WGAN-GP. Их функции потерь (раздел 2, формулы 1–3; функция потерь энкодера приведена в тексте), где — вес штрафа, имеют вид
Штрафы — те же, что в WGAN-GP, и вычисляются в случайных точках между настоящими входами и подделками:
Здесь лежит между настоящим изображением и поддельным , а — между сэмплом из априорного распределения и кодом, причём сэмплируется для каждого примера отдельно; тильда заменяет крышку из заметки о WGAN, потому что здесь крышка обозначает реконструкцию. Kwon et al. используют .
α-WGAN: энкодер, генератор и два критика
- Реконструкция. кодирует , декодирует код, и обучает обе сети.
- Сэмплирование. Тот же декодирует сэмплы из априорного распределения в новые изображения.
- Критик кодов. — функция потерь критика WGAN на кодах, где роль настоящего распределения играет априорное, поэтому без штрафа оценивает — с оговорками о константе Липшица критика из заметки о WGAN. Слагаемое энкодера сдвигает коды туда, где критик принимает их за сэмплы из априорного распределения.
- Критик изображений. — это две функции потерь критика WGAN с общим критиком, ; слагаемое на настоящих данных входит в оба сравнения, отсюда множитель 2. Обозначим через и распределения реконструкций и сэмплов. Два слагаемых на подделках вместе равны по их смеси с равными весами , так что наилучшее по 1-липшицевым критикам значение без штрафа равно , а оно в силу выпуклости не больше .
и оптимизируются как одна сеть по сумме (раздел 2, «Training»). Каждое слагаемое доходит до тех сетей, от которых зависит:
| Слагаемое | Обучает | Чего требует |
|---|---|---|
| и | каждое изображение восстанавливается по своему коду | |
| , а через и | реконструкции выглядят настоящими | |
| сэмплы выглядят настоящими | ||
| коды похожи на сэмплы из априорного распределения |
Вторая строка отличается от алгоритма 1 α-GAN, где в функции потерь энкодера нет слагаемого на изображениях; при суммарной функции потерь градиент попадает и в энкодер.
Зачем критик Вассерштейна и для кодов? В начале обучения коды детерминированного энкодера могут лежать далеко от априорного распределения, сосредоточившись в небольшой области. Тогда классификатор легко их отделяет, и его логит вокруг кодов может стать плоским — это та ситуация, с которой начиналась заметка о WGAN, — а липшицев критик сохраняет наклон с нормой около 1, направляющий коды к априорному распределению. Разобранный пример ниже сравнивает их, когда распределения перекрываются: градиент классификатора уменьшается вместе со сдвигом, а градиент критика — нет. Kwon et al. обосновывают это изменение неустойчивостью своей модели с функциями потерь классификатора.
Их приложение — трёхмерные МРТ-снимки мозга размером вокселей; все четыре сети обучались с Adam с шагом обучения (learning rate) , батчами по 4 и двумя обновлениями генератора на шаг (разделы 2 и 4). Со 100-мерными кодами модель коллапсировала; лучше всего работали 1000-мерные коды. У её сэмплов было наименьшее среди сравниваемых моделей максимальное среднее расхождение (maximum mean discrepancy, MMD) с данными и попарный MS-SSIM 0.829 против 0.846 у настоящих снимков, тогда как базовая WGAN-GP дала 0.996 — признак почти одинаковых сэмплов (таблица 1).
Разобранный пример: критик кодов в одном измерении#
Игрушечный пример показывает, что сообщают энкодеру два вида критика кодов. Возьмём , априорное распределение и предположим, что каждый код сдвинут на , так что .
Критик-классификатор (α-GAN). Оптимальное значение — логарифм отношения двух плотностей,
Его среднее по кодам равно , как и должно быть для KL между гауссианами с единичной дисперсией, средние которых отличаются на . Функция потерь энкодера равна , и при фиксированном критике её производная по сдвигу кодов равна — в точности . По мере приближения кодов к априорному распределению этот градиент убывает вместе с : при он равен .
Критик Вассерштейна (α-WGAN). Здесь , а — оптимальный 1-липшицев критик: . Его градиент всюду имеет норму 1, поэтому штраф равен нулю, и . Функция потерь энкодера имеет производную 1 по при любой величине сдвига: критик толкает коды с одной и той же силой, пока они не окажутся в центре.
Обучение: четыре сети, три оптимизатора#
Один шаг обучения состоит из двух частей.
- Энкодер и генератор. Одно обновление и по при фиксированных и .
- Критики. Обновления по и по . Реконструкции, сэмплы и коды входят в эти функции потерь как константы, так что шаги критиков не сдвигают и .
Соотношение между двумя частями — дело выбора. WGAN-GP делает шагов критика на шаг генератора, чтобы критик оставался близким к оптимальному; α-GAN, наоборот, обновлял энкодер и генератор дважды на шаг дискриминаторов, а Kwon et al. дважды обновляли генератор. Каждый шаг критика должен получать новый мини-батч настоящих данных, как в алгоритме WGAN-GP.
Зачем отдельные оптимизаторы? Каждый игрок минимизирует свою функцию потерь, и эти функции тянут в противоположные стороны. Допустим, и сложили и стали оптимизировать все параметры вместе. Тогда градиент по параметрам был бы равен
если не учитывать штраф: слагаемые на подделках сокращаются, и критик научился бы лишь повышать своё значение на настоящих данных. Поэтому у каждой функции потерь свой оптимизатор по своим параметрам: один для и вместе, которые минимизируют одну суммарную функцию потерь, один для и один для . Отдельные оптимизаторы позволяют также задавать разные шаги обучения; Rosca et al. перебирали шаги обучения отдельно для генератора и энкодера и для двух дискриминаторов (приложение H, таблица 2).
Расписание шага обучения и ранняя остановка#
Распространённое расписание — косинусный отжиг с тёплыми перезапусками (cosine annealing with warm restarts; Loshchilov and Hutter, 2017, формула 5). Внутри -го цикла длиной шаг обучения убывает от до по половине периода косинуса,
где — число эпох, прошедших с последнего перезапуска; затем шаг скачком возвращается к , а следующий цикл в раз длиннее. При эпох, , , и одном обновлении за эпоху циклы длятся 10, 20 и 40 эпох, перезапуски приходятся на начало эпох 11, 31 и 71, а шаг обучения в течение эпохи 10 равен . Перезапуски позволяют обучению покинуть плохую область, но временно ухудшают качество, как отмечают Loshchilov и Hutter (раздел 3).
Ранняя остановка завершает обучение, когда валидационная величина не улучшается заданное число эпох — терпение (patience), — и сохраняет лучшую контрольную точку (checkpoint). Для автоэнкодирующего GAN труднее всего выбрать саму величину.
- Ошибка реконструкции на отложенных изображениях — осмысленное и стабильное число, но оно измеряет автоэнкодер, а не сэмплы: в одном запуске реконструкции могут продолжать улучшаться, пока сэмплы коллапсируют, или наоборот.
- Сырые состязательные оценки, например слагаемое генератора , не годятся. Оценки критика содержат произвольный аддитивный сдвиг, который дрейфует по мере обучения критика, поэтому их значения нельзя сравнивать между эпохами. Разность оценок на настоящих и поддельных данных этот сдвиг сокращает: при одинаково ограниченном критике, обученном близко к оптимуму, разрыв WGAN можно отслеживать в пределах одного запуска с оговорками из заметки о WGAN, хотя между запусками с разными критиками он по-прежнему несравним.
- С тёплыми перезапусками терпение короче следующего цикла может остановить запуск сразу после перезапуска. В примере выше лучшее значение на эпохе 10 при терпении 10 останавливает обучение на эпохе 20, когда шаг обучения второго цикла всё ещё равен .
- Данные, по которым выбирается контрольная точка, должны быть валидационной выборкой, а не тестовой, на которой сообщаются результаты.
Что отслеживать и как оценивать#
Четыре сети могут отказать по отдельности, поэтому каждое слагаемое функций потерь логируется отдельно: ошибка реконструкции, три состязательных слагаемых, две функции потерь критиков и два штрафа. Статистики градиентов по сетям — нормы или гистограммы — показывают, когда градиенты одного из игроков затухают или взрываются. Копировать каждый градиент с GPU после каждого шага дорого, поэтому такие статистики обычно логируют с интервалом.
Автоэнкодирующий GAN проверяют с трёх сторон.
- Реконструкции отложенных изображений, показанные рядом с оригиналами, проверяют и как автоэнкодер.
- Сэмплы из априорного распределения проверяют вместе с согласованием кодов. Их оценивают метриками из заметок об оценке качества, такими как Inception Score и FID. Rosca et al. также обучали независимого критика WGAN-GP отличать отложенные данные от сэмплов (раздел 5).
- Интерполяции между кодами двух настоящих изображений проверяют пространство между кодами — этому посвящён следующий раздел.
Латентная интерполяция: lerp или slerp?#
Энкодер позволяет пройти от одного настоящего изображения к другому: закодировать их, и , двигаться по пути от к и декодировать . Плавная последовательность изображений говорит о том, что модель упорядочила пространство кодов, а не запомнила обучающую выборку. Простейший путь — линейная интерполяция (linear interpolation, lerp),
Сферическая линейная интерполяция (spherical linear interpolation, slerp) идёт вместо этого по большому кругу. Если — угол между и , , то
Эта формула пришла из анимации вращений (Shoemake, 1985); White (2016) предложил её для латентных пространств генеративных моделей. Когда и имеют одинаковую длину , каждая точка пути имеет длину . Формула перестаёт работать, когда близок к нулю, а это бывает в двух разных случаях. Если векторы почти параллельны (), реализации переходят на lerp: при коэффициенты slerp стремятся к и , так что lerp — приближение для малых углов с точностью до второго порядка по , а не тот же путь. Если они почти противоположны (), большая окружность не единственна, а lerp прошёл бы рядом с началом координат; тогда путь нужно выбрать явно, например через направление, ортогональное , либо сообщить о вырожденной паре или пересэмплировать её.
Почему разница важна. В высокой размерности сэмплы лежат в тонкой оболочке: квадрат их длины имеет среднее и дисперсию , так что длина близка к с разбросом около (Многомерное нормальное распределение). При средняя длина равна . Кроме того, два независимых сэмпла почти ортогональны: косинус угла между ними имеет среднее 0 и стандартное отклонение , около . Их середина по lerp — сумма независимых гауссовских векторов, распределённая как , поэтому её длина близка к (среднее , разброс ). При априорном распределении квадрат длины не больше имеет вероятность : середина лежит на стандартного отклонения ближе к центру, чем оболочка, в области, которую обучение на почти никогда не посещает. Вдоль всего пути средний квадрат длины равен и минимален в середине. Slerp между двумя почти ортогональными векторами держит длину между и : при квадрат длины точки пути равен .
Линейная интерполяция уходит внутрь оболочки, сферическая — нет
Разобранный пример. В двух измерениях возьмём и . Середина по lerp — точка длины . Для slerp , и оба коэффициента при равны , так что середина — точка длины 3. В двух измерениях укорочение — лишь иллюстрация, поскольку случайные пары не ортогональны, а оболочка не тонкая. В 128 измерениях почти каждая пара близка к ортогональной, а оболочка тонкая, так что тот же множитель выводит из неё почти каждую середину по lerp.
Для автоэнкодирующего GAN концы пути — коды настоящих изображений, а не сэмплы из априорного распределения. Если критик кодов согласовал с априорным распределением, то длины кодов типичны для априорного распределения, коды не связанных между собой изображений почти ортогональны, и рассуждение переносится; коды похожих изображений близки по углу, и тогда два пути почти совпадают. Slerp лишь сохраняет типичную длину. Он не гарантирует, что путь обходит области, где в есть дыры; White называет их мёртвыми зонами (dead zones) и предлагает держаться вблизи кодов отложенных данных (раздел 2.3).
Что изменилось#
| WGAN-GP | AAE | α-GAN | α-WGAN | |
|---|---|---|---|---|
| Сети | , критик | , , | , , , | , , , |
| Энкодер | нет | детерминированный или гауссовский | детерминированный или неявный | детерминированный |
| Чем коды согласуются с априорным распределением | — | классификатором на кодах | классификатором на кодах | критиком WGAN-GP на кодах |
| Пиксельное слагаемое | нет | квадратичная ошибка | ||
| Что видит дискриминатор изображений | сэмплы | — | реконструкции и сэмплы | реконструкции и сэмплы |
| Состязательная функция потерь , | обмануть на кодах | логит со знаком минус | значение критика со знаком минус | |
| Защита от коллапса мод | нет | реконструкция | реконструкция | реконструкция |
| Восстанавливает и интерполирует настоящие изображения | нет | да | да | да |
Ограничения#
- Много движущихся частей. Четыре сети, три оптимизатора, веса и , соотношения обновлений и шаги обучения влияют друг на друга. Rosca et al. обнаружили, что все протестированные ими модели чувствительны к архитектурам, причём незначительные изменения приводили к катастрофическому коллапсу мод (раздел 6).
- Нет выигрыша в качестве сэмплов во всех случаях. В их переборах независимый критик ставил WGAN-GP выше α-GAN на всех трёх наборах данных; за энкодер и покрытие приходится платить настройкой.
- Вес реконструкции — компромисс. Большое возвращает в реконструкции размытость пиксельной функции потерь; малое ослабляет защиту от коллапса мод.
- Распределение кодов согласуется лишь приближённо. При детерминированном энкодере и конечной обучающей выборке — облако точек, поэтому отношение плотностей и KL, которые оценивает классификатор, существуют только для его сглаженной версии, и дыры остаются возможны. Советы о размере кода расходятся: статья об AAE рекомендует для детерминированных энкодеров размерность кода около внутренней размерности данных, а Kwon et al. понадобилось 1000 измерений, чтобы избежать коллапса.
- Штраф на градиент и батч-нормализация. Штраф вычисляется для каждого примера отдельно, а батч-нормализация (batch normalization) в критике делает каждый выход зависящим от всего батча, поэтому WGAN-GP не рекомендует её использовать (Gulrajani et al., 2017, раздел 4). Kwon et al. тем не менее использовали батч-нормализацию в своих критиках.
- Оценка остаётся косвенной. Правдоподобия по-прежнему нет, ошибка реконструкции измеряет только автоэнкодер, а функции потерь критиков нельзя сравнивать между эпохами или моделями.
Итоги#
- У VAE есть энкодер, и он покрывает данные, но размывает изображения; GAN даёт чёткие сэмплы, но не имеет энкодера и может пропускать моды. Автоэнкодирующие GAN сохраняют энкодер и слагаемое реконструкции, а проблемные части ELBO заменяют дискриминаторами.
- Состязательный автоэнкодер заменяет слагаемое KL дискриминатором на кодах. Он согласует агрегированное апостериорное распределение с априорным — ту часть KL, которая нужна для сэмплирования, — и требует от априорного распределения только сэмплов.
- α-GAN заменяет ещё и пиксельное правдоподобие дискриминатором изображений, который видит реконструкции и сэмплы, и сохраняет . Состязательная функция потерь и — логит со знаком минус. Согласованные коды вместе с точной реконструкцией сделали бы распределение сэмплов равным распределению данных; слагаемое реконструкции препятствует коллапсу мод.
- α-WGAN обучает оба дискриминатора как критиков WGAN-GP и оптимизирует и по одной суммарной функции потерь, с .
- Обучению нужны отдельный оптимизатор для каждого игрока, стабильный валидационный сигнал (ошибка реконструкции на отложенных данных, поскольку значения критиков несравнимы во времени) и три проверки: реконструкции, сэмплы и интерполяции.
- Интерполировать следует по slerp: в измерениях сэмплы из априорного распределения имеют длину около , а середина по lerp между двумя из них — длину около , вне оболочки, на которой обучался генератор.
Ноутбук#
Ноутбук об α-WGAN из репозитория HSE-LAMBDA Deep Generative Models обучает α-WGAN на CIFAR-10 (ячейки нумеруются с 1, считая все ячейки подряд, включая текстовые). Сохранённых выходов в нём нет, поэтому он документирует процедуру, а не результаты.
- Ячейки 1–4: подготовка. Ячейка 1 описывает план ноутбука. Ячейка 3 запускает эксперимент Comet.ml с проектом, рабочим пространством и API-ключом, считанными из локального
cfg.yaml; глобальная переменнаяexperimentиспользуется затем внутриsave_checkpointиtrain_alphawgan, так что без учётной записи Comet ноутбук не запустится, если не убрать эти вызовы. Ячейка 4 импортирует библиотеки и выбирает CUDA, Apple MPS или CPU. - Ячейки 5–6: данные. Обучающая (50 000 изображений) и тестовая (10 000) части CIFAR-10, приведённые от к и отмасштабированные в ; размер батча 128, обучающий загрузчик перемешивает данные, так что в эпохе 391 батч, последний — из 80 изображений. Повышение разрешения не добавляет деталей, но учетверяет стоимость каждой свёртки.
- Ячейки 7–8: строительные блоки. Ячейка 7 перечисляет четыре сети и показывает схему архитектуры. Ячейка 8 определяет
ChannelsToLinear(вытягивание в вектор, затем линейный слой),LinearToChannels2d(линейный слой, выход которого переформатируется в карты признаков) иResBlock: две свёртки с батч-нормализацией, нормальная инициализация Ксавье (Xavier-normal) и прибавление входа перед последней активацией. - Ячейки 9–12: энкодер и генератор. Энкодер — свёртка , три усредняющих пулинга (), чередующихся с остаточными блоками, и линейное отображение в код размера без выходной активации. Генератор устроен зеркально: линейное отображение в карты признаков , три повышения разрешения методом ближайшего соседа с остаточными блоками, свёртка в RGB и tanh. При
base_channels = 256из ячейки 24 вытянутые признаки содержат элемента; комментарии в коде приводят числа для 128 каналов по умолчанию. - Ячейки 13–14: критики.
ImageDiscriminatorустроен как энкодер, с LeakyReLU(0.2) и одним выходом; его остаточные блоки содержат батч-нормализацию.CodeDiscriminator— MLP с LeakyReLU(0.2), без нормализации и с инициализацией Ксавье; у Rosca et al. было 750 нейронов. - Ячейка 15:
gradient_penalty. Одно на пример, распространяемое (broadcasting) на остальные измерения; интерполяции, отсоединённые от графа и помеченные как требующие градиентов;autograd.gradсcreate_graph=True; норма для каждого примера и . Одна и та же функция служит и для изображений, и для кодов. - Ячейки 16–17: класс
AlphaWGAN.sample_priorсэмплирует ;rec_loss— средняя абсолютная ошибка по всем пикселям, так что умножает среднее по пикселям (по умолчанию в классе 40, в ячейке 24 задано 10).autoencoder_lossвозвращает , и ;discriminator_loss— функцию потерь WGAN для на настоящих изображениях против отсоединённых сэмплов плюс ;code_discriminator_loss— функцию потерь WGAN для на сэмплах из априорного распределения против отсоединённых кодов плюс .forwardкодирует, генерирует, сэмплирует (если передано целое число) или реконструирует. - Ячейки 18–22: вспомогательные функции обучения.
save_checkpointсохраняет веса и логирует их в Comet;evaluate_alphaganусредняет три слагаемых энкодера и генератора по загрузчику в режиме оценки (evaluation mode) без градиентов;EarlyStoppingхранит контрольную точку с наименьшим значением отслеживаемой функции потерь и останавливает обучение послеpatienceэпох без улучшения;visualize_samplesдекодирует сэмплы из априорного распределения.train_alphawganсоздаёт три оптимизатора AdamW (энкодер и генератор вместе, , ) и три планировщикаCosineAnnealingWarmRestartsс и , которые делают шаг раз в эпоху. На каждом батче выполняется один шаг энкодера и генератора по сумме трёх слагаемых, затемn_criticраундов из одного шага и одного шага на том же батче настоящих данных; после каждого обратного прохода в Comet логируется гистограмма градиента каждого параметра только что обновлённых сетей. В конце каждой эпохи функции потерь усредняются, модель оценивается на тестовой части, логируются метрики и рисунок с сэмплами, каждыеcheckpoint_everyэпох сохраняется контрольная точка, и применяется ранняя остановка с терпением 10 по валидационной функции потерь реконструкции. - Ячейки 23–29: конфигурация и запуск. ,
base_channels = 256, , ; ячейка 26 загружаетcheckpoints/checkpoint_best.pth, если файл существует (только веса, так что оптимизаторы и планировщики начинают с нуля). Обучение длится до 100 эпох с шагом обучения , betas , и контрольной точкой каждые 10 эпох (вместо значений функции по умолчанию и 3 раундов критика); ячейка 28 логирует гиперпараметры. Расписание даёт циклы в 10, 20 и 40 эпох, вычисленные в основном тексте, с перезапусками на эпохах 11, 31 и 71. - Ячейки 30–36: оценка.
visualize_reconstructionsпоказывает 16 тестовых изображений над их реконструкциями; ячейки 32–33 строят графики валидационной и обучающей функций потерь реконструкции (умноженных на , без подписей осей и легенды); ячейка 34 заново загружает лучшую контрольную точку; ячейки 35–36 показывают 16 сэмплов и реконструкции. - Ячейки 37–39: интерполяция.
slerpреализует формулу выше на ненормированных кодах, с углом, вычисленным по их направлениям, и переходом к lerp при ;lerp— прямая линия.interpolate_latentкодирует первыеnum_imagesизображений батча и декодирует 7 равноотстоящих точек между каждыми двумя последовательными кодами. Ячейка 39 берёт первые четыре тестовых изображения (тестовый загрузчик не перемешивает данные) и даёт три ряда по семь изображений со slerp;method="lerp"переключает на прямую линию.
Проблемы.
- Реконструкции не доходят до критика изображений.
discriminator_lossсравнивает настоящие изображения только с сэмплами , а вautoencoder_lossнет слагаемого . И α-GAN (алгоритм 1), и α-WGAN (Kwon et al., формулы 1–2) считают реконструкции подделками. В нынешнем виде реконструкции обучаются только слагаемым , поэтому сохраняют его усреднение, а модель — это состязательный автоэнкодер с дополнительным критиком на сэмплах. Полная версия добавляетD(x_rec.detach())в функцию потерь критика, удваивая вес слагаемого на настоящих данных, и — в функцию потерь энкодера и генератора. - Текстовая ячейка 16 утверждает, что состязательные функции потерь — бинарные кросс-энтропии; код использует функции потерь Вассерштейна со штрафами на градиент. Строка документации (docstring)
train_alphawganупоминает обрезку градиентов, которой в коде нет. - Батч-нормализация в критике изображений противоречит штрафу на градиент, вычисляемому для каждого примера отдельно, а настоящие изображения, сэмплы и интерполяции проходят через неё тремя отдельными батчами с разной статистикой. WGAN-GP рекомендует критика без батч-нормализации, например с нормализацией слоя (layer normalization); с критиком кодов, у которого нормализации нет, всё в порядке.
- Шаги критика используют один и тот же батч настоящих данных. Все пять раундов видят один и тот же
x; заново сэмплируются только сэмплы из априорного распределения. WGAN-GP берёт новый мини-батч настоящих данных для каждого шага критика. - Два падения при запуске с нуля.
EarlyStoppingинициализирует лучшее значение черезnp.Inf, которое удалено в NumPy 2.0 (актуальное имя —np.inf). Его первый вызов, в конце эпохи 1, сохраняет файл вcheckpoints/checkpoint_best.pthраньше, чем что-либо создаст каталогcheckpoints(save_checkpoint, который его создаёт, впервые вызывается на эпохе 10), аtorch.saveвыдаёт ошибку, если родительского каталога нет;EarlyStoppingнужен собственныйos.makedirs. - Ранняя остановка выбирает модель по тестовой выборке и следит только за функцией потерь реконструкции. Её терпение в 10 эпох короче второго цикла тёплых перезапусков, так что лучшее значение на эпохе 10 останавливает запуск на эпохе 20, когда шаг обучения ещё равен . Валидационные состязательные слагаемые в
evaluate_alphagan— значения меняющихся критиков, и их нельзя сравнивать между эпохами. - Устаревшие или хрупкие вызовы.
make_grid(..., range=(-1, 1))в ячейке 38 использует имя аргумента, которое torchvision переименовал вvalue_range(остальные ячейки уже используют новое имя). Уtorch.loadв ячейках 26 и 34 нетmap_location, поэтому контрольная точка, сохранённая на GPU, не загрузится на машине без CUDA. - Лишняя работа. Обратный проход энкодера и генератора заполняет также градиенты и ; перед шагами критиков они обнуляются, так что на результаты это не влияет. Шаги критиков вычисляют и с отслеживанием градиентов, прежде чем отсоединить их, причём в режиме обучения, так что они ещё и обновляют статистики батч-нормализации в и . Логирование гистограмм градиентов после каждого из 11 обратных проходов батча, с эпохой в качестве шага, копирует градиенты на CPU раз за эпоху.
- Мелочи. AdamW (Loshchilov and Hutter, 2019) применяет своё затухание весов (weight decay) по умолчанию, 0.01, ко всем сетям, включая критиков, тогда как в статьях используется Adam.
ResBlockвключает смещения свёрток именно тогда, когда за свёрткой следует слой нормализации (bias=(norm_layer is not None)), — обратно обычному выбору; лишние смещения безвредны. Текстовая ячейка 37 объясняет slerp тем, что латентное пространство «часто лежит на гиперсфере после нормировки» (often lies on a hypersphere when normalized); точная причина в том, что гауссовские сэмплы концентрируются вблизи сферы радиуса .
Дальше#
До сих пор каждый GAN в курсе генерировал изображения из шума, а энкодер этой заметки лишь придал этому шуму смысл. Rosca et al. указывают на связь со следующей моделью (раздел 4): в пространстве изображений α-GAN согласует реконструкции с изображениями и поточечно, и по распределению, а в пространстве кодов — только по распределению; добавление поточечной реконструкции кода сделало бы его похожим на CycleGAN. Следующая заметка заменяет пространство кодов вторым доменом изображений: два генератора переводят изображения между доменами без парных примеров, состязательные функции потерь заставляют каждый перевод выглядеть как изображение другого домена, а цикл реконструкций привязывает каждый выход к его входу.
Литература#
- A. Makhzani, J. Shlens, N. Jaitly, I. Goodfellow, B. Frey. Adversarial autoencoders. arXiv:1511.05644, 2015. Агрегированное апостериорное распределение — формула 1; сравнение с VAE — раздел 2.1; детали экспериментов — в приложении A.
- M. Rosca, B. Lakshminarayanan, D. Warde-Farley, S. Mohamed. Variational approaches for auto-encoding generative adversarial networks. arXiv:1706.04987, 2017. α-GAN: раздел 3, формулы 6–9; алгоритм 1 и гиперпараметры — в приложениях B и H.
- G. Kwon, C. Han, D.-S. Kim. Generation of 3D brain MRI using auto-encoding generative adversarial networks. MICCAI, 2019, pp. 118–126; arXiv:1908.02498. Функции потерь α-WGAN — формулы 1–3.
- I. Gulrajani, F. Ahmed, M. Arjovsky, V. Dumoulin, A. Courville. Improved training of Wasserstein GANs. NeurIPS, 2017.
- T. White. Sampling generative networks. arXiv:1609.04468, 2016. Slerp для латентных пространств — раздел 2.1; мёртвые зоны — раздел 2.3.
- K. Shoemake. Animating rotation with quaternion curves. SIGGRAPH, Computer Graphics 19(3), 245–254, 1985.
- I. Loshchilov, F. Hutter. SGDR: Stochastic gradient descent with warm restarts. ICLR, 2017. Расписание — формула 5, раздел 3.
- I. Loshchilov, F. Hutter. Decoupled weight decay regularization. ICLR, 2019. AdamW.
- A. Radford, L. Metz, S. Chintala. Unsupervised representation learning with deep convolutional generative adversarial networks. ICLR, 2016. DCGAN.
- D. Ulyanov, A. Vedaldi, V. Lempitsky. It takes (only) two: adversarial generator-encoder networks. arXiv:1704.02304, 2017. AGE.
- HSE-LAMBDA, репозиторий курса Deep Generative Models:
alpha-WGAN.ipynb.