链接:https://juejin.im/post/5b38971be51d4558b10aad26
二分类、多分类与多标签的基本概念
二分类:表示分类任务中有两个类别,比如我们想识别一幅图片是不是猫。也就是说,训练一个分类器,输入一幅图片,用特征向量x表示,输出是不是猫,用y=0或1表示。二类分类是假设每个样本都被设置了一个且仅有一个标签 0 或者 1。
多类分类(Multiclass classification): 表示分类任务中有多个类别, 比如对一堆水果图片分类, 它们可能是橘子、苹果、梨等. 多类分类是假设每个样本都被设置了一个且仅有一个标签: 一个水果可以是苹果或者梨, 但是同时不可能是两者。
多标签分类(Multilabel classification): 给每个样本一系列的目标标签. 可以想象成一个数据点的各属性不是相互排斥的(一个水果既是苹果又是梨就是相互排斥的), 比如一个文档相关的话题. 一个文本可能被同时认为是宗教、政治、金融或者教育相关话题。
多分类问题与二分类问题关系
首先,两类问题是分类问题中最简单的一种。其次,很多多类问题可以被分解为多个两类问题进行求解(请看下文分解)。所以,历史上有很多算法都是针对两类问题提出的。下面我们来分析如何处理多分类问题:
直接分成多类
一对一的策略
给定数据集D这里有N个类别,这种情况下就是将这些类别两两配对,从而产生N(N−1)2个二分类任务,在测试的时候把样本交给这些分类器,然后进行投票。
一对其余策略
将每一次的一个类作为正例,其余作为反例,总共训练N个分类器。测试的时候若仅有一个分类器预测为正的类别则对应的类别标记作为最终分类结果,若有多个分类器预测为正类,则选择置信度最大的类别作为最终分类结果。
多标签问题与二分类问题关系
面临的问题: 图片的标签数目不是固定的,有的有一个标签,有的有两个标签,但标签的种类总数是固定的,比如为5类。
解决该问题: 采用了标签补齐的方法,即缺失的标签全部使用0标记,这意味着,不再使用one-hot编码。例如:标签为:-1,1,1,-1,1 ;-1表示该类标签没有,1表示该类标签存在,则这张图片的标签编码为:
0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
2.如何衡量损失?
计算出一张图片各个标签的损失,然后取平均值。
3.如何计算精度
计算出一张图片各个标签的精度,然后取平均值。
该处理方法的本质:把一个多标签问题,转化为了在每个标签上的二分类问题。
损失函数的选择问题
基于逻辑回归的二分类问题
对于logistic回归,有:
逻辑回归有以下优点:
- 它的输入范围是 ,而之于刚好为(0,1),正好满足概率分布为(0,1)的要求。我们用概率去描述分类器,自然比单纯的某个阈值要方便很多;
- 它是一个单调上升的函数,具有良好的连续性,不存在不连续点。
对数损失函数(logarithmic loss function) 或对数似然损失函数(log-likehood loss function) 。
逻辑回归中,采用的则是对数损失函数。根据上面的内容,我们可以得到逻辑回归的对数似然损失函数cost function:
将以上两个表达式合并为一个,则单个样本的损失函数可以描述为:
这就是逻辑回归最终的损失函数表达式。
基于 Softmax 的多分类问题
softmax层中的softmax 函数是logistic函数在多分类问题上的推广,它将一个N维的实数向量压缩成一个满足特定条件的N维实数向。压缩后的向量满足两个条件:
- 向量中的每个元素的大小都在[0,1]
- 向量所有元素的和为 1
因此,softmax适用于多分类问题中对每一个类别的概率判断,softmax的函数公式如下:
基于 Softmax 的多分类问题采用的是 log似然代价函数(log-likelihood cost function)来解决。
单个样本的 log似然代价函数的公式为:
其中, 表示标签向量的第 个分量。因为往往只有一个分量为 1 其余的分量都为 0,所以可以去掉损失函数中的求和符号,化简为,
其中, 是向量 中取值为 1 对应的第 个分量的值。
交叉熵损失函数与 log 似然代价函数关系 本质一样
有的文献中也称 log 似然代价函数为交叉熵损失函数,这两个都是交叉熵损失函数,但是看起来长的却有天壤之别。为什么同是交叉熵损失函数,长的却不一样呢?
因为这两个交叉熵损失函数对应不同的最后一层的输出。第一个对应的最后一层是 sigmoid,用于二分类问题,第二个对应的最后一层是 softmax,用于多分类问题。但是它们的本质是一样的,请看下面的分析。
首先来看信息论中交叉熵的定义:
交叉熵是用来描述两个分布的距离的,神经网络训练的目的就是使 g(x) 逼近 p(x)。
sigmoid + 交叉熵
先看看 sigmoid 作为神经网络最后一层的情况。sigmoid 作为最后一层输出的话,那就不能吧最后一层的输出看作成一个分布了,因为加起来不为 1。现在应该将最后一层的每个神经元看作一个分布,对应的 target 属于二项分布(target的值代表是这个类的概率),那么第 i 个神经元交叉熵为
其实这个式子可以用求和符号改写,
其中,
Softmax + 对数似然
现在来看 softmax 作为神经网络最后一层的情况。g(x)是什么呢?就是最后一层的输出 y 。p(x)是什么呢?就是我们的one-hot标签。我们带入交叉熵的定义中算一下,就会得到:
交叉熵损失函数与 log 似然损失函数的总结
注意到不管是交叉熵损失函数与 log 似然损失函数,交叉熵损失函数用于二分类问题, log 似然损失函数用于多分类,但是对于某一个样本只属于一个类别,只有一个标签。如果用 one-hot 编码样本的标签那么,对于标签向量只有一个分量的值为 1 其余的值都为 0。
所以不管是交叉熵损失函数与 log 似然损失函数,都可以化简为,
其中, 是向量 中取值为 1 对应的第 个分量的值。这两个长的不一样的损失函数实际上是对应的不同的输出层。本质上是一样的。
我的建议是,采用 Kears 中的命名方法,对于二分类的交叉熵损失函数称之为 “二分类交叉熵损失函数(binary_crossentropy)” ,对于多分类的交叉熵损失函数称之为 “多类别交叉熵损失函数(categorical_crossentropy)”。
在 Kears 中也有提示(注意: 当使用categorical_crossentropy损失时,你的目标值应该是分类格式 (即,如果你有10个类,每个样本的目标值应该是一个10维的向量,这个向量除了表示类别的那个索引为1,其他均为0)。 为了将 整数目标值 转换为 分类目标值,你可以使用Keras实用函数to_categorical:)
反映到模型实现中,最后一层输出个数为1,则用sigmod,否则使用softmax。
多标签分类 + 二分类交叉熵损失函数
多标签问题与二分类问题关系在上文已经讨论过了,方法是计算一个样本各个标签的损失(输出层采用sigmoid函数),然后取平均值。把一个多标签问题,转化为了在每个标签上的二分类问题。
总结
分类问题名称 | 输出层使用激活函数 | 对应的损失函数 |
---|---|---|
二分类 | sigmoid函数 | 二分类交叉熵损失函数(binary_crossentropy) |
多分类 | Softmax函数 | 多类别交叉熵损失函数(categorical_crossentropy) |
多标签分类 | sigmoid函数 | 二分类交叉熵损失函数(binary_crossentropy) |