在训练期间改变损失函数

Posted

技术标签:

【中文标题】在训练期间改变损失函数【英文标题】:change loss function during training 【发布时间】:2017-08-24 22:15:24 【问题描述】:

假设我的损失函数是以下形式:

损失 = a*loss_1 + (1-a)*loss_2

假设我也在训练 100 步。如何在 tensorflow 中动态更改损失函数,以便在 100 步训练期间逐渐将“a”从 1 更改为 0?

确切地说,我希望我的损失是 损失 = 1*损失_1+0*损失_2 = 损失_1 在训练开始时(在第 1 步)

loss = 0*loss_1+1*loss_2 = loss_2 最后(第100步)

在两者之间有某种逐渐的(不一定是连续的)减少。

【问题讨论】:

我意识到一个非常老套的解决方案是在前 50 个步骤中使用 loss_1 进行训练,然后记住该训练的权重,然后在剩余的步骤中使用 loss_2 重新训练。不过,我正在寻找一种无需制作两个图表的方法,谢谢。 【参考方案1】:

假设a 的值不依赖于在当前步骤完成的计算,为a 创建一个占位符,然后使用提要字典传递您想要的值。

【讨论】:

【参考方案2】:

您可以使用tf.train.polynomial_decay。

tf.train.polynomial_decay(learning_rate=1, global_step=step_from_placeholder,
    decay_steps=100, end_learning_rate=0,
    power=1.0, cycle=False, name=None)

这会计算

global_step = min(global_step, decay_steps)
decayed_learning_rate = (learning_rate - end_learning_rate) * \
  (1 - global_step / decay_steps) ** (power) + end_learning_rate

【讨论】:

以上是关于在训练期间改变损失函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在训练期间在每个时期修改损失函数内的变量?

我的损失函数在训练期间没有得到更小的值

在 Keras 训练期间动态更改损失函数,无需重新编译优化器等其他模型属性

在 pytorch 中使用多个损失函数

一文搞懂深度常用损失函数

损失的不对称函数