#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? Я сделал это, результаты выглядят странно, позвольте мне обновить мой вопрос с результатами