对于任何通用的机器学习模型(尽管我目前正在研究神经网络),在执行以下任务时:
将集合中的元素分类为三组(’A’或’B’或’任意’),
(这里,标记为’A‘意味着唯一有效的标签是’A’(类似地,’B‘也是如此),而’任意‘意味着’A’和’B’这两个标签都是同样有效的),应该使用哪种损失函数?
这个问题可以使用与更一般的问题“三元分类”相关的技术来解决,但我认为通过这种泛化会丢失一些信息。
为了举例说明,假设我们想根据动词的时态形式(仅考虑现在时和过去时)对英语动词进行分类
那么模型应该将
{“work”, “eat”, “sing”, …} 分类为”现在时“
{“worked”, “ate”, “sang”, …} 分类为”过去时“
以及,
{“read”, “put”, “cut”, …} 分类为”任意“
(请注意,“read”的现在时和过去时的发音不同,但我们正在考虑基于文本的分类)
这与我正在研究的任务不同,但应该可以作为这个问题的一个有效示例。
附注:我是一名学生,对这个领域只有基本的了解,所以如果需要,请就问题提出任何澄清要求。
回答:
我认为您处于多标签分类的情况,而不是多类分类。
如这里所述:
在机器学习中,多标签分类和与之密切相关的多输出分类问题是分类问题的变体,其中每个实例可以分配多个标签
这意味着实例可以与多个类别相关联。
通常,当您处理二元分类(例如,0、1类)时,您可以将网络的最后一层设置为一个神经元,该神经元将输出0到1之间的连续值,使用sigmoid激活函数,并使用二元交叉熵
作为损失函数
鉴于您的情况,您可以决定使用:
- 两个神经元作为神经网络的输出
- 对于每个神经元,您可以使用
sigmoid
激活函数 - 并使用
二元交叉熵
作为损失函数
这样,每个实例都可以由模型以特定概率与两个类别相关联。
这意味着,对于每个实例,您应该关联两个类别,或者更确切地说是“标签”。例如,对于您的动词,您应该有“过去时”、“现在时”类别:
现在时 过去时work: 1 0worked: 0 1read 1 1
您的模型将尝试输出两个概率,按照之前解释的架构:
现在时 过去时 总和work: 0.9 0.3 1.2worked: 0.21 0.8 1.01read 0.86 0.7 1.5
基本上,您有两个独立的概率(如果您检查,每行的总和不是1),因此您可以将一个实例与两个类别相关联。
相反,如果您想要一个互斥的分类,超过两个类别,您应该使用分类交叉熵
作为损失函数,并在最后一层使用softmax激活函数
,这将基本处理输出以生成总和为1的概率向量。例如
现在时 过去时 两者 总和work: 0.7 0.2 0.1 1worked: 0.21 0.7 0.19 1read 0.33 0.33 0.33 1
查看这里以查看一个详细的示例