in quasi tutti gli esempi di codice che ho visto di un VAE, le funzioni di perdita sono definite come segue (questo è il codice tensorflow, ma ho visto simili per theano, torcia ecc. È anche per una convnet, ma anche questo non è troppo rilevante , influisce solo sugli assi in cui vengono prese le somme):
# 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)
Tuttavia, l'intervallo numerico di kl_loss e rec_loss dipende in larga misura rispettivamente dalle dimensioni dello spazio latente e dalle dimensioni della funzione di input (ad es. Risoluzione pixel). Sarebbe sensato sostituire le riduzioni con riduci per ottenere KLD per z-dim e per pixel (o funzione) LSE o BCE? Ancora più importante, come si valuta la perdita latente con la perdita di ricostruzione quando si sommano insieme per la perdita finale? È solo prova ed errore? o c'è qualche teoria (o almeno una regola empirica) per questo? Non sono riuscito a trovare informazioni al riguardo da nessuna parte (incluso il documento originale).
Il problema che sto riscontrando è che se l'equilibrio tra le dimensioni della funzione di input (x) e le dimensioni dello spazio latente (z) non è "ottimale", le mie ricostruzioni sono molto buone, ma lo spazio latente appreso non è strutturato (se le dimensioni x è molto elevato e l'errore di ricostruzione domina su KLD), o viceversa (le ricostruzioni non sono buone ma lo spazio latente appreso è ben strutturato se KLD domina).
Mi sto trovando a dover normalizzare la perdita di ricostruzione (dividendo per dimensione della funzione di input) e KLD (dividendo per dimensioni z) e quindi ponderando manualmente il termine KLD con un fattore di peso arbitrario (la normalizzazione è in modo che io possa usare lo stesso o peso simile indipendentemente dalle dimensioni di xo z ). Empiricamente ho trovato circa 0,1 per fornire un buon equilibrio tra ricostruzione e spazio latente strutturato che mi sembra un "punto debole". Sto cercando un lavoro precedente in questo settore.
Su richiesta, notazione matematica sopra (concentrandosi sulla perdita di L2 per errore di ricostruzione)
dove è la dimensionalità del vettore latente (e la corrispondente media e varianza ), è la dimensionalità delle caratteristiche di input, è la dimensione del mini-batch, l'apice indica l' esimo dato punto e è la perdita per il ° mini-batch.