In fast allen Codebeispielen, die ich von einer VAE gesehen habe, sind die Verlustfunktionen wie folgt definiert (dies ist ein Tensorflow-Code, aber ich habe ähnliche für Theano, Fackel usw. gesehen. Es ist auch für ein Convnet, aber das ist auch nicht allzu relevant betrifft nur die Achsen, die die Summen übernehmen):
# 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)
Der numerische Bereich von kl_loss und rec_loss hängt jedoch stark von den latenten Raumabmessungen und der Größe des Eingabe-Features (z. B. der Pixelauflösung) ab. Wäre es sinnvoll, die redu_sum's durch redu_mean zu ersetzen, um pro z-dim KLD und pro Pixel (oder Feature) LSE oder BCE zu erhalten? Was noch wichtiger ist, wie gewichten wir den latenten Verlust mit dem Rekonstruktionsverlust, wenn wir den endgültigen Verlust addieren? Ist es nur Versuch und Irrtum? Oder gibt es eine Theorie (oder zumindest eine Faustregel) dafür? Ich konnte dazu nirgendwo Informationen finden (einschließlich des Originalpapiers).
Das Problem, das ich habe, ist, dass, wenn das Gleichgewicht zwischen den Abmessungen meines Eingabe-Features (x) und den Abmessungen des latenten Raums (z) nicht "optimal" ist, entweder meine Rekonstruktionen sehr gut sind, aber der erlernte latente Raum unstrukturiert ist (wenn x Dimensionen sind) ist sehr hoch und der Rekonstruktionsfehler dominiert über KLD) oder umgekehrt (Rekonstruktionen sind nicht gut, aber der erlernte latente Raum ist gut strukturiert, wenn KLD dominiert).
Ich muss den Rekonstruktionsverlust (dividiert durch die Größe des Eingabe-Features) und die KLD (dividiert durch die Z-Dimensionen) normalisieren und dann den KLD-Term manuell mit einem beliebigen Gewichtungsfaktor gewichten (Die Normalisierung ist so, dass ich denselben oder denselben verwenden kann ähnliches Gewicht unabhängig von den Abmessungen von x oder z ). Empirisch habe ich ungefähr 0,1 gefunden, um eine gute Balance zwischen Rekonstruktion und strukturiertem latenten Raum zu finden, die sich für mich wie ein "Sweet Spot" anfühlt. Ich suche nach Vorarbeiten in diesem Bereich.
Auf Anfrage Mathematiknotation von oben (mit Fokus auf L2-Verlust für Rekonstruktionsfehler)