Содержание курса 10 / 33

10 / 33 · GAN

GAN Вассерштейна и ограничение Липшица

Почему расстояние Вассерштейна-1 даёт генератору полезный градиент там, где JS насыщается, функции потерь критика и генератора в WGAN и два стандартных способа сохранить критика 1-липшицевым — штраф на градиент (WGAN-GP) и спектральная нормализация (SN-GAN).

На этой странице 8

Заметка о GAN закончилась проблемой. При оптимальном дискриминаторе генератор минимизирует 2 DJS(P ∥ Q)−2ln⁡22\,D_{\mathrm{JS}}(P\,\|\,Q) - 2\ln 2, а когда носители (supports) настоящего распределения PP и распределения генератора QQ не пересекаются, DJS=ln⁡2D_{\mathrm{JS}} = \ln 2, где бы ни находилось QQ. Тогда (почти) оптимальный дискриминатор постоянен вокруг сгенерированных сэмплов, поэтому минимаксная функция потерь генератора не получает градиента, а ненасыщающаяся (non-saturating) даёт неустойчивые обновления (Arjovsky and Bottou, 2017, теоремы 2.1–2.2, 2.4 и 2.6; см. заметку о GAN). GAN Вассерштейна (Wasserstein GAN; Arjovsky, Chintala and Bottou, 2017) заменяет дивергенцию Йенсена–Шеннона (Jensen–Shannon divergence) расстоянием Вассерштейна-1 (Wasserstein-1 distance), которое продолжает уменьшаться по мере того, как QQ движется к PP, даже когда они не перекрываются. Цена — ограничение на дискриминатор: он должен быть 1-липшицевым. Дальше в заметке разобраны функции потерь и два стандартных способа выполнить это ограничение.

Обозначения. PP — распределение настоящих данных, QQ — распределение генератора (x=G(z)x = G(z) с шумом z∼pzz \sim p_z, как в заметке о GAN), ff — критик (critic): так в WGAN называется дискриминатор, сеть с вещественным выходом и без сигмоиды. Его функция потерь сохраняет обозначение функции потерь дискриминатора, LD\mathcal L_D. Настоящие сэмплы — xr∼Px_r \sim P, подделки — xf=G(z)x_f = G(z). ∥⋅∥2\|\cdot\|_2 — евклидова норма.

Расстояние Вассерштейна-1#

Представим PP и QQ как две кучи земли одинаковой массы. Транспортный план (transport plan) γ(x,y)\gamma(x, y) показывает, сколько массы перемещается из xx в yy; его маргинальные распределения должны совпадать с PP и QQ, а Π(P,Q)\Pi(P, Q) — множество всех таких планов (Peyré and Cuturi, 2019, глава 2). Перемещение массы mm на расстояние ∥x−y∥\|x - y\| стоит m ∥x−y∥m\,\|x - y\|, и W1W_1, которое также называют расстоянием перемещения земли (earth mover’s distance), — наименьшая суммарная стоимость:

W1(P,Q)=inf⁡γ∈Π(P,Q)E(x,y)∼γ ∥x−y∥.W_1(P, Q) = \inf_{\gamma \in \Pi(P, Q)} \mathbb{E}_{(x, y)\sim\gamma}\,\|x - y\| .

Сеть не может оптимизировать напрямую по всем транспортным планам. Для распределений на Rd\mathbb R^d с конечными первыми моментами, E∥x∥<∞\mathbb E\|x\| < \infty для обоих, W1W_1 конечно, и двойственность Канторовича–Рубинштейна (Kantorovich–Rubinstein duality; Villani, 2009, замечание 6.5) переписывает инфимум как супремум по функциям:

W1(P,Q)=sup⁡∥f∥L≤1  [ Ex∼P f(x)−Ex∼Q f(x)],\begin{aligned} W_1(P, Q) = \sup_{\|f\|_L \le 1}\; \Big[\, &\mathbb{E}_{x\sim P}\,f(x)\\ &- \mathbb{E}_{x\sim Q}\,f(x) \Big], \end{aligned}

где ∥f∥L≤1\|f\|_L \le 1 (ff является 1-липшицевой) означает ∣f(x)−f(y)∣≤∥x−y∥|f(x) - f(y)| \le \|x - y\| для всех x,yx, y. Отсюда и берутся критик и его ограничение: критик ff играет роль функции под знаком супремума. Он ставит настоящим сэмплам высокие оценки, а подделкам — низкие, но не может меняться быстрее расстояния. Без ограничения и при P≠QP \ne Q супремум был бы равен +∞+\infty, поскольку любую разделяющую ff можно было бы умножить на сколь угодно большое число.

Почему это помогает. Возьмём две точечные массы: P=δ0P = \delta_0 (данные) и Qθ=δθQ_\theta = \delta_\theta (модель). При любом θ≠0\theta \ne 0 носители не пересекаются. Смесь M=12(P+Qθ)M = \tfrac12(P + Q_\theta) помещает массу 12\tfrac12 в каждый атом, поэтому каждое слагаемое KL в DJSD_{\mathrm{JS}} сравнивает массу 11 с массой 12\tfrac12 в одном атоме:

DJS(P ∥ Qθ)=12DKL(P ∥ M)+12DKL(Qθ ∥ M)=12ln⁡11/2+12ln⁡11/2=ln⁡2≈0.693,DKL(P ∥ Qθ)=∞,W1(P,Qθ)=∣θ∣.\begin{aligned} D_{\mathrm{JS}}(P\,\|\,Q_\theta) &= \tfrac12 D_{\mathrm{KL}}(P\,\|\,M)\\ &\quad + \tfrac12 D_{\mathrm{KL}}(Q_\theta\,\|\,M)\\ &= \tfrac12\ln\frac{1}{1/2} + \tfrac12\ln\frac{1}{1/2}\\ &= \ln 2 \approx 0.693,\\ D_{\mathrm{KL}}(P\,\|\,Q_\theta) &= \infty,\\ W_1(P, Q_\theta) &= |\theta| . \end{aligned}

Единственный план перемещает всю массу на расстояние ∣θ∣|\theta|. DJSD_{\mathrm{JS}} не зависит от θ\theta, поэтому её производная равна 00; у W1W_1 наклон ±1\pm 1, и это расстояние всегда указывает модели направление к данным. Это вариант примера с параллельными прямыми из статьи о WGAN, записанный для точечных масс (Arjovsky, Chintala and Bottou, 2017, пример 1). В общем случае обозначим через QθQ_\theta распределение Gθ(z)G_\theta(z). Если данные лежат в компактном множестве, как везде предполагает статья, и GθG_\theta непрерывна по θ\theta, то непрерывно и W1(P,Qθ)W_1(P, Q_\theta). На неограниченном пространстве одной непрерывности GθG_\theta мало, нужно ещё условие интегрируемости. Если GθG_\theta — сеть прямого распространения (feedforward network), а априорное распределение удовлетворяет условию E∥z∥<∞\mathbb E\|z\| < \infty, которое и даёт такое условие, то W1(P,Qθ)W_1(P, Q_\theta) непрерывно и ещё и дифференцируемо по θ\theta почти всюду. Ни одно из этих утверждений не верно для DJSD_{\mathrm{JS}} или KL, которые могут меняться скачком (Arjovsky, Chintala and Bottou, 2017, теорема 1 и следствие 1).

Рисунок

D_JS постоянна при непересекающихся носителях; у W₁ остаётся наклон

Дивергенция Йенсена–Шеннона и расстояние Вассерштейна-1 между двумя точечными массамиСверху: красная точечная масса P в нуле и синяя точечная масса Q тета в точке тета = 0.7, между ними двусторонняя стрелка длины тета. Снизу: график по тета от минус 1.2 до 1.2. Дивергенция Йенсена–Шеннона — горизонтальная красная линия на уровне ln 2, около 0.693, с выколотой точкой при тета = 0, где она опускается в единственную точку на нуле; подпись: постоянна, градиента нет. Расстояние Вассерштейна-1 — зелёная V-образная линия, равная модулю тета; подпись: наклон плюс-минус 1, полезный градиент.P = δ₀ (данные)Qθ = δθ (модель)θ0θ00.51значение−1−0.50.51θW₁ = |θ|DJS = ln 2DJS постоянна:нет градиента для Gнаклон ±1:полезный градиентDJS = 0 только при θ = 0Дивергенция Йенсена–Шеннона и расстояние Вассерштейна-1 между двумя точечными массамиСверху: красная точечная масса P в нуле и синяя точечная масса Q тета в точке тета = 0.7, между ними двусторонняя стрелка длины тета. Снизу: график по тета от минус 1.2 до 1.2. Дивергенция Йенсена–Шеннона — горизонтальная красная линия на уровне ln 2, около 0.693, с выколотой точкой при тета = 0, где она опускается в единственную точку на нуле; подпись: постоянна, градиента нет. Расстояние Вассерштейна-1 — зелёная V-образная линия, равная модулю тета; подпись: наклон плюс-минус 1, полезный градиент.P = δ₀(данные)Qθ = δθ(модель)θ0θ00.51значение−1−0.50.51θDJS = ln 2:у G нет градиентаW₁ = |θ|: наклон ±1,градиент полезенDJS = 0 только при θ = 0
P = δ₀ — точечная масса в 0 (настоящие данные), а модель Q_θ = δ_θ — точечная масса в θ. При любом θ ≠ 0 носители не пересекаются, поэтому D_JS(P ‖ Q_θ) = ln 2 ≈ 0.693 ната независимо от того, насколько далеко они друг от друга, а D_KL(P ‖ Q_θ) = ∞. Расстояние Вассерштейна-1 — это стоимость перемещения всей массы на расстояние |θ|, поэтому W₁ = |θ|, и его производная ±1 всегда указывает модели направление к данным. Обе кривые построены относительно одной и той же вертикальной оси.

Функции потерь WGAN#

Критик максимизирует двойственную целевую функцию, поэтому его функция потерь — она же со знаком минус. Генератор входит только во второе математическое ожидание и стремится к тому, чтобы значения критика на подделках были высокими:

LD=−Ex∼P[f(x)]+Ez∼pz[f(G(z))],LG=−Ez∼pz[f(G(z))].\begin{aligned} \mathcal L_D &= -\mathbb{E}_{x\sim P}\big[f(x)\big] + \mathbb{E}_{z\sim p_z}\big[f(G(z))\big],\\ \mathcal L_G &= -\mathbb{E}_{z\sim p_z}\big[f(G(z))\big]. \end{aligned}

Что измеряет −LD-\mathcal L_D? Семейство сетей содержит лишь часть KK-липшицевых функций, поэтому даже его лучший представитель даёт −LD≤K W1(P,Q)-\mathcal L_D \le K\,W_1(P, Q) — нижнюю оценку, которая становится точной, когда семейство содержит оптимального 1-липшицева критика, умноженного на KK (K=1K = 1 для 1-липшицева семейства). При обучении −LD-\mathcal L_D — оценка этой величины по мини-батчу. В отличие от дискриминатора GAN, критика следует обучать почти до оптимума: чем лучше критик, тем надёжнее градиент W1W_1, тогда как более сильный дискриминатор GAN насыщается. Поэтому критика обновляют несколько раз на каждый шаг генератора, ncritic=5n_{\text{critic}} = 5 в исходном алгоритме (Arjovsky, Chintala and Bottou, 2017, раздел 3 и алгоритм 1).

Если на критика наложено ограничение Липшица и он обучен почти до оптимума, −LD-\mathcal L_D в ходе одного запуска коррелирует с качеством сэмплов, чего нельзя сказать о функции потерь дискриминатора GAN (раздел 4.2, рисунки 3–4). Константа KK зависит от архитектуры критика, поэтому это число трудно сравнивать между моделями с разными критиками, и авторы не предлагают его в качестве метрики качества.

Сами по себе функции потерь не делают ff липшицевой. Исходный WGAN после каждого шага обрезал каждый вес критика до отрезка [−c,c][-c, c]; такая обрезка весов (weight clipping) делает критика KK-липшицевым для некоторого KK, которое зависит от cc и архитектуры. Авторы назвали это «откровенно ужасным способом» (a clearly terrible way) обеспечить ограничение: при большом cc критик медленно обучается до оптимума, а при малом cc градиенты могут затухать (Arjovsky, Chintala and Bottou, 2017, раздел 3). Статья о WGAN-GP показала, кроме того, что обрезка смещает критика в сторону слишком простых функций и что без тщательного подбора cc градиенты взрываются или затухают (Gulrajani et al., 2017, разделы 3.1–3.2). Два метода ниже заменяют обрезку.

WGAN-GP: штраф на градиент#

WGAN-GP (Gulrajani et al., 2017) сохраняет функции потерь WGAN и добавляет к функции потерь критика штраф на градиент (gradient penalty):

LD=Ez∼pz[f(G(z))]−Ex∼P[f(x)]+λ Ex^[(∥∇x^f(x^)∥2−1)2].\begin{aligned} \mathcal L_D = {}& \mathbb{E}_{z\sim p_z}\big[f(G(z))\big] - \mathbb{E}_{x\sim P}\big[f(x)\big]\\ &+ \lambda\,\mathbb{E}_{\hat x}\Big[\big(\|\nabla_{\hat x} f(\hat x)\|_2 - 1\big)^2\Big]. \end{aligned}

Первые два слагаемых — функция потерь критика WGAN, записанная в обратном порядке, а функция потерь генератора LG\mathcal L_G не меняется. Символ LD\mathcal L_D теперь включает штраф, поэтому −LD-\mathcal L_D уже не является оценкой нижней границы K W1K\,W_1 из предыдущего раздела: это та оценка минус λ\lambda, умноженное на штраф. Для наблюдения за обучением стоит записывать разность оценок на настоящих и поддельных данных EPf−EQf\mathbb E_P f - \mathbb E_Q f и штраф по отдельности. Разность читается с прежними оговорками и ещё одной: мягкое ограничение делает критика лишь приближённо 1-липшицевым, так что разность не обязана быть нижней оценкой W1W_1.

Почему норма градиента. Для дифференцируемой ff на Rd\mathbb R^d быть 1-липшицевой — то же самое, что иметь ∥∇f(x)∥2≤1\|\nabla f(x)\|_2 \le 1 всюду (одна импликация следует из определения производной, другая — из теоремы о среднем на отрезке). Поэтому, подталкивая ∥∇x^f(x^)∥2\|\nabla_{\hat x} f(\hat x)\|_2 к 11, мы сохраняем ff приблизительно 1-липшицевой. Буквальному ограничению соответствовал бы односторонний штраф max⁡(0,∥∇f∥2−1)2\max(0, \|\nabla f\|_2 - 1)^2. WGAN-GP использует двусторонний штраф (∥∇f∥2−1)2(\|\nabla f\|_2 - 1)^2, который не исключает оптимального критика. На компактном пространстве, если оптимальный критик f∗f^* дифференцируем, а оптимальный транспортный план (optimal coupling) перемещает каждую точку (π(x=y)=0\pi(x = y) = 0), то норма градиента f∗f^* равна 11 на отрезках между точками, которые этот план связывает друг с другом, а также почти всюду по мере PP и QQ (Gulrajani et al., 2017, предложение 1 и следствие 1). В экспериментах авторов двусторонний штраф к тому же работал немного лучше (раздел 4 и приложение C). Ограничение мягкое: оно проверяется только в сэмплированных точках x^\hat x.

Откуда берётся x^\hat x. Сопоставим каждому настоящему сэмплу подделку, сэмплируем α∼U(0,1)\alpha \sim U(0, 1) и возьмём случайную точку на отрезке между ними:

x^=α xr+(1−α) xf.\hat x = \alpha\,x_r + (1 - \alpha)\,x_f .

Предложение 1 говорит о парах, взятых из оптимального транспортного плана, а он неизвестен. Вместо этого WGAN-GP составляет пары из настоящих сэмплов и подделок случайным образом. Это эвристика, мотивированная предложением: обеспечить единичную норму всюду вычислительно неразрешимо (intractable), а требовать её только вдоль этих отрезков на практике достаточно (Gulrajani et al., 2017, раздел 4). В коде α\alpha сэмплируется один раз на изображение и распространяется на все пиксели (broadcasting). Градиент выхода критика по x^\hat x вычисляется с помощью torch.autograd.grad(..., create_graph=True), чтобы через сам штраф тоже можно было выполнить обратное распространение ошибки. Затем для каждого сэмпла градиент вытягивается в вектор gg, и его норма входит в штраф (∥g∥2−1)2{(\|g\|_2 - 1)^2}. Во всех экспериментах статьи λ=10\lambda = 10 (раздел 4).

Рисунок

Штраф на градиент вычисляется между настоящими сэмплами и подделками

Интерполированные точки для штрафа на градиент в WGAN-GPДвумерная диаграмма рассеяния. Семь красных настоящих сэмплов справа и семь синих подделок слева. Каждый настоящий сэмпл соединён с подделкой штриховым отрезком, и на каждом отрезке в случайном месте лежит зелёная точка x с крышкой. Бледные параллельные линии — линии уровня критика f. В одной из зелёных точек стрелка единичной длины показывает градиент f с подписью: здесь вычисляется штраф на его норму.настоящие xr ~ Pподделки xf = G(z)x̂ = α xr + (1 − α) xf, α ~ U(0, 1)∇f(x̂)линии уровня критика fштраф (‖∇f(x̂)‖2 − 1)² здесьИнтерполированные точки для штрафа на градиент в WGAN-GPДвумерная диаграмма рассеяния. Семь красных настоящих сэмплов справа и семь синих подделок слева. Каждый настоящий сэмпл соединён с подделкой штриховым отрезком, и на каждом отрезке в случайном месте лежит зелёная точка x с крышкой. Бледные параллельные линии — линии уровня критика f. В одной из зелёных точек стрелка единичной длины показывает градиент f с подписью: здесь вычисляется штраф на его норму.настоящие xr ~ Pподделки xf = G(z)x̂ = α xr + (1 − α) xf, α ~ U(0, 1)∇f(x̂)линии уровня критика fштраф (‖∇f(x̂)‖2 − 1)² считается здесь
Семь настоящих сэмплов (красные) и семь подделок (синие); все точки получены при фиксированном начальном значении (seed) генератора случайных чисел. Каждому настоящему сэмплу сопоставлена случайная подделка, α берётся из U(0, 1), а зелёная точка α·(настоящий) + (1 − α)·(подделка) — случайная точка на отрезке между ними. Штраф λ(‖∇f‖₂ − 1)² вычисляется в этих точках и подталкивает норму градиента критика в них к 1. Тонкие штриховые линии — линии уровня критика с единичным градиентом, направленным от подделок к настоящим сэмплам; для этого критика штраф равен нулю, а стрелка ∇f, нарисованная в масштабе графика, имеет длину 1.

Без батч-нормализации в критике. Штраф рассматривает критика как функцию одного изображения: он ограничивает ∥∇x^f(x^)∥2\|\nabla_{\hat x} f(\hat x)\|_2 для каждого x^\hat x по отдельности. С батч-нормализацией (batch normalization) критик отображает целый мини-батч входов в мини-батч выходов, и штраф на градиент по каждому входу уже не описывает ту функцию, которую ограничивают. Поэтому WGAN-GP исключает батч-нормализацию из критика и допускает только нормализации, которые не смешивают примеры; авторы рекомендуют нормализацию слоя (layer normalization; Gulrajani et al., 2017, раздел 4). Подходит и нормализация по экземпляру (instance normalization), которая нормализует каждый канал каждого изображения по его пространственным позициям.

SN-GAN: спектральная нормализация#

Второй подход ограничивает не градиенты, а веса (Miyato et al., 2018). Авторы обучали свои SN-GAN со стандартной функцией потерь GAN и с кусочно-линейной функцией потерь (hinge loss), а не с функцией потерь Вассерштейна; WGAN-GP служил им базой для сравнения (раздел 4, формулы 15–17). Сама нормализация — это ограничение Липшица, и она так же применима к критику WGAN. Матрица весов каждого слоя делится на свою спектральную норму (spectral norm) — наибольшее сингулярное число:

W^=Wσmax⁡(W),σmax⁡(W)=max⁡h≠0∥Wh∥2∥h∥2.\begin{gathered} \hat W = \frac{W}{\sigma_{\max}(W)},\\ \sigma_{\max}(W) = \max_{h \ne 0}\frac{\|W h\|_2}{\|h\|_2} . \end{gathered}

Что такое сингулярное число. Линейное отображение растягивает пространство. Оно переводит единичную окружность в эллипс, а сингулярные числа говорят, насколько сильно отображение растягивает пространство в каждом направлении: правые сингулярные векторы viv_i переходят в σiui\sigma_i u_i — полуоси эллипса. Наибольшее из них, σmax⁡\sigma_{\max}, — наибольший коэффициент, с которым может растянуться какой-либо вектор, поэтому оно равно константе Липшица отображения h↦Whh \mapsto W h. После деления на него ни одно направление не растягивается больше чем в 11 раз.

Рисунок

Матрица растягивает единичную окружность в эллипс; её наибольшее сингулярное число — самая длинная полуось

Спектральная нормализация матрицы 2 на 2Три панели. Первая: единичная окружность с двумя перпендикулярными единичными векторами v1 и v2. Вторая: после умножения на W окружность превращается в наклонный эллипс; его большая полуось сигма 1 на u1 имеет длину 1.66, а малая полуось сигма 2 на u2 — длину 0.58; для сравнения показана штриховая единичная окружность. Третья: после деления W на сигма max эллипс имеет полуоси 1 и 0.35 и помещается внутри штриховой единичной окружности, касаясь её в точках плюс и минус u1.окружность ‖h‖₂ = 1v1v2после W: растяжениеσ1u1σ2u2σ₁ = σmax = 1.66σ₂ = σmin = 0.58после Ŵ = W / σmaxu1касание в ±u₁наибольшая полуось = 1‖Ŵh‖₂ ≤ ‖h‖₂W÷σ₁Спектральная нормализация матрицы 2 на 2Три панели. Первая: единичная окружность с двумя перпендикулярными единичными векторами v1 и v2. Вторая: после умножения на W окружность превращается в наклонный эллипс; его большая полуось сигма 1 на u1 имеет длину 1.66, а малая полуось сигма 2 на u2 — длину 0.58; для сравнения показана штриховая единичная окружность. Третья: после деления W на сигма max эллипс имеет полуоси 1 и 0.35 и помещается внутри штриховой единичной окружности, касаясь её в точках плюс и минус u1.окружность ‖h‖₂ = 1v1v2после W: растяжениеσ1u1σ2u2σ₁ = σmax = 1.66σ₂ = σmin = 0.58после Ŵ = W / σmaxu1касание в ±u₁наибольшая полуось = 1‖Ŵh‖₂ ≤ ‖h‖₂умножение на Wделение на σmax
W = [[1.3, 0.7], [0.3, 0.9]]. Её правые сингулярные векторы v₁, v₂ переходят в σ₁u₁ и σ₂u₂ — полуоси образа единичной окружности под действием W: σ₁ = 1.66 и σ₂ = 0.58 (их произведение 0.96 равно |det W|). Спектральная нормализация делит на наибольшее сингулярное число σ₁, поэтому у эллипса для Ŵ = W/σ₁ полуоси равны 1 и 0.35: он касается единичной окружности в точках ±u₁ и лежит внутри неё, так что ‖Ŵh‖₂ ≤ ‖h‖₂ для любого h.

Для сети, в которой линейные слои чередуются с 1-липшицевыми активациями (ReLU, LeakyReLU), константы Липшица при композиции перемножаются, поэтому (Miyato et al., 2018, формула 7)

∥f∥L≤∏lσmax⁡(Wl),\|f\|_L \le \prod_{l} \sigma_{\max}(W_l),

а после нормализации это произведение не превосходит 11.

В отличие от штрафа на градиент, ограничение накладывается на веса, а не проверяется в сэмплированных точках, и настраивать λ\lambda не нужно. В PyTorch это обёртка torch.nn.utils.spectral_norm(nn.Conv2d(...)) (в новом API — torch.nn.utils.parametrizations.spectral_norm), которая вместо полного SVD оценивает σmax⁡\sigma_{\max} одним шагом степенного метода (power iteration) на каждый прямой проход в режиме обучения. На практике эта граница выполняется лишь приближённо, и тому есть три причины. Степенной метод даёт лишь приближённое значение σmax⁡\sigma_{\max}. Для свёртки обёртка нормализует ядро, развёрнутое в матрицу, а это лишь суррогат операторной нормы свёртки, не равный ей; истинная норма зависит ещё и от шага (stride) и дополнения (padding) (Gouk et al., 2021, раздел 3.2; Miyato et al., 2018, сноска 3). Наконец, слои нормализации, стоящие между свёртками, в общем случае не 1-липшицевы. Поэтому спектральная нормализация держит константу Липшица критика под контролем, но не гарантирует, что она не превосходит 11. Кроме того, граница через произведение не обязана быть точной, так что нормализованный критик KK-липшицев для некоторого KK, которое может быть заметно меньше 11; тогда критик WGAN со спектральной нормализацией оценивает нижнюю границу для K W1K\,W_1, а не само W1W_1.

Два двойственных взгляда#

И f-GAN из заметки о GAN, и WGAN обучают дискриминатор как функцию под знаком супремума. f-GAN использует оценку f-дивергенции (f-divergence) через сопряжённую по Фенхелю функцию (convex conjugate); f-дивергенция сравнивает отношения плотностей и поэтому наследует проблему носителей, присущую DJSD_{\mathrm{JS}} и KL. WGAN использует двойственную форму Канторовича–Рубинштейна для транспортной стоимости, которая сравнивает положения и остаётся информативной, когда носители не пересекаются. Ограничение Липшица — цена второго взгляда: именно оно связывает критика с геометрией пространства данных.

Ноутбук#

Ноутбук о WGAN из репозитория HSE-LAMBDA Deep Generative Models (закреплённый коммит; ячейки нумеруются с 1, считая все ячейки подряд, включая текстовые) реализует все три варианта на CelebA с разрешением 64×6464 \times 64. Все три функции обучения используют Adam с шагом обучения (learning rate) 2⋅10−42\cdot10^{-4} и betas (0.5,0.9)(0.5, 0.9) и ncritic=5n_{\text{critic}} = 5 шагов критика на шаг генератора; в статье о WGAN-GP шаг обучения равен 10−410^{-4}, а betas — (0,0.9)(0, 0.9) (Gulrajani et al., 2017, алгоритм 1). Базовый запуск и запуск WGAN-GP рассчитаны на 2 эпохи, запуск со спектральной нормализацией — на 20.

  • Ячейки 1–5: введение, расстояние перемещения земли и его двойственная форма Канторовича–Рубинштейна, а также целевая функция WGAN с критиком, выдающим вещественное число.
  • Ячейки 6–9: данные. CelebA: 202 599 выровненных и обрезанных изображений лиц размером 178 × 218 пикселей (ширина × высота), принадлежащих 10 177 людям; каждое размечено 40 бинарными атрибутами, например «улыбается» или «в очках». Класс набора данных из курса возвращает атрибуты, а этот ноутбук их не использует. Изображения приводятся к размеру 64×6464 \times 64 и масштабируются в [−1,1][-1, 1], размер батча 1024 с drop_last=True (197 батчей за эпоху), а ячейка 9 показывает сетку настоящих изображений. Ячейка 7 выбирает устройство (CUDA, Apple MPS или CPU). Resize((64, 64)) с парой размеров масштабирует две стороны независимо, поэтому соотношение сторон меняется с 178 : 218 на 1 : 1, и лица становятся примерно на 22% шире относительно своей высоты; Resize(64) с последующим CenterCrop(64) сохраняет пропорции.
  • Ячейки 10–16: базовый WGAN. Ячейка 12 определяет сети. Генератор следует рекомендациям DCGAN: z∈R100z \in \mathbb R^{100} проходит через линейный слой без смещения с 512⋅4⋅4=8192512 \cdot 4 \cdot 4 = 8192 выходами, BatchNorm1d и ReLU, переформируется в 512×4×4512 \times 4 \times 4, и четыре транспонированные свёртки (transposed convolutions) с ядром 5, шагом 2, дополнением 2 и выходным дополнением (output padding), равным 1, проводят его через 256, 128 и 64 канала к 3×64×643 \times 64 \times 64, с батч-нормализацией и ReLU после первых трёх и Tanh после последней. Ядро 5 не делится на шаг 2, поэтому эти слои могут давать шахматные артефакты (checkerboard artifacts). Критик применяет четыре свёртки с шагом 2 и ядром 5, 3→64→128→256→5123 \to 64 \to 128 \to 256 \to 512 каналов, после каждой — LeakyReLU(0.2), с InstanceNorm2d(affine=True) после последних трёх и без нормализации на входе, а затем свёртку 4×44 \times 4, дающую одно значение без сигмоиды. train_wgan (ячейка 14) использует d_loss = -mean(real_score) + mean(fake_score) и g_loss = -mean(fake_score). Базовый вариант не накладывает никакого ограничения Липшица — ни обрезки, ни штрафа (ячейка 11). Поэтому целевая функция его критика не ограничена (супремум выше равен +∞+\infty), его выходы и D_loss могут неограниченно дрейфовать, а функция потерь не оценивает W1W_1. Ячейка 13 отмечает, что обрезку весов можно добавить, обрезая веса критика до отрезка (clamp) после каждого обновления. Каждая функция обучения один раз сэмплирует 16 латентных векторов (fixed_noise, ячейки 14, 19 и 24) и после каждой эпохи декодирует их генератором в режиме инференса (evaluation mode), так что сетки прослеживают одни и те же коды на протяжении обучения.
  • Ячейки 17–21: WGAN-GP. gradient_penalty (ячейка 18) сэмплирует α∼U(0,1)\alpha \sim U(0,1) отдельно для каждого элемента батча, интерполирует, дифференцирует с create_graph=True и штрафует норму L2L_2 каждого элемента; lambda_gp = 10. Критик — та же сеть, а её InstanceNorm2d нормализует каждый сэмпл отдельно, поэтому штраф по отдельным сэмплам остаётся корректным (см. «Без батч-нормализации в критике»). В train_wgan_gp (ячейка 19) штраф получает fake_imgs без detach(), поэтому каждый шаг критика выполняет обратное распространение и через генератор. Эти градиенты обнуляются перед шагом генератора, так что на результаты это не влияет, но вычисления тратятся впустую.
  • Ячейки 22–27: спектральная нормализация. DiscriminatorSN оборачивает каждую свёртку в spectral_norm; во внутренних блоках за нормализованной свёрткой следуют InstanceNorm2d(affine=True) и LeakyReLU, поэтому неравенство выше выполняется лишь приближённо. Обучение использует обычные функции потерь WGAN.
  • Ячейка 28: итоги.

Сохранённые выходы есть только у ячеек 7, 9, 26 и 27: устройство (mps), сетка настоящих изображений, индикаторы прогресса запуска со спектральной нормализацией, прерванного на 11-й эпохе из 20, и сэмплы из этого частично обученного генератора. Значения функций потерь не сохранены. У ячеек обучения и сэмплирования базового варианта и WGAN-GP нет сохранённых выходов, поэтому для этих вариантов ноутбук документирует только процедуры.

Дальше#

WGAN дал генератору полезный градиент, а спектральная нормализация удержала критика под контролем. Но встреченные до сих пор GAN всё ещё порождают маленькие изображения одного вида: лица 64×64, цифры, спальни. Следующая заметка прослеживает, что понадобилось, чтобы дойти до больших, разнообразных изображений высокого разрешения: постепенное наращивание сетей, self-attention для структуры, охватывающей всё изображение, и BigGAN, который масштабирует тот же рецепт на весь ImageNet.

Литература#