Comments 15
+1 и буду ждать статью про VAE + GAN. Единственное, что не понял, это:
Если метрика L_2, то мы считаем шум нормальным
А как эти понятия вообще связаны в данном случае?
Обычный метод наименьших квадратов есть частный случай метода максимума правдоподобия для нормального распределения (соответственно, минимизация абсолютного отклонения (L1 ошибка) эквивалента ММП для распределения Лапласа).
Ну а здесь примерно так же, только мы берём мат. ожидание от правдоподобия p(X|Z) по скрытым переменным Z (надо же нам их откуда-то взять).
Ясно, что распространять ошибки через случайные значения напрямую нельзя
На самом деле можно (формула 6), но лучше от этого не становится.
В VAE должно учиться распределение p(x|z) и генерация x должна производиться по выбранному z в соответствии с ним.
Или я что-то упустил?
Декодер здесь детерминирован в смысле детерминированной генерации параметров распределения p(x|z), на графиках, соответственно, не сами семплы, а распределение, из которого они приходят.
Правда, обучающая выборка не бинаризована (ну это происходит как-то неявно) и используется в сочетании с лог-лоссом, что не очень хорошо.
на графиках, соответственно, не сами семплы, а распределение, из которого они приходят
Я имел в виду, что само распределение в коде никак не фигурирует.
Выход модели — тензор decoded, который просто является выходом последнего dense-слоя.
В посте фигурирует формула P(X|Z) = f(Z) + \epsilon, вроде бы понятно, что decoded это f(Z), но \epsilon осталось за кадром. И на графиках, соответственно, значения f(Z).
При этом в vae_loss должно, согласно теории, использоваться матожидание log P(X|Z) по сэмплам из Q(Z|X), которое должно вычисляться каким-нибудь методом Монте-Карло, а по факту используется бинарная кросс-энтропия между decoded и X, как в обычном автоэнкодере.
P.S. Это был ответ barmaley_exe, не туда ткнул…
А какого фигурирования распределения в коде Вы хотите? Распределение на случайную величину, принимающую два значения, задаётся одним числом от 0 до 1 – вероятностью первого исхода. VAE предполагает условную независимость наблюдений X при условии кода Z, поэтому для задания распределения p(X|Z) достаточно задать по одному числу на каждый пиксель в X.
в vae_loss должно, согласно теории, использоваться матожидание log P(X|Z) по сэмплам из Q(Z|X), которое должно вычисляться каким-нибудь методом Монте-Карло, а по факту используется бинарная кросс-энтропия
Бинарная кросс-энтропия и есть логарифм распределения Бернулли, и мат. ожидание по Z действительно берётся с помощью Монте Карло оценки.
В формуле для нижней границы лог-правдоподобия (которая оптимизируется) входы энкодера вообще никак не фигурируют. Даже в качестве «таргетов» декодера. Там просто логарифм плотности… Да, для Бернулли это и есть кросс-энтропия (если под p(X|Z) понимается p(X=1|Z)), но это возвращает нас к первому вопросу.
мат. ожидание по Z действительно берётся с помощью Монте Карло оценки— покажите мне пожалуйста это место в коде, я его в упор не вижу.
Может я и в самом деле чего-то не понимаю, но ведь элементы X не принимают только 2 значения — 0 и 1, у них 256 возможных значений, градаций серого… поэтому о каком распределении Бернулли идет речь, мне неясно
Всё так, но кроссэнтропия выводится из логарифма плотности Бернулли, т.е. p(X|Z) – набор бернуллиевских распределений, поэтому для корректности следовало бы бинаризовать входы, поэтому подставлять в лог-плотность небинарные величины не совсем корректно.
В формуле для нижней границы лог-правдоподобия (которая оптимизируется) входы энкодера вообще никак не фигурируют. Даже в качестве «таргетов» декодера
Декодер принимает на вход семплы Z из распределения, параметры которого генерируются энкодером.
покажите мне пожалуйста это место в коде, я его в упор не вижу.
В vae_loss считается выражение под мат. ожиданием с использованием decoded, полученному по семплу из кода, что даёт Монте Карло оценку (с помощью выборки размера 1) всего мат. ожидания.
p(X|Z) – набор бернуллиевских распределений— вот никак не могу этого осознать. p(X|Z) — это число, оно ОДНО ЕДИНСТВЕННОЕ для всех пикселей X, потому что X — это один многомерный вектор, единый объект… По Вашему выходит, что оно дает одинаковую вероятность быть равным 1 для каждого пикселя картинки, а это очень странно.
Мне значительно ближе трактовка, которую изначально дал автор, что p(X|Z) = f(Z) + \epsilon, или даже просто так: X = f(Z) + \epsilon (математически это более корректно), т.е., если \epsilon, к примеру, центрированный нормальный шум с малой дисперсией, то все сэмплы из распределения p(X|Z) будут нормально распределены вокруг f(Z). Но эта трактовка идет вразрез с вычислением loss'а, об этом я и написал в самом первом комментарии.
Хотелось бы увидеть коммент от автора, который бы нас рассудил…
вот никак не могу этого осознать. p(X|Z) — это число, оно ОДНО ЕДИНСТВЕННОЕ для всех пикселей X, потому что X — это один многомерный вектор, единый объект…
Да, и предположения модели таковы, что это число является произведением других чисел, по одному на каждый пиксель: p(X|Z) = ∏ᵢ p(xᵢ | Z). Каждое множимое должно быть бернуллиевским распределением, иначе бинарная кроссэнтропия не получится.
По Вашему выходит, что оно дает одинаковую вероятность быть равным 1 для каждого пикселя картинки, а это очень странно.
Нет, я такого не говорил. У каждого бернуллиевского распределения свой параметр, генерируемый нейросетью из семпла Z.
X = f(Z) + \epsilon
К сожалению, не всегда существует такое представление. Для бернуллиевских случайных величин, например, такой репараметризации не существует.
Автоэнкодеры в Keras, Часть 3: Вариационные автоэнкодеры (VAE)