我正在尝试训练神经网络从一些对象列表中选择一个子集。输入是对象列表对于每个对象列表,标签是一个由 0/1 - 1 组成的列表,对于子集中的每个对象,例如代表选择. 我考虑过使用 MSE 损失来训练网络,但这似乎是一种幼稚的方法,在这种情况下是否有更好的损失函数可以使用?
用于选择对象子集的损失函数
损失函数的选择主要取决于您要处理的任务类型:分类或回归。您的问题显然是一个分类问题,因为您有给定输入可以属于或不属于的类。更具体地说,您要做的是多标签分类,这与多类分类不同。强调差异很重要,它存在于目标标签的格式中。
# 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 Entropy或Binary Cross Entropy。尽管两者都基于交叉熵,但它们之间有一个重要的区别,包括它们所需的激活函数。
二元交叉熵
尽管名称表明这种损失应该只用于二进制分类,但这并不是严格意义上的,实际上,这是概念上最适合多标签任务的损失函数。
让我们从二元分类案例开始。我们有一个返回单个输出分数的模型,应用sigmoid函数以将值限制在 0 和 1 之间。由于我们只有一个分数,因此结果值可以解释为属于其中之一的概率这两个类别,以及属于另一个类别的概率可以计算为 1 - 值。
如果我们有多个输出分数,例如 3 个类的 3 个节点怎么办?在这种情况下,我们仍然可以应用 sigmoid 函数,最终得到 0 到 1 之间的三个分数。
要捕获的重要方面是,由于 sigmoid 独立处理每个输出节点,3 个分数的总和不会为 1,因此它们将代表 3 个不同的概率分布,而不是唯一的一个。这意味着 sigmoid 之后的每个分数代表属于该特定类别的不同概率。例如,在上面的示例中,对于得分高于 0.5 的两个标签的预测为真,而对于其余标签的预测为假。这也意味着必须计算 3 个不同的损失,每个可能的输出一个。在实践中,您要做的是解决 n 个二进制分类问题,其中 n 是可能的标签数。
分类交叉熵
在分类交叉熵中,我们将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]
另请注意,在上述论文中,作者发现分类交叉熵优于二元交叉熵,即使这不是普遍成立的结果。
最后,您可以尝试使用不同的函数而不是交叉熵的其他损失,例如:
汉明损失
它计算错误预测标签的比例
精确匹配率
只有所有目标标签都被正确分类的预测才被认为是正确的。