Почему encoder выдаёт распределение, а не одну точку?
Вариационный автокодировщик кодирует объект не точкой, а облаком. Реконструкция
требует сохранить детали, расстояние Кульбака — Лейблера требует уложить облака
в простое опорное распределение. Их спор и делает скрытое пространство пригодным
сразу для двух дел: восстанавливать старое и порождать новое.
Код, из которого нечего доставать
Возьмём 1797 рукописных цифр 8×8 из классического набора digits — по
1400 на обучение и 397 на проверку, яркость каждого из 64 пикселей поделена на
16 и превращена в число от нуля до единицы. Обучим на них обычный
автокодировщик с двумерным узким местом: кодировщик f(x)=z
сжимает картинку до двух чисел, декодировщик g(z)≈x разворачивает её
обратно. На обучающей выборке он работает хорошо: 19,6 ната ошибки на объект.
А теперь попробуем сделать то, ради чего вообще заводят порождающую модель:
взять случайную точку z∼N(0,I) и посмотреть, что нарисует
декодировщик. Результат обескураживает — и причина видна сразу, стоит
нарисовать облако кодов. Коды разъехались по квадрату со стороной почти 57:
максимальная координата равна 28,3. А в круге ∥z∥≤2, куда стандартная
двумерная нормаль кладёт 86,5% своей массы, лежит ровно 1,6% кодов.
Рис. 85.1. Одни и те же 1400 цифр в двумерном коде: два разных масштаба
Слева обычный автокодировщик: масштаб кода ничем не закреплён, поэтому облако
расползлось в десятки единиц, а окружности ∥z∥=1 и ∥z∥=2 съёжились в
точку у начала координат. Справа тот же кодировщик со штрафом Кульбака —
Лейблера при β=1: 87,8% кодов лежат внутри круга радиуса 2, то есть ровно
там, где живёт опорное распределение. Цвет — истинная цифра; ни та, ни другая
модель меток не видела.
Никто не просил автокодировщик держать коды около нуля — вот он и не держит.
Величина 21∑j(μj2+σj2−lnσj2−1), которая ниже
окажется центральной, равна у него 93,6 ната против 2,62 у вариационной версии.
Дело не в том, что коды «плохие»: линейный классификатор по этим двум числам
угадывает цифру в 74,1% случаев против 61,5% у VAE. Дело в том, что мы не знаем,
откуда брать новые z. Пространство кодов без заданного распределения — это
карта без масштабной линейки.
Кодировщик, который выдаёт распределение
Вариационный автокодировщик заменяет точку облаком. Кодировщик с параметрами
ϕ выдаёт для объекта x не вектор, а нормальное распределение с
диагональной ковариацией:
qϕ(z∣x)=N(μϕ(x),diagσϕ2(x)).
Опорное (априорное) распределение фиксировано и просто:
p(z)=N(0,I),
а декодировщик задаёт правдоподобие наблюдения:
pθ(x∣z)=k=1∏64Bern(xk∣gθ(z)k).
Оговоримся честно: яркость пикселя — не двоичная величина, мы трактуем её как
вероятность «зажечь пиксель». Это предположение о наблюдении, и оно влияет на всё
остальное; к нему мы ещё вернёмся.
Хочется, как в уроке 45, максимизировать logpθ(x). Но
интеграл по всем z не берётся: декодировщик — нейросеть, никакой формулы для
∫gθ(z)p(z)dz нет. Можно ли оценить интеграл выборкой из p(z)?
Формально да:
pθ(x)≈M1m=1∑Mpθ(x∣z(m)),z(m)∼p(z).
Практически — нет. Почти все случайные z дают ничтожное pθ(x∣z) для
конкретного x, и оценка почти всегда близка к нулю с редкими огромными
выбросами. Коды нужно брать не откуда попало, а оттуда, где они правдоподобны для
данного x. То есть нужен приближённый апостериор — тот же ход, что в
уроке 47, только вместо честной формулы Байеса мы будем учить
приближение.
Нижняя граница вместо неберущегося интеграла
Возьмём произвольное распределение q(z∣x) и вставим его под логарифм:
Есть и вторая дорога к тому же результату, и она объясняет размер зазора.
Подставив pθ(z∣x)=pθ(x,z)/pθ(x) в определение KL, получаем
тождество:
logpθ(x)=L(θ,ϕ;x)+DKL(qϕ(z∣x)∥pθ(z∣x)).
Расстояние Кульбака — Лейблера неотрицательно, поэтому ELBO действительно не
превосходит логарифма правдоподобия, а зазор равен ровно тому, насколько наш
приближённый апостериор отличается от истинного. Максимизируя L по
θ, мы улучшаем порождающую модель; максимизируя по ϕ — поджимаем
зазор. Одна формула тянет обе задачи.
KL в закрытой форме: за что именно штрафуют
Для нормальных распределений с диагональными ковариациями расстояние считается
вручную. Для одной координаты:
DKL(N(μ,σ2)∥N(0,1))=21(μ2+σ2−lnσ2−1),
а для d независимых координат слагаемые складываются:
Формула читается как счёт за две провинности. Слагаемое μ2 штрафует за уход
от начала координат: сдвиг на единицу при σ=1 стоит 0,5 ната. Слагаемое
σ2−lnσ2−1 штрафует за любую ширину, отличную от единичной, причём
несимметрично: при σ=2 штраф равен 0,807 ната, а при вдвое меньшей
σ=0,5 — только 0,318. Слишком широкое облако наказывается сильнее
слишком узкого — но наказание за узость растёт неограниченно: при σ→0
член −lnσ2 уходит в бесконечность. Именно это и запрещает вырождение в
точку, то самое вырождение, которое мы наблюдали у обычного автокодировщика.
Пинскер: почему малый KL вообще о чём-то говорит
Мы штрафуем DKL — величину, у которой нет наглядного смысла: она не
метрика (не симметрична и не подчиняется неравенству треугольника) и измеряется в
натах. Почему её малость означает, что распределения близки в человеческом смысле?
Ответ дал Марк Семёнович Пинскер, один из создателей советской школы теории
информации в Институте проблем передачи информации. В монографии 1960 года
«Информация и информационная устойчивость случайных величин и процессов» он
доказал неравенство, связывающее информационное уклонение с честной метрикой —
расстоянием по вариации:
AsupP(A)−Q(A)≤21DKL(P∥Q).
Левая часть — максимальная разница вероятностей одного и того же события,
величина от 0 до 1, понятная кому угодно. Правая — то, что мы оптимизируем. Малый
KL гарантирует, что никакое событие не различает распределения сильно. Обратное
неверно, и это тоже важно: KL может быть огромным при крошечном расстоянии по
вариации.
Для нашего дела вывод такой: добиваясь малого DKL(q∥p), мы
получаем право сэмплировать из p вместо q — ошибка в вероятности любого
события ограничена корнем. Заодно понятно, почему в уроке 20
кросс-энтропия оказалась естественной функцией потерь: она отличается от KL на
энтропию данных, то есть на константу.
Репараметризация: как провести градиент сквозь жребий
ELBO содержит математическое ожидание по qϕ, а параметры ϕ сидят
внутри самого распределения. Наивная выборка z∼N(μ,σ2)
разрывает вычислительный граф: узел «бросить жребий» не имеет производной по
μ. Спасает элементарная замена переменной:
ε∼N(0,I),z=μ+σ⊙ε.
Теперь случайность живёт в отдельном входе ε, который не зависит от
параметров, а z — гладкая функция от μ и σ. Обратное распространение
из урока 25 проходит насквозь:
∂μ∂z=1,∂σ∂z=ε.
Есть и альтернатива — оценка через логарифмическую производную (её называют
score-function, или REINFORCE):
∇μEq[f(z)]=Eq[f(z)∇μlogq(z)].
Обе оценки несмещённые, но неравноценные. Возьмём игрушечный пример f(z)=z2,
z∼N(μ,1), μ=1; истинный градиент равен 2μ=2. На 20 000
жребиев обе оценки дали в среднем 2,03 и 2,04 — несмещённость видна. А вот
разброс различается радикально: 4,0 против 31,45, то есть в 7,9 раза.
Рис. 85.2. Репараметризация: путь градиента обходит жребий
Слева: жребий ε входит сбоку, поэтому красный путь градиента ведёт от
декодировщика через z к обоим выходам кодировщика. Справа: две несмещённые
оценки одного и того же градиента. Обе в среднем дают 2, но разброс отличается в
7,9 раза; оценка через логарифмическую производную даёт узкий пик у нуля и редкие
большие выбросы. Меньший разброс — меньше шума в
стохастическом спуске и быстрее сходимость.
Лаборатория: спор реконструкции и штрафа
Ниже — модель, которую можно решить на бумаге и потому не нужно обучать. Пусть
объектов K штук, у каждого есть «своя точка» ti на прямой, декодировщик —
тождественное отображение g(z)=z, а апостериор
q(z∣xi)=N(μi,σ2) с общей шириной. Ошибка реконструкции
для объекта:
Две формулы описывают всё поведение VAE в миниатюре. Коды сжимаются к нулю в
2/(2+β) раз — это ровно то же стягивание, что у регуляризованной регрессии
в уроке 23. Ширина облака растёт от нуля к единице. При β=0
получается детерминированный автокодировщик, при β→∞ — μ→0 и
σ→1: апостериор в точности совпал с опорным распределением и не несёт об
объекте ничего.
Сжатие кодов, ширина облаков и кривая «скорость — искажение»
График шире экрана — листайте по горизонтали →
Загружается живая иллюстрация…
Проверьте на виджете: при β=1 и пяти объектах с шагом 1,6 сжатие равно
0,667, ширина σ=0,577, скорость 1,354 ната, искажение 0,902, а
узнаваемость объекта (доля жребиев, попадающих ближе к своей цели, чем к чужой)
равна 56,3%. Поднимите β до 8 — узнаваемость падает до 25,0% при случайном
угадывании 20,0%: код почти перестал различать объекты. Сдвиньте ползунок
«разнос объектов» — и увидите, что при тесно расположенных целях та же ширина
облака губит узнаваемость гораздо раньше.
Скорость и искажение: чем платит β
Обобщённая цель β-VAE записывается как сумма двух слагаемых с явным весом:
Слова «скорость» и «искажение» здесь не метафора: это термины теории информации.
Скорость — сколько информации код несёт об объекте сверх опорного распределения;
искажение — насколько плохо объект восстанавливается. Меняя β, мы движемся
по границе достижимых пар, как по шенноновской кривой для источника с критерием
точности.
Обучим на тех же цифрах восьмимерный VAE при восьми значениях β (обучение с
нуля, один и тот же seed, 300 эпох). Числа на тестовой выборке:
Самая поучительная строка — вторая. Переход от β=0 к β=0,25
уменьшает скорость в 13,8 раза (со 133,89 до 9,72 ната), а платит за это ростом
искажения на 0,18 ната. Почти вся «информация», которую нёс код обычного
автокодировщика, была не нужна для восстановления: это был произвольный масштаб,
который мы разбирали в начале урока.
Рис. 85.3. Кривая «скорость — искажение» и вклад отдельных координат
Слева: восемь обученных моделей в осях «скорость — искажение». Кривая почти
плоская справа (лишние наты не улучшают реконструкцию) и обрывается вверх слева,
где код опустел. Справа: вклад каждой из восьми координат в KL. При
β=0,25 работают все восемь, при β=1 — шесть, при β=2 —
четыре, при β=8 — ни одной. Координаты выключаются не хором, а по очереди.
Коллапс апостериора: оптимизатор нашёл лазейку
При β=4 и β=8 обе колонки застывают: скорость 0,00, активных
координат 0, искажение 27,1 ната. Ровно столько же — 27,1 ната — даёт тривиальный
предсказатель, выдающий средний по обучающей выборке пиксель и вообще не глядящий
на объект. Это и есть коллапс апостериора: модель сочла, что дешевле отказаться от
кода, чем платить за него.
qϕ(z∣x)≈p(z)⟹DKL≈0,pθ(x∣z)≈pθ(x).
Коварство в том, что цель при этом выглядит достойно: ELBO равна −27,1 ната и
больше не меняется, обучение «сошлось». Никакая кривая обучения об ошибке не
кричит. Кричит только диагностика: число активных координат
#{j:Varxμj(x)>0,01} и линейный зонд, упавший до 22,9%.
Сетка опорного распределения: карта, по которой можно ходить
Самая честная проверка порождающей модели — декодировать не коды объектов, а
регулярную сетку квантилей опорного распределения. Возьмём 11 квантилей от 0,02
до 0,98 по каждой оси, получим 121 точку и посмотрим на картинки.
Рис. 85.4. Декодированная сетка квантилей стандартной нормали
Слева обычный автокодировщик: 121 точка опорного распределения попала в крошечный
уголок его облака кодов, поэтому вся сетка занята почти одной и той же размытой
фигурой; разброс яркостей по сетке равен 0,096. Справа VAE: та же сетка
разворачивается в атлас цифр, разброс 0,151, а среднее расстояние до ближайшей
обучающей картинки меньше — 1,11 против 1,26. Ни одна из моделей не видела
меток; порядок цифр на карте — следствие похожести начертаний.
Такая сетка честнее случайных примеров: её нельзя подобрать. Публикуя «примеры
работы порождающей модели», всегда указывайте, как выбирались точки, — иначе
читатель видит результат отбора, а не свойство модели.
Агрегат апостериоров не равен опорному распределению
Штраф действует пообъектно: каждое облако q(z∣xi) прижимается к
N(0,I). Но сэмплируем мы из общего распределения, и сравнивать надо
смесь:
q(z)=N1i=1∑Nq(z∣xi).
Малость среднего пообъектного KL не влечёт совпадения смеси с опорным
распределением. Более того, из разложения
видно, что штраф давит сразу на две вещи: на информативность кода и на
несовпадение смеси. Уменьшая его, мы не различаем, что именно уменьшилось. На
наших цифрах средний радиус кода из агрегата равен 1,33, из опорного
распределения — 1,24: смесь заметно шире.
Рис. 85.5. Агрегат апостериоров против опорного распределения
Слева: 1400 жребиев из агрегата q(z) поверх такого же числа жребиев из
N(0,I). Крест — самая пустая точка квадрата [−1,9;1,9]2: до
ближайшего кода 0,85. Плюс — самая плотная: 0,001. Справа: распределения радиусов
различаются, средние 1,33 против 1,24. Формально пообъектный KL мал, но сэмплы
берутся именно из серого облака, а данные живут в синем.
Средний код и средняя картинка — разные объекты
Реконструировать можно двумя способами: подать декодировщику μ(x) или
усреднить декодирования нескольких жребиев. Это не одно и то же, потому что
декодировщик нелинеен:
g(Ez)=Eg(z).
На объекте с самым широким апостериором (максимальная координата σ равна
0,703) двести жребиев дают среднее декодирование, отличающееся от g(μ) в
среднем на 0,012 яркости, а в отдельных пикселях — на 0,05. Максимальная
дисперсия пикселя по жребиям равна 0,046 и сосредоточена на границах штриха: там
модель и вправду не знает, где проходит линия.
Рис. 85.6. Прогулка по латенту и разница среднего кода и средней картинки
Сверху: восемь точек отрезка между кодами двух тестовых цифр; переход
непрерывный, промежуточные картинки — законные, но не обязательно существующие
знаки. Снизу: декодирование среднего кода и среднее двухсот декодирований
различаются, максимум разности 0,05; карта дисперсии показывает, что
неуверенность сосредоточена на границах штриха, а не размазана равномерно.
Почему картинки размыты — и почему это не лень сети
Обычное обвинение: «VAE даёт размытые изображения». Полезно уточнять, кого именно
обвиняют. Возьмём две одинаково допустимые картинки A и B при одном и том же
условии. Если модель обязана выдать одну картинку и оценивается по среднему
квадрату ошибки, то оптимально выдать их среднее:
argx^min21∥x^−A∥2+21∥x^−B∥2=2A+B.
На двух реальных цифрах полусумма даёт MSE 0,0173 против 0,0346 у любого из двух
чётких вариантов — ровно вдвое меньше. То есть размытие — точный оптимум
выбранной функции потерь, а не слабость оптимизатора. Как и в
уроке 20, функция потерь есть предположение о шуме: квадрат
подразумевает нормальный шум, поэлементная кросс-энтропия — независимые
бернуллиевские пиксели. Ни то, ни другое не умеет сказать «здесь возможны два
разных исхода».
Место VAE среди порождающих моделей
Состязательные сети оптимизируют качество примеров напрямую и не
дают ни кодировщика, ни правдоподобия; VAE даёт и то, и другое, но платит
размытием. Диффузионные модели используют тот же нормальный шум, но
разворачивают его в длинную цепочку расшумления прямо в пространстве данных. В
современных системах эти линии сходятся: VAE работает сжимателем, а диффузия
живёт в его латенте — тогда искажение VAE задаёт потолок деталей, а размер
латента определяет цену расшумления.
Полезно сравнить и с контрастивным обучением: там инварианты
выбираются явно, парами «похоже — не похоже». VAE сохраняет то, что нужно для
восстановления, а не то, что удобно классификатору, — отсюда и разница в
поведении линейного зонда. А само разложение цели на «подгонку» и «штраф» — та же
конструкция, что в уроке 23 и в байесовском обновлении:
данные тянут в одну сторону, априорное предположение — в другую.
Работа Гельфанда и Яглома объясняет, почему «скорость» в нашей таблице — это
взаимная информация между объектом и кодом, а неравенство Пинскера объясняет,
почему её малость означает практическую неразличимость. Обе линии выросли из
одной школы и ровно в те годы, когда информация только становилась
математическим понятием.
Что остаётся в руках
VAE превращает сжатие в вероятностный вывод. Нижняя граница раскладывает
неберущуюся задачу на два понятных слагаемых, репараметризация проводит градиент
сквозь жребий с разбросом в 7,9 раза меньшим, чем у альтернативы, а вес β
переводит модель вдоль кривой «скорость — искажение»: от 133,89 ната кода при
16,5 ната ошибки до нуля нат кода при 27,1. Успех нельзя измерить одной
реконструкцией: нужны сетка опорного распределения, число активных координат и
явная проверка на коллапс. И главное — помнить, что размытость картинки часто
говорит не о сети, а о том, что мы попросили её усреднить неопределённое будущее.