【问题标题】:Why do I get different results when training a Keras model when I multiply the loss by a scalar?当我将损失乘以标量时,为什么在训练 Keras 模型时会得到不同的结果?
【发布时间】:2018-07-11 04:25:10
【问题描述】:

我会展示我的模型,但我已经全面看到了这个结果。举个例子,我现在正在训练一个模型,使用直接 mse,损失在 0.0160 处触底。但是当我使用 100 * mse 时,损失现在下降到 0.2 以下,我原本预计它会在 1.6 左右触底。有人知道为什么训练 Keras 模型可能对将损失乘以标量很敏感吗?

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

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

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)

使用A作为损失函数收敛到0.0160的损失。如果使用 B 导致模型收敛到相同的解决方案(我希望它会因为乘以标量不会改变局部最小值的位置),我希望它收敛到 1.60、100 的损失次A。但事实并非如此。事实上,B 在损失和网络的定性产品方面都明显优于A

【问题讨论】:

  • 能否添加更多细节,比如训练时的详细信息?
  • 这不是关于特定项目的问题(尽管我在当前的工作中看到了它),而更像是一个一般性的问题。这与将损失乘以标量也会乘以梯度这一事实有关吗?
  • 如果您添加代码示例会更好。至少训练和乘法部分。
  • 我明白了,@Mufeed,我已经包含了相关的代码 sn-ps。
  • @DroidGadgets 我已经包含了相关代码sn-ps。

标签: python tensorflow machine-learning keras artificial-intelligence


【解决方案1】:

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

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

【讨论】:

  • Keras 不会“决定”网络何时融合,那是用户的工作。
  • 仅当您使用回调提前停止时才适用,本题并非如此。
猜你喜欢
  • 2020-02-19
  • 1970-01-01
  • 2021-01-16
  • 2023-02-26
  • 2020-12-11
  • 1970-01-01
  • 2017-12-14
  • 1970-01-01
  • 2022-12-04
相关资源
最近更新 更多