【问题标题】:How to design a joint loss function with two component with the aim of minimizing the first loss but maximizing the second loss?如何设计具有两个分量的联合损失函数,以最小化第一个损失但最大化第二个损失?
【发布时间】:2021-12-14 04:35:29
【问题描述】:

我正在尝试做一个有两个子任务的实验,目的是降低第一个任务的错误率,同时增加第二个任务的错误率。

此设置可能类似于多任务学习或对抗性学习的设置。 现在我设计的损失函数如下:

total_loss = loss1 - alpha * loss2

我刚刚添加了一个权重alpha,以确保第二次损失不会完全覆盖损失1的影响。

结果表明,经过几个 epoch 的训练,总损失为负,并且 以相当高的速度下降。我假设这是因为 loss1 已经接近 0,但 loss2 仍然越来越小(增加错误率比减少错误率要容易得多)。

我从未读过在原始损失函数中添加负损失的论文,所以我想知道使用这样的损失函数是否合适,或者这对于我的实验设置是否更好?有没有类似优化目标的论文?

【问题讨论】:

    标签: python deep-learning pytorch loss-function


    【解决方案1】:

    首先,让我解释一下为什么你的损失不起作用并且会急剧下降到负数。

    total_loss = loss1 - alpha*loss2
    

    您想要最小化损失 1 和最大化损失 2,随后将两个相反的目标合并为一个 total_loss。

    然后您很可能会在训练模型/系统的同时最小化总损失。就目前而言,您使用什么 alpha 并不重要。典型损失(交叉熵,mse)的理论绝对最小值为 0。但由于您的损失中有负项,它可以最小化为负无穷大,因此您无法阻止它向负方向爆炸。

    现在我们有了解释,我们可以考虑潜在的解决方案。由于问题在于您的损失趋向于收敛到负无穷大,因此我们必须找到其他一些操作,其输出往往会随着输入的增加而减少。

    如果我们保持简单,我们可以尝试使用逆。

    total_loss = loss_1 + 1 / (loss_2 + epsilon)
    

    上述目标应尽量使 loss_2 最大化,使 1/loss_2 接近 0。

    另一个选项可能是使用 tanh,它的边界是 (-1, 1)。也可以使用 Sigmoid。

    total_loss = loss_1 + 1 - tanh(loss2)
    total_loss = loss_1 + 1 - sigmoid(loss2)
    

    可能还有其他更好的方法可以做到这一点。

    最后,您需要重新审视一些问题: 任何学习问题都有一个最终目标。你的理论最优值是多少?是系统 1 的损失最小化到 ~0 并且系统 2 的损失最大化到无穷大(或某个大值)?系统 2 一开始是否从最佳位置开始?

    我认为您还应该审查您的方法。研究对抗性学习方法,例如 GAN。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-17
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 2020-10-13
      相关资源
      最近更新 更多