习题 2-1 分析为什么平方损失函数不适用于分类问题 , 交叉熵损失函数不适用于回归问题.
平方损失函数(MSE)表达式:
交叉熵损失函数(CrossEntropyLoss)表达式:
1.交叉熵的由来
交叉熵最早可以追溯到上学期学习信息论知识,交叉熵是信息论中的一个重要概念,主要用于度量衡量同一个随机变量中的两个不同概率分布的差异程度,在机器学习中就表示为真实概率分布与预测概率分布之间的差异,是从相对熵(KL散度)推导而来,如下:
p(x)分布的信息熵为:
q(x)分布的信息熵为:
相对熵为:
p(x)为样本真实分布,q(x)为预测分布
因而相对熵(KL散度)公式:
KL散度越小,表示P(x) 与Q(x)的分布更加接近,可以通过反复训练Q (x)来使Q (x) 的分布逼近P(x)。
我们观察可以看出,这里与相对熵(KL散度)较为相似,我认为交叉熵为相对熵(KL散度)的变体,由于我们进行模型训练,有监督训练,样本标签已经确定,相当于真实的概率的分布P(x)已经得知,因此这边的为固定值,相当于常量。
因而在我们模型训练中:
相对熵(KL散度)变为:
对于其做为损失函数,常量可以忽略,因此得到了交叉熵的表现形式。
2.分析交叉熵损失函数不适用于回归问题:由上式可以看出交叉熵损失函数只和分类正确的预测结果有关。而平方损失函数还和错误的分类有关,该损失函数除了让正确分类尽量变大,还会让错误分类都变得更加平均,但实际中后面的这个调整使没必要的。但是对于回归问题这样的考虑就显得重要了,因而回归问题上使用交叉熵损失函数并不适合。
3.分析平方损失函数不适用于分类问题:首先我们要明确分类问题的概念:在二分类问题中
y={+1, -1}, 在C分类问题中y={1, 2, 3, …, C}。可以看出分类问题输出的结果为离散的值。
在邱锡鹏老师的问题讨论区里,有这样一段话,我觉得很恰当:
分类问题中的标签,是没有连续的概念的。每个标签之间的距离也是没有实际意义的,所以预测值和标签两个向量之间的平方差这个值不能反应分类这个问题的优化程度。比如分类 1,2,3, 真实分类是1, 而被分类到2和3错误程度应该是一样的,但是明显当我们预测到2的时候是损失函数的值为1/2而预测到3的时候损失函数为2,这里在相同的结果下却给出了不同的值,这对我们优化参数产生了误导,因而分类问题我们一般采取交叉熵损失函数(Cross-Entropy Loss Function)来进行评估,只关注分类正确的预测结果有关,交叉熵的值越小,模型预测效果就越好。
注:交叉熵经常搭配softmax使用,将输出的结果进行处理,使其多个分类的预测值和为1,再通过交叉熵来计算损失。
4.这里介绍下pytorch包装好的nn.CrossEntropyLoss()函数。
在pytorch中nn.CrossEntropyLoss()为交叉熵损失函数,用于解决多分类问题,也可用于解决二分类问题。在使用nn.CrossEntropyLoss()其内部会自动加上Sofrmax层
nn.CrossEntropyLoss()中的计算公式如下:
其中, log以e为底,nn.CrossEntropyLoss(x, lable)有两个参数
- 第一个参数:x为输入也是网络的最后一层的输出,其shape为[batchsize,class](函数要求第一个参数,也就是最后一层的输出为二维数据,每个向量中的值为不同种类的概率值),如果batchsize大于1,那么求对应的均值。
- 第二个参数:是传入的标签,也就是某个类别的索引值,再上面公式没有参与计算。
nn.BCELoss()为二元交叉熵损失函数,BCELoss是Binary CrossEntropyLoss的缩写,只能解决二分类问题。在使用nn.BCELoss()作为损失函数时,需要在该层前面加上Sigmoid函数,一般使用nn.Sigmoid()即可。
习题 2-12 对于一个三分类问题 , 数据集的真实标签和模型的预测标签如下 :
分别计算模型的精确率、召回率、F1值以及它们的宏平均和微平均.
格式要求:使用公式编辑器,在博客上正确书写公式。
首先上一张图示:
精确率:
召回率:
F值:
宏平均:
宏查准率:
宏查全率:
宏F1:
微平均:
总结:这次题比较简单,主要就是Latex语法的学习,也算是一个知识盲区了。但是也不知道是CSDN的bug还是啥,每次写着写着下面就不显示了,比较了一下感觉还是网上的在线Latex编辑器好用,链接如下:在线LaTeX公式编辑器-编辑器
参考:
对于pytorch中nn.CrossEntropyLoss()与nn.BCELoss()的理解和使用_东城西阙的博客-CSDN博客_nn.bceloss
为什么平方损失函数不适用于分类问题?_Refrain*的博客-CSDN博客_平方损失函数不适用于分类问题