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

use*_*665 1 python keras tensorflow

我有一个带有两个损失函数的神经网络,一个是两个类的二元交叉熵,另一个是回归。现在我希望只对class_2评估回归损失,并为class_1返回0,因为回归特征对于class_1没有意义。

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

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

Dav*_*rks 6

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

您可以传入一个二进制掩码,该掩码是每个损失函数10针对每个损失函数,就像传入标签一样。然后将每个损失乘以相应的掩码。的导数1xdx, 的导数0x0。您最终将适当的损失函数中的梯度归零。事实上,所有优化器都是加性优化器,这意味着您正在对梯度求和,添加零是空操作。你的最终损失函数应该是所有其他损失的总和。

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

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

  • 这个(掩蔽)解决方案非常适合我具有多个损失函数的多任务学习问题!在 Keras 上,我使用“sample_weight”实现它,但其他人可能会发现使用“class_weight”更简单 (2认同)