Как разделить крупную структуру и мелкий стиль изображения?
StyleGAN разделяет случайный код и управление масштабами генератора: ранние
уровни задают геометрию, поздние уточняют текстуру. Та же чувствительность
нейросетей, которая делает редактирование плавным, напоминает о другой стороне —
малые направленные возмущения могут резко менять решение. В этом уроке мы
доводим оба сюжета до чисел: собственный маленький генератор, у которого можно
измерить всё, и классификатор, который ломается от сдвига в шесть сотых шкалы
яркости.
Почему исходный шум неудобен
В обычном GAN шум z∼N(0,I) подаётся прямо в
generator. Координаты z не обязаны соответствовать осмысленным изменениям:
путь между двумя кодами может менять позу, фон и идентичность одновременно.
Причина проста. Распределение реальных картинок занимает в пространстве пикселей
искривлённое множество малой размерности, а N(0,I) — идеально
круглый шар. Чтобы натянуть шар на кривое множество, генератор вынужден сильно
растягивать одни направления и сминать другие, и «прямая» в z превращается в
петляющую траекторию на многообразии.
а affine-преобразования Aℓ(w) управляют слоями synthesis network:
hℓ+1=Convℓ(hℓ;θℓ,sℓ=Aℓ(w)).
Mapping может «развернуть» распределение: у w нет обязанности быть
гауссовым, и сеть вольна отдать искривление отображению f, оставив
synthesis более ровным. Generator при этом начинает не с пространственной
карты, полученной из z, а с обучаемой константы h0 размера 4×4; на
каждом масштабе style модулирует каналы свёртки, а отдельный случайный noise
добавляет мелкие стохастические детали вроде отдельных волосков.
Обратите внимание на слово «возникающему». Разделение не задано формулой и не
гарантировано теоремой: это наблюдение, которое надо проверять измерением
каждый раз заново. Именно такую проверку мы и построим.
Модуляция и демодуляция
Пусть style даёт коэффициенты si для входных каналов свёртки. Веса
модулируются:
wijk′=siwijk.
Затем demodulation нормирует выходной канал:
wijk′′=∑i,k(wijk′)2+εwijk′.
Смысл второй формулы виден, если посчитать дисперсию выхода. Для входа с
единичной дисперсией и независимых координат
Var(i,k∑wijk′xik)=i,k∑(wijk′)2,
так что деление на корень из этой суммы возвращает выходу масштаб около
единицы при любом style. Style меняет относительный вклад каналов, а не
громкость сигнала; сеть не сползает в насыщение и не гаснет.
Path length regularization поощряет одинаковый масштаб изменения изображения
при одинаковом шаге в latent:
Ew,y(∥Jw⊤y∥2−a)2,Jw=∂w∂G(w).
Она делает геометрию более ровной, но не гарантирует независимых семантических
осей: ровность длины шага и независимость смыслов — разные требования.
Генератор, у которого можно измерить всё
Проверять заявления про StyleGAN на самом StyleGAN трудно: веса весят
гигабайты, а один эксперимент занимает часы. Поэтому дальше мы работаем с
честной уменьшенной моделью. Возьмём реальные рукописные цифры (набор
load_digits: 1797 изображений 8×8, значения яркости от 0 до
16), разделим их на 1257 обучающих и 540 тестовых и построим линейный
генератор
G(w)=m+j=1∑Kwjvj=m+Vw,K=20,
где m — средний образ, а vj — главные направления обучающей выборки из
урока про PCA. Это не GAN: отображение линейно, и никакой
дискриминатор здесь не спорит с генератором. Но два интересующих нас свойства
у него настоящие. Во-первых, код входит на разных масштабах: ранние оси несут
крупную геометрию, поздние — мелкие детали. Во-вторых, у него есть выученное
многообразие, вне которого инверсия не работает. Всё, что ниже, посчитано
скриптом на этих данных и заассерчено.
Первые четыре оси объясняют 48,6% разброса, оси с семнадцатой по
двадцатую — всего 4,5%, а все двадцать вместе — 89,4%. Это уже
подсказывает, кто отвечает за форму, а кто за отделку.
Рис. 83.1. Ранние координаты двигают геометрию, поздние правят детали
Слева в каждой строке — средний образ, роль обучаемой константы StyleGAN.
Дальше к нему добавлен сдвиг вдоль одной оси латента в масштабе трёх её
стандартных отклонений. Верхняя строка (оси 1–4, 48,6% дисперсии) меняет
силуэт целиком; нижняя (оси 17–20, 4,5%) едва трогает форму и правит
фактуру. Это и есть «крупный стиль» против «мелкой текстуры», только
измеренный, а не заявленный.
Смешение стилей как измеримый эксперимент
Возьмём два кода wA и wB. До границы c используем координаты A,
после — координаты B:
w(c)=(wA,1,…,wA,c,wB,c+1,…,wB,K).
При c=0 получается ровно B, при c=K — ровно A. Матрица mixing
experiment должна показывать не лучшие четыре примера, а фиксированную сетку
источников и границу слоёв.
Рис. 83.2. Смешение кодов: слева всё от B, справа всё от A
Три случайные пары тестовых цифр, границы c=0,2,4,6,10,20. Крупная форма
переходит к источнику A рано: уже при c=4 силуэт похож на правый столбец,
хотя четырнадцать из двадцати координат ещё принадлежат B. Мелкая фактура,
наоборот, держится за B почти до конца. Ни один столбец не отобран как
удачный — это первые три пары из фиксированной перестановки.
Чтобы не спорить впечатлениями, введём измеримые признаки. Все три —
линейные функционалы изображения, поэтому доля наследования считается
однозначно:
Последний — коэффициент при самой высокой пространственной частоте
(«шахматная мода»): мельче на решётке 8×8 уже ничего нет. Для каждой
границы посчитаем долю признака, унаследованную от A:
Sf(c)=f(G(wA))−f(G(wB))f(G(w(c)))−f(G(wB)).
По 200 парам тестовых цифр берём медиану — она устойчива к парам, у которых
знаменатель случайно мал.
Рис. 83.3. Крупный признак переходит к A рано, мелкий — поздно
Медиана по 200 парам. Крупный признак пересекает отметку 50% при c=4,
общее количество чернил — при c=12, шахматная мода — при c=14. На границе
c=4 крупный признак уже на 78% принадлежит A, а мелкий — лишь на 4%.
Разделение масштабов существует, но оно не ступенька: кривые плавные и
пересекаются, поэтому «ранний = поза, поздний = текстура» — тенденция, а не
закон.
Чтобы шаг значил одно и то же
У StyleGAN есть неприятность, которую легко увидеть на стенде. Если писать
код в «сырых» единицах главных компонент, шаг длины 1 по первой оси двигает
картинку в 4,0 раза сильнее, чем такой же шаг по двадцатой: стандартные
отклонения координат различаются во столько же раз. Ползунок в интерфейсе
редактора при этом честно показывает «единицу» и там и там, а пользователь
видит то землетрясение, то ничего.
Отношение крайних масштабов и есть измеренная четвёрка:
λ20λ1=4,0.
Отсюда рецепт: измерять шаг в единицах разброса самой координаты
(δj=αλj) либо, как в StyleGAN, штрафовать
отклонение ∥Jw⊤y∥2 от постоянной. Обе меры — про одно: сделать
слово «шаг» осмысленным.
Лаборатория масштаба
Крупный стиль, мелкая текстура и направленное возмущение
График шире экрана — листайте по горизонтали →
Загружается живая иллюстрация…
Первая вкладка: два кода, ползунок границы смешения и два измеримых
признака — крупный (горизонтальный момент) и мелкий (шахматная мода).
Передвигайте границу и следите не за впечатлением, а за числами в правой
колонке: крупный признак уходит к источнику A уже на первых координатах,
мелкий держится за B почти до конца. Нажмите «новые источники» несколько раз —
порядок сохраняется, а конкретные проценты пляшут: это и есть разница между
тенденцией и законом.
Вторая вкладка: к картинке прибавляется возмущение с одинаковым бюджетом на
каждый пиксель — один раз вдоль знаков весов линейной оценки, один раз со
случайными знаками. Картинки выглядят одинаково зашумлёнными; сдвиг оценки
различается в несколько раз. Ползунок ε показывает, что дело не в
величине шума, а в его направлении.
Pixel loss хранит точные цвета, perceptual loss — признаки сети ϕ. В
линейном стенде с ортонормированным базисом задача решается в одну строку:
w∗=V⊤(x−m),G(w∗)=m+VV⊤(x−m),
то есть инверсия — ортогональная проекция на выученное подпространство, а
ошибка равна норме составляющей, которая в него не попала:
∥x−G(w∗)∥22=∥(I−VV⊤)(x−m)∥22.
Отсюда главный вывод про инверсию: она честно восстанавливает только то, что
лежит на многообразии. Средняя ошибка на реальных тестовых цифрах при K=20
равна 1,38 уровня яркости на пиксель (при шкале 0..16). Та же процедура
на «шахматке» даёт 9,15, на «рамке» — 8,76: в 6,6 раза хуже, чем
на цифрах. Генератор не умеет сказать «это не цифра» — он говорит ближайшую
цифру.
Рис. 83.4. Что генератор умеет повторить, а что — нет
Реальная цифра восстанавливается почти точно уже при k=20; шахматка и рамка
превращаются в размытые цифроподобные пятна. Кривые справа показывают
ошибку восстановления в зависимости от размерности латента: для цифр она
быстро падает, для посторонних картинок держится высоко и сваливается лишь
при k=64, когда «латент» перестаёт быть узким местом и просто копирует все
пиксели.
Расширенное пространство W+ разрешает отдельный style каждому слою и
реконструирует лучше — в стенде это соответствует росту K. При k=40
средняя ошибка восстановления 0,45 против 2,15 при k=10: почти
впятеро точнее. Но за это платят устойчивостью редактирования, и это тоже
измеримо.
Некорректная задача и спасительный компакт
Инверсия — типичная обратная задача: по результату x восстановить причину
w. Такие задачи знамениты своей неустойчивостью.
Стоит нарушиться третьему условию — и малый шум в x даёт огромное изменение
в w. В нашем стенде это видно на формуле: если бы мы разрешили латенту
размерность 64 и стали приближать пиксели точно, коэффициенты при осях с
крошечными λj ловили бы чистый шум и разлетались.
Здесь и вступает советская школа обратных задач, и в этом уроке её представляют
двое Лаврентьевых. Михаил Алексеевич Лаврентьев в 1930-е годы построил
теорию квазиконформных отображений: он предложил измерять отображение не
одной производной, а характеристикой искажения — тем, во сколько раз
маленькая окружность превращается в вытянутый эллипс, и в какую сторону этот
эллипс наклонён. Это ровно тот язык, на котором сегодня говорят о якобиане
генератора: path length regularization требует, чтобы искажение было
ограничено, то есть чтобы отображение оставалось «почти конформным» и шаг в
латенте значил одно и то же в любой точке.
Михаил Михайлович Лаврентьев (сын) в книге «О некоторых некорректных
задачах математической физики» (1962) ввёл понятие условной корректности:
задача, неустойчивая на всём пространстве, становится устойчивой, если
заранее известно, что решение принадлежит компактному множеству. Оценка
условной устойчивости имеет вид
∥w1−w2∥≤ω(∥G(w1)−G(w2)∥),w1,w2∈M,
где M компактно, а ω — модуль непрерывности, стремящийся к нулю.
Именно это и делает генератор: он сужает множество допустимых картинок до
своего многообразия и тем превращает безнадёжную задачу «найти код по
пикселям» в разрешимую. Обратная сторона той же медали — то, что мы уже
измерили: всё, что лежит вне M, будет насильно приведено к ближайшей точке
M, и шахматка станет цифрой.
Редактирование: цель и побочный эффект
После инверсии можно двигать w∗+αd, где d — найденное направление
признака. Найдём его честно: линейной регрессией предскажем количество чернил
по коду. Модель объясняет 95,8% дисперсии признака, а нормированный
вектор коэффициентов и есть направление «жирности».
Шаг измеряем в единицах разброса самого признака вдоль d
(σd=5,23). Целевой эффект растёт монотонно: при α=3σd
чернил становится больше на 1,30 уровня яркости, при α=8σd —
на 3,13. Побочный эффект тоже виден: доля картинок, у которых
классификатор не поменял ответ, падает со 100% при α≤σd до
98% при 3σd и 92% при 8σd. У направления есть рабочий
диапазон, и интерфейс редактора обязан его показывать, а не молча
экстраполировать.
Рис. 83.5. Цена устойчивости и рабочий диапазон редактирования
Слева: обучение на атаках поднимает точность под PGD с 32,4% до
56,5%, но чистая точность падает с 97,4% до 93,3% — устойчивость
покупается за четыре процентных пункта. Справа: целевой эффект (прирост
чернил) растёт почти линейно, а идентичность разрушается медленно и
нелинейно. Пока обе кривые смотрят в нужную сторону, редактирование работает;
дальше начинается экстраполяция.
Состязательное возмущение
Теперь вторая половина урока. Тот же вопрос — как реагирует функция на
маленький сдвиг входа — но с враждебной целью. Обучим на тех же цифрах
многоклассовую логистическую регрессию: чистая точность на тесте 97,4%.
Атакуем в ограничении ∥δ∥∞≤ε методом FGSM:
xadv=x+εsign∇xL(fθ(x),y).
Почему знак, а не сам градиент? Потому что при линейном приближении
L(x+δ)≈L(x)+δ⊤∇xL,
и максимум линейной функции на кубе ∥δ∥∞≤ε
достигается в его вершине:
∥δ∥∞≤εmaxδ⊤g=ε∥g∥1,δ∗=εsigng.
Projected Gradient Descent повторяет маленькие шаги и проецирует обратно:
xk+1=ΠBε(x)(xk+αsign∇xL(fθ(xk),y)).
При ε=0,15 (пятнадцать сотых от полной шкалы яркости) точность
падает с 97,4% до 35,2% для FGSM и до 32,4% для PGD в десять
шагов. Случайный шум ровно того же бюджета оставляет 94,3%. Разница между
32% и 94% — это и есть цена слова «направленное».
Слева: настоящая семёрка с уверенностью 0,99, возмущение (усиленное
вдесятеро для видимости) и результат — двойка с уверенностью 0,52. Справа:
точность против бюджета ε. Красная и фиолетовая кривые (FGSM и
PGD) валятся, зелёная (случайный шум той же нормы) держится. Вертикальная
линия — режим ε=0,15, о котором идёт речь в тексте.
Две цитаты спорят друг с другом, и спор поучителен. Первая объясняет эффект
экзотикой высокой размерности, вторая — самой обыкновенной линейностью. Наш
стенд на стороне второй: модель линейна до последнего знака, никаких «карманов
низкой вероятности» в ней нет, а атака всё равно работает.
Почему направление важнее нормы
Посчитаем прямо. Для линейной оценки s(x)=v⊤x направленное возмущение
даёт сдвиг
Δsнапр=ε∥v∥1,
а случайные знаки ri=±1 — случайную величину со средним нулём и
стандартным отклонением
Var(εv⊤r)=ε∥v∥2.
Отношение ∥v∥1/∥v∥2 доходит до d и равно ему, когда все
координаты весов одинаковы по модулю. При d=64 это восьмикратная разница
между «согласованным» и «случайным» сдвигом при абсолютно одинаковой норме
ℓ∞. Наши измерения согласуются: при ε=0,15 каждый
пиксель сдвинут не более чем на 0,15, средняя ℓ2-норма возмущения
равна 1,01 при теоретическом потолке 0,1564=1,2 — и этой
малости хватает, чтобы уронить точность втрое.
Защита и честная атака
Adversarial training минимизирует worst-case loss:
θminE(x,y)∥δ∥≤εmaxL(fθ(x+δ),y).
Это в точности седловая задача из урока про min-max: внешний
игрок выбирает веса, внутренний — возмущение. Внутренний максимум приближают
несколькими шагами PGD прямо внутри обучающего цикла. Мы это сделали:
модель, каждый батч которой атаковали FGSM при ε=0,15, показала
56,5% под PGD вместо 32,4% у обычной — плюс 24,1 процентных
пункта устойчивости. И потеряла 4,1 пункта чистой точности. Robust
accuracy почти всегда ниже clean accuracy: устойчивость имеет цену, и её надо
называть.
Слабая атака создаёт ложное чувство защиты. Полезный индикатор — сравнение
белого ящика с переносом: примеры, построенные на обычной модели и поданные
защищённой, оставляют ей 60,0% — заметно больше, чем прямая атака
(56,5%). Это правильный порядок: белый ящик должен быть сильнее переноса.
Если бы вышло наоборот, мы заподозрили бы gradient masking — ситуацию, когда
градиент испорчен (обнулён, зашумлён, оборван), атака по нему не находит
направления, а модель на самом деле не устойчива. Тогда её ломает чёрный ящик
или атака без градиента.
Сравнивать защиты можно лишь при одинаковом бюджете атаки. Число шагов,
рестарты, размер шага и доступ к градиенту записывайте рядом с robust
accuracy, иначе одна цифра не воспроизводит эксперимент. Здесь работает та же
логика честной оценки, что и в уроке про переплату за выбор
модели: чем больше защит вы перебрали по одной и той же атаке,
тем оптимистичнее лучшая из полученных цифр.
Данные, лица и ответственность
FFHQ содержит 70000 изображений лиц, собранных из Flickr с проверкой
лицензий. Набор разнообразнее ранних celebrity datasets, но не представляет
случайную выборку мира: Flickr снимают те, у кого есть камера и привычка
публиковать. Генерация лиц создаёт риски для идентичности и согласия и
открывает возможность злоупотребления.
Приём truncation, которым улучшают картинку, — тоже вмешательство в
распределение:
w′=wˉ+ψ(w−wˉ),0<ψ<1,
и при ψ<1 выборка стягивается к среднему лицу: качество растёт,
разнообразие падает.
Аудит StyleGAN включает: поиск ближайших соседей в обучающей выборке
(не запомнил ли генератор конкретных людей); качество по возрастным и
визуальным группам; failure cases аксессуаров и фона; provenance выхода;
ограничения на распространение весов; проверку редактирования на сохранение
identity. Техническая редактируемость не равна этической допустимости
применения.
Мини-исследование: редактирование без скрытой подмены
Выберите measurable attribute — например, угол поворота головы — и
направление d в latent. Для 200 исходных кодов примените α∈[−3,3].
Целевой эффект измерьте pose estimator-ом, побочные — identity similarity,
фоном, яркостью и другими атрибутами. Покажите среднюю кривую вместе с худшими
10%.
Проведите cycle test: примените +αd, затем −αd. В идеальной
линейной геометрии вернётся исходник; ошибка возврата обнаруживает
нелинейность и обрезку. Сравните W и W+: второй лучше реконструирует, но
может хуже выдерживать цикл — на нашем стенде именно так и вышло. Такой
протокол соединяет инверсию VAE и StyleGAN: latent edit
оценивается как преобразование с целью и побочными эффектами, а не как
галерея удачных лиц.
Мини-исследование: перцептивная и нормативная малость
Для состязательных возмущений вычислите одновременно ℓ∞, ℓ2,
LPIPS и результат печать–фото или JPEG. Малое значение одной нормы не означает
незаметности в другой. Покажите диаграмму рассеяния «успех атаки против каждой
меры».
Добавьте targeted attack: требуется не любой неверный класс, а заданный.
Сравните необходимую норму и число шагов с untargeted-режимом; целевая задача
обычно труднее и лучше проверяет, управляет ли атака решением. Проверьте
физические преобразования: случайные crop, JPEG и небольшую перспективу на
каждом шаге PGD через expectation over transformations. Если возмущение
сохраняет эффект, угроза серьёзнее. Но по-прежнему не называйте его
«незаметным», пока это не проверено людьми и предметными ограничениями.
Не смешивайте robustness и calibration. Модель может сохранить правильный
класс под атакой, но выдавать чрезмерную уверенность, либо менять класс и
честно снижать confidence. Стройте robust accuracy, отрицательное
логарифмическое правдоподобие и кривую отказов от ответа — так же, как при
выборе порога решения. При рандомизированной защите атака
обязана усреднять градиент по случайности: один forward даёт шумную оценку и
завышает защиту.
Геометрия должна выдержать вмешательство
Мы прошли один и тот же вопрос дважды. Сначала дружелюбно: как меняется
картинка, если чуть сдвинуть код, — и получили измеримое разделение масштабов
(крупный признак наследуется от источника A при c=4, мелкий при c=14),
рабочий диапазон редактирования и честную границу инверсии (ошибка 1,38
на цифрах против 9,15 на посторонней картинке). Потом враждебно: как
меняется решение, если чуть сдвинуть вход, — и получили падение точности с
97,4% до 32,4% при возмущении, которое случайным шумом той же нормы
не воспроизводится (94,3%).
Общее у двух половин — предмет изучения: локальная геометрия отображения в
многомерном пространстве. Разница — в намерении наблюдателя. И в обоих случаях
надёжный вывод требует измерения на фиксированной выборке с заранее
объявленной метрикой, а не одной впечатляющей картинки: галерея удачных
редактирований и одна цифра robust accuracy без описания бюджета атаки — это
свидетельства одинаково малой силы.