шкала функций вариационных потерь keras

#python #tensorflow #keras

#python #тензорный поток #keras

Вопрос:

Я очень новичок в NN и tensorflow, недавно я читал о реализации keras вариационного автоэнкодера и нашел две версии функций потерь:

 version1:  
    def vae_loss(x, x_decoded_mean):
       recon_loss = original_dim * objectives.mse(x, x_decoded_mean)
       kl_loss = - 0.5 * K.sum(1   z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1)
       return recon_loss   kl_loss

version2:
        def vae_loss(x, x_decoded_mean):
           recon_loss = objectives.mse(x, x_decoded_mean)
           kl_loss = - 0.5 * K.mean(1   z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1)
           return recon_loss   kl_loss
  

если я правильно понимаю, версия 1 представляет собой сумму потерь, а версия 2 — средние потери по всем выборкам в одном пакете. так влияет ли масштаб потерь на результат обучения? Я попытался протестировать их, и это в значительной степени повлияло на мой скрытый масштаб переменных. итак, почему это так и какая форма функции потерь правильная?

обновление моего вопроса: если я умножу original_dim на потерю KL,

 def vae_loss(x, x_decoded_mean):
    xent_loss = original_dim * objectives.binary_crossentropy(x, x_decoded_mean)
    kl_loss = - 0.5 * K.sum(1   z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1) *original_dim
    return xent_loss   kl_loss
  

скрытое распределение выглядит следующим образом:
введите описание изображения здесь

и декодированный вывод выглядит следующим образом: введите описание изображения здесь

похоже, вывод кодировщика не содержит никакой информации. Я использую набор данных mnist и пример из https://github.com/vvkv/Variational-Auto-Encoders/blob/master/Variational+Auto+Encoders.ipynb

Ответ №1:

Суммирование и усреднение потерь для каждого примера в пакете просто пропорционально масштабирует все условия потерь. Эквивалентным изменением будет регулировка скорости обучения. Важно то, что ваша нормальная величина потерь, умноженная на скорость обучения, не приводит к нестабильному обучению.

Комментарии:

1. спасибо за ваш ответ, я попытался умножить скорость обучения на original_dimension для функции потерь версии 2, и результаты обучения не имеют особого смысла, это из-за наличия потери KL, которая не связана с original_dimension и, следовательно, предпочтительнее функция потерь версии 1?

2. Ах, теперь я понимаю. Умножается только на член потери восстановления original_dim , а не на kl_loss. В зависимости от того, насколько он велик original_dim , это, вероятно, исказит ваше обучение, так что для обучения по существу использовались только потери при восстановлении (поскольку этот термин потери теперь намного больше).

3. то есть вы имеете в виду, что я также должен умножить original_dim на потерю KL? Я сделал это, результаты выглядят странно, позвольте мне обновить мой вопрос с результатами