VAE에서 보았던 거의 모든 코드 예제에서 손실 함수는 다음과 같이 정의됩니다 (이것은 텐서 흐름 코드이지만 테 아노, 토치 등에서도 비슷합니다. 또한 convnet 용이지만 너무 관련이 없습니다. , 합계가 인수되는 축에만 영향을 미칩니다) :
# 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)
그러나 kl_loss 및 rec_loss의 숫자 범위는 잠재 공간 디딤 및 입력 피처 크기 (예 : 픽셀 해상도)에 따라 크게 달라집니다. z_dim KLD 및 픽셀 (또는 기능) 당 LSE 또는 BCE를 얻기 위해 reduce_sum을 reduce_mean으로 바꾸는 것이 합리적입니까? 더 중요한 것은, 최종 손실을 위해 합산 할 때 재구성 손실과 어떻게 잠재적 손실을 가중 시키는가? 그냥 시행 착오입니까? 아니면 그것에 대한 어떤 이론이 있습니까? 나는 (원본을 포함하여) 이것에 관한 정보를 찾을 수 없었다.
내가 겪고있는 문제는 입력 기능 (x) 치수와 잠재 공간 (z) 치수 사이의 균형이 '최적화'가 아닌 경우 재구성이 매우 좋지만 학습 된 잠재 공간이 구조화되지 않은 것입니다 (x 치수의 경우) KLD에 비해 매우 높고 재구성 오류가 우세하거나 그 반대도 가능합니다 (재건은 좋지 않지만 KLD가 지배하는 경우 학습 된 잠재 공간이 잘 구성되어 있음)
재구성 손실 (입력 피처 크기로 나눔)과 KLD (z 치수로 나눔)를 정규화 한 다음 임의의 가중치로 KLD 항에 수동으로 가중치를 부여해야합니다 (정규화는 동일하거나 x 또는 z 치수 와 무관 한 유사한 무게 ). 경험적으로 저는 0.1과 비슷한 것을 발견했습니다. 재구성과 잠재 공간 사이의 균형이 잘 잡히고 나에게 '달콤한 반점'인 느낌이 들었습니다. 이 분야의 사전 작업을 찾고 있습니다.
요청시, 위의 수학 표기법 (재구성 오류에 대한 L2 손실에 초점을 맞춤)
여기서 는 잠재 벡터 의 차원 (및 해당 평균 및 분산 ), 는 입력 피처의 차원, 은 미니 배치 크기, 위첨자 는 번째 데이터를 나타냅니다. point 및 은 번째 미니 배치 의 손실입니다 .z μ σ 2 K M ( i ) i L ( m ) m