乍一看到某个问题,你会觉得很简单,其实你并没有理解其复杂性。当你把问题搞清楚之后,又会发现真的很复杂,于是你就拿出一套复杂的方案来。实际上,你的工作只做了一半,大多数人也都会到此为止……。但是,真正伟大的人还会继续向前,直至找到问题的关键和深层次原因,然后再拿出一个优雅的、堪称完美的有效方案。

—— from 乔布斯

直观理解为什么分类问题用交叉熵损失而不用均方误差损失?

posted @   shine-lee  阅读(13213)  评论(2编辑  收藏  举报

博客:blog.shinelee.me | 博客园 | CSDN

交叉熵损失与均方误差损失

常规分类网络最后的softmax层如下图所示,传统机器学习方法以此类比,

https://stats.stackexchange.com/questions/273465/neural-network-softmax-activation

一共有K类,令网络的输出为[y^1,,y^K],对应每个类别的概率,令label为 [y1,,yK]。对某个属于p类的样本,其label中yp=1y1,,yp1,yp+1,,yK均为0。

对这个样本,交叉熵(cross entropy)损失

L=(y1logy^1++yKlogy^K)=yplogy^p=logy^p

均方误差损失(mean squared error,MSE)

L=(y1y^1)2++(yKy^K)2=(1y^p)2+(y^12++y^p12+y^p+12++y^K2)

m个样本的损失为

=1mi=1mLi

对比交叉熵损失与均方误差损失,只看单个样本的损失即可,下面从两个角度进行分析。

损失函数角度

损失函数是网络学习的指挥棒,它引导着网络学习的方向——能让损失函数变小的参数就是好参数。

所以,损失函数的选择和设计要能表达你希望模型具有的性质与倾向。

对比交叉熵和均方误差损失,可以发现,两者均在y^=y=1时取得最小值0,但在实践中y^p只会趋近于1而不是恰好等于1,在y^p<1的情况下,

  • 交叉熵只与label类别有关,y^p越趋近于1越好
  • 均方误差不仅与y^p有关,还与其他项有关,它希望y^1,,y^p1,y^p+1,,y^K越平均越好,即在1y^pK1时取得最小值

分类问题中,对于类别之间的相关性,我们缺乏先验。

虽然我们知道,与“狗”相比,“猫”和“老虎”之间的相似度更高,但是这种关系在样本标记之初是难以量化的,所以label都是one hot。

在这个前提下,均方误差损失可能会给出错误的指示,比如猫、老虎、狗的3分类问题,label为[1,0,0],在均方误差看来,预测为[0.8,0.1,0.1]要比[0.8,0.15,0.05]要好,即认为平均总比有倾向性要好,但这有悖我们的常识

对交叉熵损失,既然类别间复杂的相似度矩阵是难以量化的,索性只能关注样本所属的类别,只要y^p越接近于1就好,这显示是更合理的。

softmax反向传播角度

softmax的作用是将(,+)的几个实数映射到(0,1)之间且之和为1,以获得某种概率解释。

令softmax函数的输入为z,输出为y^,对结点p有,

y^p=ezpk=1Kezk

y^p不仅与zp有关,还与{zk|kp}有关,这里仅看zp,则有

y^pzp=y^p(1y^p)

y^p为正确分类的概率,为0时表示分类完全错误,越接近于1表示越正确。根据链式法则,按理来讲,对与zp相连的权重,损失函数的偏导会含有y^p(1y^p)这一因子项,y^p=0分类错误,但偏导为0,权重不会更新,这显然不对——分类越错误越需要对权重进行更新

交叉熵损失

Ly^p=1y^p

则有

Lz^p=Ly^py^pzp=y^p1

恰好将y^p(1y^p)中的y^p消掉,避免了上述情形的发生,且y^p越接近于1,偏导越接近于0,即分类越正确越不需要更新权重,这与我们的期望相符。

而对均方误差损失

Ly^p=2(1y^p)=2(y^p1)

则有,

Lz^p=Ly^py^pzp=2y^p(1y^p)2

显然,仍会发生上面所说的情况——y^p=0分类错误,但不更新权重

综上,对分类问题而言,无论从损失函数角度还是softmax反向传播角度,交叉熵都比均方误差要好。

参考

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!
51La
点击右上角即可分享
微信分享提示