我试着做一个实验,其中有两个子任务,目的是降低第一个任务的错误率,同时提高第二个任务的错误率。
这种设置可能类似于多任务学习或对抗性学习。现在我设计的损失函数如下:
total_loss = loss1 -α* loss2
在这里,我刚刚添加了一个权重α,以确保第二个损失不会完全覆盖loss1的影响。
结果表明,经过几个时期的训练,总损失达到负值,并以较高的速度下降。我认为这是因为loss1已经接近于0,但是loss2仍然越来越小(增加错误率要比减少错误容易得多)。
我从来没有读过一篇把负损失加到原来的损失函数中的论文,所以我想知道使用这种损失函数是否合适,还是对我的实验设置来说是一个更好的设计?是否有类似的优化目标的论文?
发布于 2021-10-29 08:29:57
首先,让我解释一下为什么你的损失不会起作用,而且会急剧下降到消极的一面。
total_loss = loss1 - alpha*loss2您希望最小化loss1和最大化loss2,然后将两个相反的目标合并成一个total_loss。
然后,您很可能在最小化total_loss的同时训练您的模型/系统。就目前情况而言,你使用什么阿尔法并不重要。典型损失(交叉熵,mse)的理论绝对最小值为0。但是由于损失中的负项,它可以被最小化到负无穷大,所以你不能阻止它向负方向爆炸。
现在我们有了解释,我们可以想出潜在的解决方案。因为问题是你的损失趋向于负无穷大,所以我们必须找到其他的运算,它的输出会随着输入的增加而减少。
如果我们保持它简单,我们可以尝试使用一个逆。
total_loss = loss_1 + 1 / (loss_2 + epsilon)上述目标应尽量使loss_2最大化,使损失1/2接近于0。
另一个选项可以是使用tanh,它在(-1,1)有界。乙状体也可以使用。
total_loss = loss_1 + 1 - tanh(loss2)
total_loss = loss_1 + 1 - sigmoid(loss2)也许还有其他更好的方法来做到这一点。
最后,你需要重新考虑一些问题:任何学习问题都有一个最终的目标。你理论上的最佳选择是什么?系统1的损失最小化到0,系统2的损失最大化到无穷大(或某个大的值)吗?系统2从最优的位置开始吗?
我相信你也应该检讨一下你的做法。研究敌对的学习方法,比如GANs。
https://stackoverflow.com/questions/69763161
复制相似问题