多分类问题:
我们在解决的时候会使用到一种叫做SoftMax的分类器。
前面我们在做糖尿病问题的时候,我们做出一个二分类网络,我们得到的是y=1(即一年后发病)它的概率是多少,即P(y=1)。这时候我们只需要得到一个概率,我们就可以计算出另一个概率。
但是在数据集中也包含其他的数据集,比如说MNIST数据集,是手写数字识别问题,这个时候我们的分类种类就很多了。不能只计算出一个概率就将结果输出。
MNIST数据集是一个历史悠久,且经常被用于测试模型是否有效的数据集。该数据集里面有十种数据标签。
当我们有十个分类:
这个时候我们有十个输出,分别是y=0,y=1....y=9的概率。
显然,真实的情况是只有一个种类的概率是1(表示是这个分类),其他种类的概率都是0(表示不是这个分类)。
显然对于每一个样本的损失计算,我们只需要考虑对于真实值的预测与真实值之间的交叉熵,因为对于非真实值的预测带入交叉熵公式得到的结果一定是0。(真实值所隶属的非真实值的隶属度是0)。
多分类问题中,所有分类的概率值和是1是一个固定条件。所以我们希望输出之间是带有竞争性的,其中一个比较多(概率比较大),那么其他的概率就要比较小,本质上我们输出的是一个分布。
那么前面这些层,我们仍然使用s线性层和igmoid函数(矩阵之间的线性相乘+对得到的结果进行非线性化处理)进行处理,但是如果只有这些,我们很难达到高概率事件抑制低概率事件发生的功能,换句话说,我们很难达到输出的概率之和是1,所以我们最后一层要用一个不同的层:SoftMax Layer。
下面我们来看一下SoftMax函数是如何保证我们的线性层的输出满足我们两个条件:(输出值隶属于某个分类的概率都大于0且小于1,隶属于所有种类的概率值和为1)。
显然,这就保证了我们的结果是1, 如果存在x值比较大的,你们exp{x}也就比较大,分母大的话会抑制其他分类概率值。
注意,在这里我们并不是采用输出等比例映射到0到1之间,而是采用了自然指数的方法,这样我们才能保证我们高概率输出会抑制低概率输出。
这就是SoftMax函数实现机制。
那么当我们明白了SoftMax函数的实现,我们需要怎么计算损失呢?
对于二分类问题来说:我们进行求和的时候使用到两项,
现在,在我们计算多分类问题的时候,如果采用交叉熵的公式,那么我们对各个分类的运算结果只有一个是非零的,其余的都是零,(因为真实值表示对其他分类的概率是0)。