Почему соревнование двух сетей может научить распределение данных?
GAN обучает две сети в игре. Судья ищет отличие настоящего распределения от
сгенерированного, генератор меняет свои примеры по этому сигналу. Равновесие
красиво на бумаге: в нём судья беспомощен, а подделка неотличима от правды. Но
траектория обучения может вращаться, схлопываться и забывать целые режимы
данных, и никакая кривая потерь об этом не сообщит.
Фальшивомонетчик и эксперт
Пусть z∼pz — простой шум, а генератор Gθ(z) создаёт объект x.
Распределение его выходов обозначим pg. Судья (discriminator)
Dϕ(x)∈(0,1) оценивает вероятность того, что объект пришёл из реальных
данных pdata, а не из мастерской генератора.
Исходная минимаксная игра записывается одной строкой:
Распределение pg задано неявно — как образ шума под действием сети:
pg=Gθ#pz,x=Gθ(z),z∼pz.
Судья максимизирует правильность различения, генератор минимизирует её. Важная
особенность: у генератора нет готового правильного ответа для каждого z.
Никто не говорит ему «вот такую картинку надо было выдать». Градиент приходит
к нему только через судью — то есть через обучаемую функцию потерь.
Это состязательное (adversarial) обучение, но не обязательно злонамеренная
атака, как в уроке про атаки на модели. Соперник здесь служит
измерительным прибором: он превращает расплывчатое «похоже на правду» в
конкретное число, по которому можно взять производную.
Судья, который читает отношение плотностей
Начнём не с сетей, а с честной арифметики. Возьмём реальные данные —
17 379 часов работы велопроката из урока про регрессию. Число
поездок за час имеет среднее 189,5, медиану 142 и стандартное отклонение 181,4:
распределение сильно скошено вправо. Пусть «генератор» — не сеть, а простая
вероятностная модель, подогнанная под эти данные. Возьмём две: нормальную с тем
же средним и той же дисперсией и логнормальную.
При фиксированном G оптимального судью можно найти вообще без обучения.
Запишем V как интеграл, в котором каждая точка x разбирается отдельно и
независимо от остальных:
V(D,G)=∫[pdata(x)logD(x)+pg(x)log(1−D(x))]dx.
Теперь максимизируем подынтегральное выражение по одному числу D(x):
Никакой мистики: идеальный судья — это перенормированное отношение плотностей,
ровно тот же объект, что и апостериорная вероятность класса в
формуле Байеса при равных априорных долях настоящих и поддельных
объектов.
Рис. 82.1. Оптимальный судья читает отношение плотностей
Реальный велопрокат (17 379 часов) против двух простых генераторов. Нормальная
подгонка промахивается по форме: JS-дивергенция 0,053 бит, логнормальная —
0,032 бит. Справа оптимальный судья D∗(x): против нормального генератора он
уверенно говорит «это настоящее» там, где данных много, а подделки мало
(D∗(50)=0,66), и «это подделка» там, где нормальная кривая раздула хвост
(D∗(400)=0,41). Судья не выдумывает признаков — он просто читает, где одна
плотность больше другой.
Нормальный генератор проваливается ещё и физически: 14,8% его массы приходится
на отрицательное число поездок за час. Судье даже не нужна тонкая статистика,
чтобы поймать такую подделку, — достаточно посмотреть на знак.
Что на самом деле минимизирует генератор
Подставим D∗ обратно в V. После группировки получается
а если внести множитель 2 под логарифм и вычесть его снаружи —
V(D∗,G)=−log4+2JS(pdata∥pg),
где
JS(p∥q)=21KL(p2p+q)+21KL(q2p+q).
Минимум достигается при pg=pdata, тогда JS=0,
D∗(x)≡1/2 и V=−log4≈−1,386. Проверим на наших данных:
нормальный генератор даёт V=−1,313, логнормальный −1,342 — ближе к
идеальному −1,386, что и соответствует меньшей JS. Значение игры честно
ранжирует две модели.
Полезно помнить границы этой величины:
0≤JS(p∥q)≤log2,−log4≤V(D∗,G)≤0.
Оговорка, без которой формула вводит в заблуждение: всё это описывает идеальное
равновесие при бесконечно выразительных сетях и оптимальном судье на каждом
шаге. Реальные сети обновляются попеременно, судья всегда чуть отстаёт, и
доказанное равновесие — лишь цель, а не описание происходящего.
Когда подделка очевидна, уклон исчезает
В начале обучения генератор плох, и судья уверенно ставит на подделке
D(G(z))≈0. Посмотрим, что при этом чувствует генератор. Насыщающая
(исходная минимаксная) цель
LGsat=Ezlog[1−D(G(z))],∂D∂LGsat=1−D1,
при D=0,05 даёт модуль градиента 1,05. Non-saturating цель
LGNS=−EzlogD(G(z)),∂D∂LGNS=D1,
при том же D=0,05 даёт 20,0 — в 19 раз больше. Разрыв ещё нагляднее, если
считать градиент по логиту s, где D=σ(s):
так что маленький первый сомножитель обнуляет всё произведение независимо от
того, насколько хороша архитектура генератора.
При s=−4 (то есть D=0,018) насыщающая цель передаёт генератору 0,018, а
non-saturating — 0,982: отношение 54,6. Одна и та же уверенность судьи для
первой цели означает «уклона нет», для второй — «уклон максимален».
Рис. 82.2. Две цели с одним желаемым концом и разной динамикой
Обе цели хотят одного и того же — чтобы судья ошибался. Но насыщающая цель
плоская именно там, где генератор плох: при уверенном судье (s=−4,
D=0,018) её градиент равен 0,018 против 0,982 у non-saturating. Смена
формулировки цели не меняет положения желаемой неподвижной точки, но полностью
меняет силу сигнала на пути к ней.
Это тот же сюжет, что и с выбором функции потерь: равенство
минимумов не означает равенства траекторий. Формулировка цели — это выбор не
только «куда», но и «насколько круто».
Почему обучение вращается
Разница между минимизацией и игрой глубже, чем формулировка потери. Возьмём
простейшую игру V(x,y)=xy: игрок x минимизирует, игрок y максимизирует.
Равновесие очевидно — точка (0,0). Одновременный градиентный шаг:
xt+1=xt−ηyt,yt+1=yt+ηxt,
или в матричной форме
(xt+1yt+1)=(1η−η1)(xtyt).
Её собственные значения и их модуль равны
λ1,2=1±iη,∣λ1,2∣=1+η2>1прилюбомη>0.
Значит,
rt+12=xt+12+yt+12=(1+η2)rt2,
и расстояние до равновесия строго растёт. За 100 шагов из точки (1,0) радиус
становится равен 1,005 при η=0,01, 1,64 при η=0,1 и 70 065 при
η=0,5. Уменьшение шага замедляет катастрофу, но не меняет её знака: в
игре векторное поле обновлений содержит вращательную часть, у которой нет
потенциала.
Рис. 82.3. В игре шаг по градиенту раскручивает, а не спускает
Одновременный шаг в игре V=xy уводит от седловой точки при любой скорости
обучения: за 100 шагов радиус растёт с 1 до 1,005 (η=0,01), 1,64
(η=0,1) и 70 065 (η=0,5). Поочерёдные обновления, при которых
второй игрок отвечает уже на новый ход первого, ведут себя иначе: тот же
η=0,1 даёт радиус 1,023, а η=0,5 — 1,069. Порядок ходов
оказывается не деталью реализации, а частью алгоритма.
Вот почему в градиентном спуске кривая потери падает, а в GAN она
не обязана падать вовсе. Отсюда же весь арсенал лечения: разные частоты
обновления игроков, осторожный моментум, экстраградиентные и «раскрученные»
(unrolled) схемы, регуляризация градиента судьи.
Красовский: равновесие есть, а как в него попасть?
Что существование равновесия не решает задачу движения к нему, математики
поняли задолго до GAN. Николай Николаевич Красовский и его свердловская школа
занимались позиционными дифференциальными играми: две управляемые системы,
одна стремится к сближению, другая к уклонению, и решение приходится
принимать не один раз, а непрерывно, зная лишь текущее состояние. Красовский и
Субботин доказали теорему об альтернативе: игра имеет цену, седловая точка в
классе позиционных стратегий существует. Но главным их вкладом было другое —
конструкция экстремального прицеливания: правило, по которому игрок на каждом
шаге целится в сопровождающую точку идеальной траектории, отвечая на фактическое
поведение соперника, а не на его предполагаемое поведение.
Для нас важна методологическая мораль. Красовский отделил два вопроса, которые
в наивном изложении GAN сливаются в один: «существует ли равновесие» и «какое
правило пошагового поведения к нему ведёт». Первый вопрос решается теоремой,
второй — конструкцией стратегии. Обучение GAN живёт целиком во втором вопросе:
доказанное pg=pdata ничего не говорит о том, что делают Adam,
батч из 128 объектов и поочерёдные обновления.
Схлопывание мод: узкий латент на реальных цифрах
Перейдём к настоящему обучению. Возьмём реальные данные — 1797 рукописных цифр
из sklearn — и спроецируем их на две дискриминантные оси, чтобы получить
двумерное распределение с десятью честными модами (по одной на цифру). Модой
считаем окрестность центра класса радиуса 0,412 (медиана внутриклассового
расстояния); мода покрыта, если в неё попал хотя бы 1% выборки генератора.
Формально доля выборки в моде k и признак покрытия записываются так:
Обучаем маленький GAN на numpy: генератор z→64→64→2, судья
2→64→64→1, LeakyReLU, Adam, non-saturating цель, 6000 шагов. Меняем
одну вещь — размерность шума. При z∈R8 генератор к концу покрывает
все 10 мод из 10. При z∈R1 образ генератора — кривая: одномерная
линия физически не может одновременно накрыть десять островов. Покрытие
колеблется между 1 и 8 модами, в среднем 4,9, к шагу 6000 равно 5. За обучение
покрытие падало 21 раз, и каждая из 10 мод хотя бы однажды была потеряна и
позже возвращена.
GAN с одномерным шумом на реальных цифрах. На шаге 200 покрыто 2 моды из 10 и
61% выборки лежит вне мод вообще, на шаге 1500 — 5 мод и 40%, на шаге 6000 —
опять 5 мод и 43%. Красная линия — буквально образ отрезка: генератор
протягивает кривую сквозь облако, задевая одни сгущения и пропуская другие.
Внизу доля выборки в каждой моде по времени: полосы гаснут и загораются, то
есть режимы не «накапливаются», а сменяют друг друга. Финальная картинка
скрывает эту динамику полностью.
Причина схлопывания не сводится к нехватке размерности. Судья видит один батч и
не наказывает за отсутствие редкой моды сразу; генератор получает похожие
градиенты для разных z и сносит их в одну область; судья наконец обучается
ловить это скопление, генератор перебегает в другое место — и цикл повторяется.
Узкий латент лишь делает механизм наглядным.
Реализм и покрытие — две разные оси
Соблазнительно свести качество генератора к одному числу. Наш эксперимент
показывает, чем это кончается. Посчитаем по методу ближайших соседей две
величины: precision — долю сгенерированных объектов, попавших в многообразие
реальных данных, и recall — долю реальных объектов, попавших в многообразие
сгенерированных (k=5, по 600 объектов в каждой выборке).
Многообразие здесь определяется через k-го ближайшего соседа: точка считается
принадлежащей выборке, если она попала в чей-нибудь шар радиуса до k-го соседа,
M(real)=i=1⋃nB(xi,∥xi−NNk(xi)∥).
Для генератора с z∈R8: precision 0,96, recall 0,99. Для
схлопнувшегося с z∈R1: precision 0,98 — выше! — а recall 0,10.
Схлопнувшийся генератор делает почти безупречные объекты; он просто делает их
десятую часть от нужного разнообразия.
Рис. 82.5. Реализм почти не падает, покрытие рушится
Схлопнувшийся генератор (справа) выигрывает по реализму: 0,98 против 0,96, ведь
все его точки лежат глубоко внутри плотных областей. По покрытию он проигрывает
почти в десять раз: 0,10 против 0,99. Любая одиночная метрика, смешивающая эти
две оси, объявит его как минимум не хуже. Раздельные измерения — единственный
способ увидеть провал.
Та же логика знакома по оценке классификатора: точность и полнота
меряют разные ошибки, и их среднее скрывает, какая именно случилась. У
генеративных моделей роль полноты играет покрытие распределения, и его нужно
измерять специально.
Кривая потерь не ведёт счёт матча
В обычном обучении падение потери — сигнал прогресса. В GAN это не так, и у нас
есть число: корреляция между потерей генератора и числом покрытых мод по всей
истории обучения равна 0,02. Практически ноль. Формально это обычный коэффициент корреляции по 61 замеру:
ρ=VarLG(t)⋅VarK(t)cov(LG(t),K(t))=0,02,
где K(t) — число покрытых мод на шаге t.
Финальные значения потерь —
1,35 у судьи и 0,70 у генератора — не отличают модель, покрывающую 5 мод, от
модели, покрывающей 10.
Отсюда практическое правило: чекпойнт нельзя выбирать по кривой потерь. Нужны
независимые измерения — покрытие, precision/recall, расстояние до реальных
объектов — и протокол выбора, зафиксированный заранее, как в
уроке про валидацию. Если метрики колеблются, честнее сообщить
диапазон последних чекпойнтов, чем единственное удачное число.
Wasserstein: мера, у которой не кончается уклон
Слабое место JS видно на простом примере. Пусть данные — узкое распределение
около нуля, а генератор — такое же, сдвинутое на θ. При θ=1 и
θ=2 носители практически не пересекаются, и JS равна 1,000 бит в обоих
случаях: её производная по θ численно равна 3⋅10−5, то есть
нулю. Мера не может подсказать, в какую сторону двигаться, потому что она уже
на потолке.
Сдвиг узкого распределения. JS выходит на плато в 1 бит уже при небольшом
сдвиге: при θ=1 и θ=2 она равна 1,000, наклон 3⋅10−5.
W1 равна 1,00 и 2,00 соответственно и растёт с постоянным наклоном 1.
Обучающий сигнал — это не значение меры, а её производная; на плато производная
исчезает.
Отсюда WGAN: вместо вероятностного судьи вводится критик f и приближается
двойственная форма Канторовича–Рубинштейна:
На практике оба матожидания заменяются средними по батчу:
W1=B1i=1∑Bf(xi)−B1i=1∑Bf(G(zi)).
Ограничение 1-липшицевости здесь не украшение: без него супремум бесконечен.
Его обеспечивают штрафом за градиент
λEx(∥∇xf(x)∥2−1)2,x=αx+(1−α)G(z),α∼U[0,1],
то есть на отрезках между реальными и поддельными объектами. Выход критика
нельзя читать как вероятность: это число произвольного масштаба, у которого
осмысленна только разность средних.
Лаборатория игры
Генератор, оптимальный судья и две моды распределения
График шире экрана — листайте по горизонтали →
Загружается живая иллюстрация…
Здесь всё считается точно: данные — модельная смесь двух гауссовых мод (пример
придуман, а не взят из наблюдений), судья не обучается, а берётся оптимальным
для текущего генератора. Уведите центр генератора далеко от данных (μ=4,5):
JS упрётся в 0,984 бит, W1 покажет 4,90, а модуль градиента по μ у
насыщающей цели составит 0,028 против 6,08 у non-saturating — разница в 217 раз.
Это ровно тот случай, ради которого меняли формулировку потери.
Затем поставьте генератор точно на левую моду (μ=−2, доля второй моды 0):
получится идеальное схлопывание — precision 0,99 при recall 0,60 и JS 0,236.
Раздуйте ширину (σ=2,5, μ=0) — картина зеркальная: recall 1,00, но
precision 0,62. И только когда доля второй моды поднята до 0,4, а центр стоит на
−2, обе плотности совпадают и JS обращается в нуль. Три способа быть неправым
и один — правым.
Как честно проверять генератор
Аудит генератора — это не одна метрика, а протокол. Минимальный список:
сетка выборок при фиксированныхz на всех чекпойнтах — показывает, как
меняются одни и те же латентные точки;
сетка при свежих z — показывает текущее распределение;
доля каждой моды по времени (тепловая карта рисунка 82.4);
precision и recall по методу ближайших соседей;
расстояния до ближайших обучающих объектов — тест на копирование;
разнообразие внутри класса для условных моделей.
Если сетка с фиксированными z улучшается, а покрытие свежих выборок падает,
генератор точечно полирует часть пространства. Если качество выросло сразу по
всем осям — вероятно, честно.
Схлопывание и запоминание — разные болезни
Генератор выдаёт мало разного по двум противоположным причинам. При схлопывании
множество z отображается почти в одну область. При запоминании выходы
разнообразны, но подозрительно близки к конкретным обучающим объектам. Тесты
нужны разные.
Проверка на запоминание строится на сравнении двух расстояний. Разобьём реальные
данные на обучающую часть и отложенную, которую генератор не видел, и для каждой
сгенерированной точки найдём ближайшего соседа в обеих. В нашем эксперименте
медиана расстояния до обучающих равна 0,050, до отложенных — 0,065; отношение
1,30. Небольшая систематическая близость к обучающим есть — она и должна быть,
ведь генератор учился именно на них, — но разрыв не похож на копирование, при
котором расстояние до обучающих упало бы почти до нуля.
Дополнительно применяют тест дня рождения: в большом сгенерированном наборе
ищут почти-дубликаты друг друга. Частые столкновения означают малый эффективный
носитель распределения. И измеряют локальную чувствительность: для пар близких
кодов z и z+δ смотрят, насколько различаются выходы. Если
∥δ∥∥G(z+δ)−G(z)∥≈0
в больших областях латента, значит направления в нём ничего не меняют — это
геометрический признак схлопывания, дополняющий подсчёт мод.
GAN среди других генераторов
Автокодировщик и VAE задают явный вероятностный
энкодер и компромисс между реконструкцией и априорным распределением; их
обучение — минимизация одной функции, а не игра, и потому оно устойчивее, но
результаты обычно более размытые. Диффузионные модели учат
многошаговое расшумление: обучение сводится к регрессии и стабильно, зато
генерация требует десятков проходов. GAN порождает объект за один проход и
способен на резкие детали, но платит за это хрупкой динамикой.
Равновесие не гарантирует траекторию
GAN сопоставляет два распределения через обучаемого критика — и это красивая
идея: функция потерь перестаёт быть выдумкой инженера и становится результатом
обучения. Идеальный оптимум описан точно: D∗=pdata/(pdata+pg),
V=−log4+2JS, минимум при совпадении распределений. Но путь к
нему проходит по векторному полю с вращением, а не по склону: в игре V=xy
одновременный шаг уводит от равновесия при любом η. По дороге исчезает
уклон у насыщающей цели, гаснут и загораются моды, а кривые потерь остаются
немы: корреляция потери генератора с покрытием 0,02.
Практический вывод короток. Формулировку цели выбирают по силе градиента, а не
только по расположению минимума. Обучение проверяют раздельно по трём осям —
реализм, покрытие, копирование, — и обязательно во времени, а не по последнему
чекпойнту. А доказанное существование равновесия, как учил Красовский, —
это ответ на другой вопрос, чем «как ходить». Следующий шаг — посмотреть, что
происходит с геометрией латентного пространства, когда игру
удаётся стабилизировать.