多任务学习:训练神经网络对两个类具有不同的损失函数?



>我有一个神经网络,有两个损失函数,一个是 2 个类的二进制交叉熵,另一个是回归。现在,我希望仅针对class_2评估回归损失,并为class_1返回 0,因为回归特征对class_1毫无意义。

如何在 Keras 中实现这样的算法?

仅在class_1数据上单独训练它不起作用,因为我得到了 nan 损失。有更优雅的方法可以将数据集的一半损失定义为 0,另一半的损失定义为mean_square_loss

这是一个在多任务学习中很重要的问题,在多任务学习中,您有多个损失函数,中间有一个共享的神经网络结构,以及可能并非对所有损失函数都有效的输入。

您可以传入一个二进制掩码,该掩码对于每个损失函数10,方式与传入标签的方式相同。然后将每个损失乘以其相应的掩码。1x的导数刚好是dx0x的导数是0。你最终在适当的损失函数中将梯度归零。几乎所有的优化器都是加性优化器,这意味着您正在对梯度求和,添加零是空运算。您的最终损失函数应该是所有其他损失的总和。

我对Keras了解不多。另一种解决方案是将损失函数更改为仅使用标签:L = cross_entropy * (label / (label + 1e-6))。该项将几乎为 0 和几乎 1。至少对于政府工作和神经网络来说足够接近。这是我第一次实际使用的,然后我意识到它就像乘以掩码值数组一样简单。

这个问题的另一个解决方案是让我们tf.wheretf.gather_nd只选择要比较的标签和输出的子集,然后将该子集传递给适当的损失函数。我实际上已经切换到使用这种方法而不是乘以掩码。但两者都有效。

最新更新