di hampir semua contoh kode yang pernah saya lihat dari VAE, fungsi kerugian didefinisikan sebagai berikut (ini adalah kode tensorflow, tapi saya pernah melihat yang serupa untuk theano, obor dll. Ini juga untuk convnet, tetapi itu juga tidak terlalu relevan , hanya mempengaruhi sumbu jumlah yang diambil alih):
# latent space loss. KL divergence between latent space distribution and unit gaussian, for each batch.
# first half of eq 10. in https://arxiv.org/abs/1312.6114
kl_loss = -0.5 * tf.reduce_sum(1 + log_sigma_sq - tf.square(mu) - tf.exp(log_sigma_sq), axis=1)
# reconstruction error, using pixel-wise L2 loss, for each batch
rec_loss = tf.reduce_sum(tf.squared_difference(y, x), axis=[1,2,3])
# or binary cross entropy (assuming 0...1 values)
y = tf.clip_by_value(y, 1e-8, 1-1e-8) # prevent nan on log(0)
rec_loss = -tf.reduce_sum(x * tf.log(y) + (1-x) * tf.log(1-y), axis=[1,2,3])
# sum the two and average over batches
loss = tf.reduce_mean(kl_loss + rec_loss)
Namun rentang numerik dari kl_loss dan rec_loss sangat tergantung pada redup ruang laten dan ukuran fitur input (misalnya resolusi piksel). Apakah masuk akal untuk mengganti pengurangan_sum dengan mengurangi_maksud untuk mendapatkan per z-redup KLD dan per piksel (atau fitur) LSE atau BCE? Lebih penting lagi, bagaimana kita menghitung kerugian laten dengan kehilangan rekonstruksi saat menjumlahkan untuk kerugian akhir? Apakah ini hanya trial and error? atau adakah teori (atau setidaknya aturan praktis) untuk itu? Saya tidak dapat menemukan info tentang ini di mana pun (termasuk kertas asli).
Masalah yang saya alami, adalah bahwa jika keseimbangan antara fitur input saya (x) dimensi dan ruang laten (z) dimensi tidak 'optimal', baik rekonstruksi saya sangat baik tetapi ruang laten yang dipelajari tidak terstruktur (jika x dimensi sangat tinggi dan kesalahan rekonstruksi mendominasi di atas KLD), atau sebaliknya (rekonstruksi tidak bagus tetapi ruang laten yang dipelajari terstruktur dengan baik jika KLD mendominasi).
Saya menemukan diri saya harus menormalkan kembali kehilangan rekonstruksi (membaginya dengan ukuran fitur masukan), dan KLD (membaginya dengan dimensi z) dan kemudian secara manual menimbang istilah KLD dengan faktor bobot yang berubah-ubah (Normalisasi adalah agar saya dapat menggunakan yang sama atau berat serupa tidak tergantung pada dimensi x atau z ). Secara empiris saya telah menemukan sekitar 0,1 untuk memberikan keseimbangan yang baik antara rekonstruksi dan ruang laten terstruktur yang terasa seperti 'sweet spot' bagi saya. Saya mencari pekerjaan sebelumnya di bidang ini.
Atas permintaan, notasi matematika di atas (berfokus pada kehilangan L2 untuk kesalahan rekonstruksi)
di mana adalah dimensi vektor laten (dan mean dan varians ) yang sesuai, adalah dimensi fitur input, adalah ukuran mini-batch, superscript menunjukkan data ke- point dan adalah kerugian untuk mini-batch ke- .