为什么当我将损失乘以标量时,在训练Keras模型时会得到不同的结果



我会介绍我的模型,但我已经全面看到了这个结果。例如,我现在正在训练一个模型,使用直接mse,损失在0.0160处触底。但当我使用100毫秒时,损失现在降到了0.2以下,我本以为它会在1.6左右见底。有人知道为什么训练Keras模型可能对标量乘以损失敏感吗?

编辑:只是为了澄清,当这种情况发生在我身上时,模型最终确实做得更好,所以这不仅仅是一个数字上的怪癖。

第二版:我被要求提供一些示例代码,所以我会的。我正在使用卷积变分自动编码器作为生成模型。这是我的自定义损失函数:

def vae_loss (input_image, decoder_output):
mse_loss = mse(input_image, decoder_output)
kl_loss = - 0.5 * (K.mean(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=[-1,-2,-3]))
return mse_loss         # (A)
#return 100 * mse_loss  # (B)

我意识到这并没有使用kl_loss,这只是一个实验。我正在用编译模型

vae.compile(optimizer='adadelta', loss=vae_loss)

并适用于:

vae.fit_generator(random_crop(data[:500,:,:,:], 128, 128),
validation_data=random_crop(data[500:,:,:,:], 128, 128),
shuffle=True, steps_per_epoch=64, epochs=5, validation_steps=50)

使用CCD_ 2作为损失函数收敛到0.0160的损失。如果使用B使模型收敛到相同的解(我希望它会收敛,因为乘以标量不会改变局部极小值的位置(,我希望它收敛到A的1.60100倍的损失。但事实并非如此。事实上,B在网络的损失和质量产品方面都明显优于A

我想这与Keras决定网络收敛的方式有关——它可能将损失函数之间的差与一个固定的数字进行比较,例如0.01。如果不能提高0.01,它就会停止。

如果将损失乘以100,Keras仍然使用0.01来测试收敛性,因此它可以执行更多的迭代并更好地优化。

最新更新