pytorch loss的数学意义

1.BCE
对于常规的理解,BCEloss用于二分类,它的label不是0就是1,
loss就是将GroundTuth的分类的预测置信度取出来,求-log,以下是-log函数的曲线图(实际上到写就截止了):
在这里插入图片描述
但是在pytorch,对于BCE label的要求是float型,这就很有趣了,针对此,有人的解释是,关于网络最终的输出结果,可能我们想要的不是其属于0分类还是1分类,我们想得到的是属于某个分类的置信度,但是当label是float的时候,-[ynxn+(1-yn)(1-xn)]的数学意义是怎样的呢?
当假设yn=0.6,当我们预测的xn从0~1变化时,loss图像应该是怎样的,按照设想,我们希望xn跟yn越接近越好,所以当xn=0.6时,loss应该是最小的,两边loss递增,实际绘出如下图所示,可以看出,图像是符合预期的:
在这里插入图片描述
我们继续实验:当yn=0.1时
在这里插入图片描述
当yn=0.9时,
在这里插入图片描述
当xn=0.5
在这里插入图片描述
从以上图片可以看出,loss随着x的整体走势是正确的,但是左右的loss非常不均匀,尤其是y接近0或1的时候,距离正确y相同差值的x导致的loss结果大不相同。
2.crossEntroyLoss
二分类的分类的扩展,在pytorch中label类型为long int,这个合情合理,比较好理解,其loss就是把ground_truth分类的预测置信度取出来,求-log

分析以下我在关键点检测用到的这两类loss遇到的问题:
最开始把BCEloss用于二分类预测每个像素点在二分类上的置信度时,整个网络是work,但是当用于多分类时,网络出现了问题,我们来看看多分类是BCE是怎样计算loss的以及其对应的数学意义:
在这里插入图片描述
由以上可以看出,BCEloss就是仍然是在每个维度计算-[ylog(x)+(1-y)log(1-x)],然后求和取平均。那么其对应的数学意义是怎样的呢?
说此之前我们先说一下运用BCE loss的两种方法
一、先sigmoid再将数据送入BCEloss
此方法各种分类之间是相互独立的,可以用于multilabel的情况,也就是一个像素点可能有好几种标签
针对三label的情况
其loss=-[y1log(x1)+y2log(x2)+y3log(x3)]
这种没有约束的loss实际上是没有意义的,因为其结果x1,x2,x3都会逼近于1.0,因为-log为正值,希望其越小越好,那就干脆等于0,所以这种loss实际上没有任何数学意义。
二、先softmax2d再将数据送入BCEloss
此方法单个像素点对应的各分类的置信度之和为1,可以用于multiclass的情况,各个分类之间不是相互独立的,置信度累加为1 .
针对三class的情况
其loss=-[y1
log(x1)+y2*log(x2)+(1-y1-y2)*log(1-x1-x2)]
当y1=0.3,y2=0.4的时候,用matlab画图如下:
在这里插入图片描述
其最小值位于x1=0.3,x2=0.4的时候,loss最小,我们试了其他值,都是x1y1=y1,x2=y2的时候loss最小,所以该loss是work的。

说了这么多,顺便提一嘴,使用-log做损失的很大好处在于,梯度真心大
log(x)’=1/x,当x越接近0时,loss的梯度越大,符合对于正确分类预测置信度过小的大惩罚。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值