Я внедрял VAE и заметил в Интернете две разные реализации упрощенной однофакторной гауссовой дивергенции KL. Исходная дивергенция, здесь, выглядит следующим образом:
Если мы предположим, что наша единица является т.е. и \ sigma_2 = 1 , это упрощается до
KL_ {loss} = - \ log (\ sigma_1) + \ frac {\ sigma_1 ^ 2 + \ mu_1 ^ 2} {2} - \ frac {1} {2}
KL_ {loss} = - \ frac {1} {2} (2 \ log (\ sigma_1) - \ sigma_1 ^ 2 - \ mu_1 ^ 2 + 1)
И вот тут-то и лежит мое замешательство. Хотя я обнаружил несколько неясных репозиториев github с вышеуказанной реализацией, чаще всего я использую:
KLloss=log(σ2σ1)+σ21+(μ1−μ2)22σ22−12
μ2=0σ2=1KLloss=−log(σ1)+σ21+μ212−12
KLloss=−12(2log(σ1)−σ21−μ21+1)
=−12(log(σ1)−σ1−μ21+1)
Например, в официальном
руководстве по автоэнкодеру Keras . Тогда мой вопрос: что мне не хватает между этими двумя? Основным отличием является уменьшение коэффициента 2 в логарифмическом выражении, а не возведение в квадрат дисперсии. Аналитически я использовал последний с успехом, для чего это стоит. Заранее благодарю за любую помощь!