VAE 重建损失 (MSE) 没有减少,但 KL 散度增加

Luc*_*eia 0 autoencoder tensorflow

我一直在尝试创建 LSTM VAE 来重建 Tensorflow 上的多元时间序列数据。首先,我尝试调整(更改为功能 API,更改层)此处采用的方法,并得出以下代码:

input_shape = 13
latent_dim = 2

prior = tfd.Independent(tfd.Normal(loc=tf.zeros(latent_dim), scale=1), reinterpreted_batch_ndims=1)

input_enc = Input(shape=[512, input_shape]) 
lstm1 = LSTM(latent_dim * 16, return_sequences=True)(input_enc) 
lstm2 = LSTM(latent_dim * 8, return_sequences=True)(lstm1) 
lstm3 = LSTM(latent_dim * 4, return_sequences=True)(lstm2) 
lstm4 = LSTM(latent_dim * 2, return_sequences=True)(lstm3) 
lstm5 = LSTM(latent_dim, return_sequences=True)(lstm4) 
lat = Dense(tfpl.MultivariateNormalTriL.params_size(latent_dim))(lstm5)
reg = tfpl.MultivariateNormalTriL(latent_dim, activity_regularizer= tfpl.KLDivergenceRegularizer(prior, weight=1.0))(lat)
    
lstm6 = LSTM(latent_dim, return_sequences=True)(reg) 
lstm7 = LSTM(latent_dim * 2, return_sequences=True)(lstm6) 
lstm8 = LSTM(latent_dim * 4, return_sequences=True)(lstm7) 
lstm9 = LSTM(latent_dim * 8, return_sequences=True)(lstm8) 
lstm10 = LSTM(latent_dim * 16, return_sequences=True)(lstm9) 
output_dec = TimeDistributed(Dense(input_shape))(lstm10)

enc = Model(input_enc, reg) 
vae = Model(input_enc, output_dec)


vae.compile(optimizer='adam',
            loss='mse',
            metrics='mse'
            )

es = callbacks.EarlyStopping(monitor='val_loss',
                             mode='min',
                             verbose=1,
                             patience=5,
                             restore_best_weights=True,
                             )

vae.fit(tf_train,
        epochs=1000,
        callbacks=[es],
        validation_data=tf_val,
        shuffle=True
        )
Run Code Online (Sandbox Code Playgroud)

通过观察 MSE 作为指标,我注意到它在训练过程中没有变化,只是散度下降了。然后我将Activity_regularizer参数设置为None,事实上,MSE 确实下降了。因此,KL 散度似乎阻止了重构误差的优化。

这是为什么?我做错了什么吗?非常感谢任何帮助!

(我知道潜在维度相当小,我将其设置为两个以轻松可视化它,尽管这种行为仍然会在较大的潜在维度中发生,因此我认为问题不在那里。)

小智 5

是否您正在使用自动编码器并且损失中存在 KL 散度项?在(Beta-)VAE 中,损失为Loss = MSE + beta * KL
由于 beta = 1 是正常的 VAE,因此您可以尝试使 beta 小于 1。这应该为 MSE 赋予更大的权重,而为 KL 散度赋予更少的权重。这应该有助于重建,但如果你想要一个解开的潜在空间,那就不好了。