用于选择对象子集的损失函数

人工智能 神经网络 深度学习 目标函数
2021-11-16 06:27:26

我正在尝试训练神经网络从一些对象列表中选择一个子集。输入是对象列表(a,b,c,d,e,f)对于每个对象列表,标签是一个由 0/1 - 1 组成的列表,对于子集中的每个对象,例如(1,1,0,1,0,1)代表选择a,b,d,f. 我考虑过使用 MSE 损失来训练网络,但这似乎是一种幼稚的方法,在这种情况下是否有更好的损失函数可以使用?

1个回答

损失函数的选择主要取决于您要处理的任务类型:分类或回归。您的问题显然是一个分类问题,因为您有给定输入可以属于或不属于的类。更具体地说,您要做的是多标签分类,这与多类分类不同。强调差异很重要,它存在于目标标签的格式中。

# Multi-class --> one-hot encoded labels, only 1 label is correct   
  
[1,0,0], [0,1,0], [0,0,1]

# Multi-label --> multiple labels can be correct
 
[1,0,0], [1,1,0], [1,1,1], [0,1,0], [0,1,1], [0,0,1]

当为某些给定输入预测连续值时使用 MSE,因此它属于适合回归的损失函数,不应用于您的问题。

您可以应用的两个损失函数是Categorical Cross EntropyBinary Cross Entropy尽管两者都基于交叉熵,但它们之间有一个重要的区别,包括它们所需的激活函数。

二元交叉熵

L(y,y^)=1Ni=0N(ylog(y^i)+(1y)log(1y^i))

尽管名称表明这种损失应该只用于二进制分类,但这并不是严格意义上的,实际上,这是概念上最适合多标签任务的损失函数。

让我们从二元分类案例开始。我们有一个返回单个输出分数的模型,应用sigmoid函数以将值限制在 0 和 1 之间。由于我们只有一个分数,因此结果值可以解释为属于其中之一的概率这两个类别,以及属于另一个类别的概率可以计算为 1 - 值。

如果我们有多个输出分数,例如 3 个类的 3 个节点怎么办?在这种情况下,我们仍然可以应用 sigmoid 函数,最终得到 0 到 1 之间的三个分数。

在此处输入图像描述

要捕获的重要方面是,由于 sigmoid 独立处理每个输出节点,3 个分数的总和不会为 1,因此它们将代表 3 个不同的概率分布,而不是唯一的一个。这意味着 sigmoid 之后的每个分数代表属于该特定类别的不同概率。例如,在上面的示例中,对于得分高于 0.5 的两个标签的预测为真,而对于其余标签的预测为假。这也意味着必须计算 3 个不同的损失,每个可能的输出一个。在实践中,您要做的是解决 n 个二进制分类问题,其中 n 是可能的标签数。

分类交叉熵

L(y,y^)=j=0Mi=0N(yijlog(y^ij))

在分类交叉熵中,我们将softmax函数应用于模型的输出分数,将它们限制在 0 和 1 之间,并将它们转化为概率分布(它们的总和为 1)。需要注意的重要一点是,在这种情况下,我们最终得到了一个唯一的分布,因为与 sigmoid 函数不同,softmax 将所有输出分数一起考虑(它们在分母中相加)。

在此处输入图像描述

这意味着分类交叉熵最适合多类任务,其中我们最终对每个输入实例都有一个真实的预测。尽管如此,这种损失也可以应用于多标签任务,如本文中所做的那样。为此,作者将每个目标向量变成了一个均匀的概率分布,这意味着真实标签的值不是 1 而是 1/k,其中 k 是真实标签的总数。

# Example of target vector tuned into uniform probability distribution
[0, 1, 1] --> [0, .5, .5]  
[1, 1, 1] --> [.33, .33, .33]

另请注意,在上述论文中,作者发现分类交叉熵优于二元交叉熵,即使这不是普遍成立的结果。

最后,您可以尝试使用不同的函数而不是交叉熵的其他损失,例如:

汉明损失

它计算错误预测标签的比例

1|N||L|i=1|N|j=1|L|xor(yi,j,zi,j)

精确匹配率

只有所有目标标签都被正确分类的预测才被认为是正确的。

ExactMatchRatio, MR=1ni=1nI(Yi=Zi)