我一直在尝试创建一个LSTM VAE来重建Tensorflow上的多变量时间序列数据。一开始,我尝试调整(更改为Functional 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
)
通过观察MSE作为一个指标,我注意到它在训练过程中不会改变,只有偏差会下降。然后,我将activity_regularizer参数设置为None,实际上,MSE确实下降了。因此,KL发散性似乎阻止了重建误差的优化。
为什么?我是不是做错了什么?非常感谢您的帮助!
(我知道潜在维度相当小,我将其设置为2以便于可视化,尽管这种行为仍然发生在更大的潜在维度上,因此我认为问题不存在。(
可能是您使用的是自动编码器,而在损失中存在KL发散项吗?在(β-(VAE中,损失为Loss = MSE + beta * KL
由于beta=1将是一个正常的VAE,您可以尝试使beta小于1。这应该给MSE更多的花言巧语,而给KL的分歧更少。这应该有助于重建,但如果你想有一个解开纠缠的潜在空间,那就不好了。