知行编程网知行编程网  2022-07-18 17:00 知行编程网 隐藏边栏 |   抢沙发  9 
文章评分 0 次,平均分 0.0

根据标签分布来选择损失函数

来自 | 知乎   作者丨马东什么

来源丨https://zhuanlan.zhihu.com/p/304462034

编辑丨极市平台

本文仅作学术交流,如有侵权,请联系后台删除。


首先回到经典的面试问题:

为什么线性回归使用mse作为损失函数?

为什么逻辑回归二分类常用二元交叉熵作为损失函数?

熟悉lgb、xgb或者是sklearn中的各类回归模型包括了线性回归,tweedie回归等等应该都比较熟悉,我们在模型的框架之下可以选择不同的损失函数,以lightgbm为例:


根据标签分布来选择损失函数


针对于回归问题有非常多的备选损失函数,那么这些损失函数什么时候用,为什么?

回到基本面试问题,首先我们需要知道的是,使用特定损失函数的前提是我们对标签的分布进行了某种假设,在这种假设的前提下通过极大似然法推出所有样本构成的极大似然公式,然后再使用凸优化的方法比如常见的梯度下降法进行求解

以常见的二分类问题和回归问题为例:

二分类问题的常见假设就是标签服从伯努利分布:

伯努利分布是一个离散型机率分布。试验成功,随机变量取值为1;试验失败,随机变量取值为0。成功机率为p,失败机率为q =1-p,N次试验后,成功期望为N*p,方差为N*p*(1-p) ,所以伯努利分布又称两点分布。

观察到的数据为D1,D2,D3,...,DN,极大似然的目标:

根据标签分布来选择损失函数

联合分布难计算,我们因此引入一个假设,独立同分布(i.i.d.)(机器学习的基本假设),目标公式改变为:

根据标签分布来选择损失函数

将函数取对数,函数的极值点不会改变,公式变为:

根据标签分布来选择损失函数

伯努利分布下随机变量的最大似然计算方法,P(X=1)=p,P(X=0)=1-p:

根据标签分布来选择损失函数

根据标签分布来选择损失函数

这样就得到了我们熟悉的二元交叉熵的公式了,注意,二元交叉熵的名字有很多,有的地方把它叫logloss的类别数为2的特例之类的balabala,记住一个名字能辨别同义不同名就行了。

然后是经典的回归的mse的损失函数,这个之前写过了,参考这篇即可:

马东什么:线性回归面经总结——from 牛客

https://zhuanlan.zhihu.com/p/66519299

线性回归要求因变量服从正态分布_lyh的专栏-CSDN博客

https://blog.csdn.net/u010462995/article/details/70847146

我们在使用线性回归的时候的基本假设是噪声服从正态分布,当噪声符合正态分布N(0,delta^2)时,因变量则符合正态分布N(ax(i)+b,delta^2),其中预测函数y=ax(i)+b。这个结论可以由正态分布的概率密度函数得到。也就是说当噪声符合正态分布时,其因变量必然也符合正态分布。因此,我们使用mse的时候实际上是假设y服从正态分布的。

然而生活中的很多回归问题并不符合正态分布,例如典型的奢侈品商城的销量,用户到商城中闲逛,大部分用户基本不买东西,只有少部分用户会进行购买,极少部分用户会购买大量的奢侈品,因此分布常常是这样的:

根据标签分布来选择损失函数

横轴代表了销量取件从小到达排列,纵轴代表了某个销量区间对应的用户数量,这样的分布情况明显不符合高斯分布。

需要注意,从不均衡学习的角度来说,当正负样本数量相差极大的时候,

根据标签分布来选择损失函数

例如上图,

根据标签分布来选择损失函数

此时,其实仍旧是满足二元交叉熵分布的,因此分类问题并不是特别好从基本假设的角度出发去思考损失函数的选择,更多的是偏工程话的一些解释,例如典型的不均衡样本为什么会影响模型的表现,核心原因是少类样本的数量太少,模型学习不到太多的规律,但是如果少类样本的数量很少,例如1000w:10w这样的比例,虽然比例上也是不均衡,但是每个类别的数量都很多足够模型充分学习,实际应用上来看,这种情况基本不需要进行不均衡处理,因此严格来说,这种情况不属于不均衡学习的问题,不均衡学习针对的更多是“绝对不均衡”的问题,即样本的绝对数量很稀少而不是比例。


回到回归问题上,在回归问题的领域基本不会谈论不均衡问题,因为连续的标签没有不均衡的概念,取而代之的是标签分布诡异的情况,因此简单来说,我们可以把这类标签分布不符合高斯分布从而使得以mse作为损失函数的模型拟合效果差的问题作为回归问题中的“不均衡问题”,这类不均衡问题就比较棘手,因为某些情况下的标签的分布情况和样本数量没关系,比如前面说到的奢侈品销量的问题,就是典型的非高斯分布的形式,这个时候,我们就需要使用一些方法来应对这种问题了,和不均衡学习类似,我们可以在样本层面进行一些采样的操作,

根据标签分布来选择损失函数

这里,我们可以对销量为0的用户进行下采样,这样整体分布看起来会更加复合高斯分布一点,不过这种做法其实意义不大,因为我们未来要预测的样本的分布被破坏了,即使模型拟合出好的效果也没用,这就好比我们进行电商销量预测的时候把双十一的销量样本砍掉,会发现mse变得很优美,但是预测的时候,对于未来的双十一的预测效果会特别差。

因此,更加常见的做法是在标签层面或者损失函数方面进行修正,例如使用对数变换或者更大一点,使用boxcox变换来使得标签尽量接近高斯分布然后即使用mse:

比如这个例子:

根据标签分布来选择损失函数

根据标签分布来选择损失函数

所以有时候我们会发现处理回归问题的时候进行对数变换效果更好了。如果标签存在负数,则所有的标签加上一个min_data+1然后进行对数变换即可,或者直接使用boxcox变换。

但是在处理电商销量问题的时候,我发现这种方法并不奏效,因为如果标签分布本身是非常畸形的,可能你处理了半天还是莫得用,处理完的分布还是畸形的,这个时候我们就要考虑使用其它损失函数来进行处理了。

例如使用tweedie loss、possion loss等损失函数替代mse,例如:

根据标签分布来选择损失函数

这是tweedie分布的典型例子,tweedie loss的实现并不复杂,下次处理回归问题遇到模型效果很差的问题的时候,可以看一下标签的分布情况,然后考虑选择使用不同的损失函数进行测试。

当然,如果懒得看或者看不出来,把损失函数作为超参数进行调参也是可以的。

<section data-brushtype="text" style="padding-right: 0em;padding-left: 0em;white-space: normal;letter-spacing: 0.544px;color: rgb(62, 62, 62);font-family: "Helvetica Neue", Helvetica, "Hiragino Sans GB", "Microsoft YaHei", Arial, sans-serif;widows: 1;word-spacing: 2px;caret-color: rgb(255, 0, 0);text-align: center;"><br  /></section><section data-brushtype="text" style="padding-right: 0em;padding-left: 0em;white-space: normal;letter-spacing: 0.544px;color: rgb(62, 62, 62);font-family: "Helvetica Neue", Helvetica, "Hiragino Sans GB", "Microsoft YaHei", Arial, sans-serif;widows: 1;word-spacing: 2px;caret-color: rgb(255, 0, 0);text-align: center;"><strong style="color: rgb(0, 0, 0);font-family: -apple-system-font, system-ui, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;"><span style="letter-spacing: 0.5px;font-size: 14px;"><strong style="font-size: 16px;letter-spacing: 0.544px;"><span style="letter-spacing: 0.5px;">—</span></strong>完<strong style="font-size: 16px;letter-spacing: 0.544px;"><span style="letter-spacing: 0.5px;font-size: 14px;"><strong style="font-size: 16px;letter-spacing: 0.544px;"><span style="letter-spacing: 0.5px;">—</span></strong></span></strong></span></strong></section><pre><pre><section style="letter-spacing: 0.544px;white-space: normal;font-family: -apple-system-font, system-ui, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;"><section powered-by="xiumi.us"><section style="margin-top: 15px;margin-bottom: 25px;opacity: 0.8;"><section><section style="letter-spacing: 0.544px;"><section powered-by="xiumi.us"><section style="margin-top: 15px;margin-bottom: 25px;opacity: 0.8;"><section><section style="margin-bottom: 15px;padding-right: 0em;padding-left: 0em;color: rgb(127, 127, 127);font-size: 12px;font-family: sans-serif;line-height: 25.5938px;letter-spacing: 3px;text-align: center;"><span style="color: rgb(0, 0, 0);"><strong><span style="font-size: 16px;font-family: 微软雅黑;caret-color: red;">为您推荐</span></strong></span></section><section style="margin-top: 5px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;min-height: 1em;font-family: sans-serif;letter-spacing: 0px;opacity: 0.8;line-height: normal;text-align: center;">一文了解深度推荐算法的演进</section><section style="margin-top: 5px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;min-height: 1em;font-family: sans-serif;letter-spacing: 0px;opacity: 0.8;line-height: normal;text-align: center;"><span style="font-size: 14px;">13个算法工程师必须掌握的PyTorch Tricks</span></section><section style="margin-top: 5px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;min-height: 1em;font-family: sans-serif;letter-spacing: 0px;opacity: 0.8;line-height: normal;text-align: center;"><span style="font-size: 14px;">吴恩达上新:生成对抗网络(GAN)专项课程</span></section><section style="margin-top: 5px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;min-height: 1em;font-family: sans-serif;letter-spacing: 0px;opacity: 0.8;line-height: normal;text-align: center;">图像算法可以稳定处理视频了!| NeurIPS 2020</section><section style="margin-top: 5px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;min-height: 1em;font-family: sans-serif;letter-spacing: 0px;opacity: 0.8;line-height: normal;text-align: center;">从SGD到NadaMax,十种优化算法原理及实现</section></section></section></section></section></section></section></section></section>

根据标签分布来选择损失函数

本篇文章来源于: 深度学习这件小事

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享