如何设计具有两个分量的联合损失函数,以最小化第一个损失但最大化第二个损失?

Posted

技术标签:

【中文标题】如何设计具有两个分量的联合损失函数,以最小化第一个损失但最大化第二个损失?【英文标题】: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 仍然越来越小(增加错误率比减少错误率要容易得多)。

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

【问题讨论】:

【参考方案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。

【讨论】:

以上是关于如何设计具有两个分量的联合损失函数,以最小化第一个损失但最大化第二个损失?的主要内容,如果未能解决你的问题,请参考以下文章

损失函数

统计学习方法读后小结

(4)损失函数

如何使用 tensorflow 构建多输入图?

keras 模型中损失函数的奇怪行为,具有预训练的卷积基础

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