这个世界不是线性的,而是复杂、多变量、充满概率的。
业务算法
可用得到把模型做成可用系统的经验
希望我的行动可以被市场即时的验证,
不太能承受长期的叙事,更愿意持续接受真实世界反馈。
Notes on data, research, and life.
这个世界不是线性的,而是复杂、多变量、充满概率的。
业务算法
可用得到把模型做成可用系统的经验
希望我的行动可以被市场即时的验证,
不太能承受长期的叙事,更愿意持续接受真实世界反馈。
经过大学课程的学习与考试,我善于各类损失函数的计算,但对损失函数是如何设计出来的,只有一知半解。在此进行探究,复现我学习的思路,以期得到系统而深入的理解。
我们先进行一个基本假设:
所以,损失函数设计的问题可以收束为,我们如何比较两个概率模型
如果我们知道真实分布 P,最自然的做法是直接定义某种‘距离’或‘差异度’:,然后选择使其的参数:
如此,我们便定义了广义意义上的损失。需要注意的是,这里的‘距离’不一定是欧式距离,也不一定满足数学上严格的距离定义,它需要满足的是:① 当 越接近 时,损失越小;当 偏离 时,损失越大。
但现实中,真实的分布 不可直接获得,我们只有从中通过观察采样得到的一批数据。因此,损失函数需要满足:② 用有限样本近似真实分布下的整体误差。
理论上我们关心的是期望风险Risk:,但实际训练时只能使用经验风险:
综上,我所理解的损失函数,本质就是“我们希望模型怎样接近真实世界”量化成一个可以在数据上计算、可以被算法优化的目标;设计的目标就是找到符合上面两个条件的函数,来连接真实模型、现实模型与观测数据。
在我研究问题的过程中,有三个关键词一直出现:最小二乘、极大似然估计、交叉熵,这恰恰是比较两个模型‘差距’的三种思路1:最小二乘法强调数值误差,极大似然估计强调模型解释数据的概率能力,交叉熵强调概率分布之间的匹配。
最小二乘法(Ordinary Least Squares, OLS)或许是比较两个模型‘差距’最简单的办法,当我们考虑回归类问题,模型给出预测值 ,真实观测值为 。
OLS的目标是最小化
这本身看起来像是一个很自然的计算规则,从计算角度看,这种平方误差形式简单、可导、容易优化;而从设计角度看,它来自于一个概率模型的假设,我们假设了观测值等于模型预测值加上随机误差:
如果我们进一步假设误差服从高斯分布,在给定 和参数 时, 的条件概率密度为:,如果样本独立同分布,整个数据集的似然函数为:,极大化这个似然函数等价于极小化负对数似然:,代入高斯分布后,可以得到:,而由于常数和正比例系数不影响最优解,所以极大似然估计等价于最小二乘法。
这证明了 平方损失对应着“误差服从高斯分布”的建模假设。换句话说,当我们使用均方误差时,实际上考虑的是:我们认为预测误差大体上是对称的、集中在零附近的,并且大误差应该受到更严重的惩罚。
换句话说,我们可以认为最小二乘法=高斯噪声假设下的极大似然估计
平方损失的特点也由此产生。因为误差被平方,较大的偏差会被放大,所以均方误差对异常值非常敏感。如果数据中存在大量异常点,平方损失可能并不是最合适的选择。这时可以考虑绝对误差:。它对应的统计假设通常与拉普拉斯分布有关。相比平方损失,绝对误差对异常值更稳健。这也说明,损失函数的选择往往反映了我们对噪声结构的判断。
在这一part,我明白了损失函数的选择,本质上依赖于我们对数据噪声的假设。
在上一部分,我们已经提到了极大似然估计(Maximum Likelihood Estimation, MLE),它的思想是:如果模型是好的,那么它应该给已经发生的数据较高的概率。
这一形式表达着一个原则:真实发生的事件,模型给出的概率越高,损失越小;模型给出的概率越低,损失越大。尤其当模型把真实发生的事件赋予接近 0 的概率时, 会变得非常大。这意味着负对数似然会显著惩罚那些对错误结果赋予过高置信度的模型(模型非常肯定地给出了错误答案)。
我们抽象这种思想:先假设数据由某个概率模型生成,再用模型赋予观测数据的概率大小来衡量模型好坏。不同的概率假设会导出不同的损失函数。
据此设计的损失函数因此有明确的统计性质:模型可以最大程度解释观察到的数据
在上一部分,高斯噪声导出平方损失,拉普拉斯噪声导出绝对损失,而在下一部分,我将推导伯努利分布如何导出二分类的交叉熵,类别分布导出多分类交叉熵。统一框架部分总结为:许多看似不同的损失函数,其实都可以统一理解为负对数似然。
在分类问题中,模型的输出通常不是一个单一数值,而是一个概率分布。例如,对于一个 K 分类问题,真实标签可以表示为分布 ,模型预测可以表示为分布 :
如果真实类别是第 c 类,那么 one-hot 标签满足:
交叉熵定义为:,在 one-hot 情况下,它化简为:
也就是说,多分类交叉熵就是要求模型给真实类别尽可能高的概率。若模型给真实类别的概率为 0.9,损失较小;若模型给真实类别的概率为 0.01,损失会很大。
交叉熵与信息论中的熵和 KL 散度有密切关系。
因为真实分布 P 固定,所以 H(P) 对模型参数 来说是常数。因此,最小化交叉熵等价于最小化:
这就回答了最初的问题:如果我们要比较一个真实概率模型和一个学习得到的概率模型,交叉熵提供了一种自然方法。它衡量的是:如果真实数据来自 P,而我们却用 去编码或解释这些数据,平均需要付出多少额外代价。
在机器学习中,由于真实分布 (P) 不可直接获得,我们用样本平均来近似期望:
这正是分类任务中常用的交叉熵损失,也就是负对数似然。
从最小二乘法、极大似然估计和交叉熵中,可以总结出损失函数设计的几个基本原则。
第一,损失函数应该对应问题目标。回归问题关注数值预测误差,分类问题关注类别概率,排序问题关注相对顺序,生成模型关注数据分布。目标不同,损失函数自然不同。
第二,损失函数应该反映对数据噪声的假设。如果认为误差近似高斯分布,平方损失是自然选择;如果认为异常值较多,绝对损失或 Huber 损失可能更合适;如果输出是离散类别,交叉熵更符合概率建模。
第三,损失函数应该能够比较真实分布与模型分布。理想情况下,我们希望最小化某种分布差异,如 KL 散度、交叉熵或其他 divergence。由于真实分布未知,我们通常使用样本上的经验损失来近似。
第四,损失函数应该便于优化。一个理论上合理但难以求导、非连续、极度不稳定的损失函数,可能无法在实际训练中使用。因此,损失函数往往还要考虑可导性、凸性、梯度稳定性等计算性质。
第五,损失函数应该避免错误激励。模型会按照损失函数的规则学习。如果损失函数只奖励表面指标,模型可能学到与真实目标不一致的策略。例如,在类别极度不平衡的问题中,普通交叉熵可能会让模型偏向多数类,此时需要加权交叉熵、重采样或 focal loss 等改进。
我在此建设一个框架:,很多损失函数都可以看作某种概率模型下的负对数似然得到:
从这个视角看,损失函数不是任意选择的计算公式,而是我们对问题的理解、对误差的假设、对模型好坏的评价标准的集中体现。
学习损失函数,最初往往是从计算开始的。我们会计算均方误差,会展开似然函数,会代入交叉熵公式。但真正深入理解损失函数,需要进一步追问:这个损失函数在惩罚什么?它假设数据如何产生?它鼓励模型学到什么?它与真实分布之间的差异有什么关系?
如果说模型是我们对世界的描述,那么损失函数就是我们评价这种描述是否准确的标准。设计损失函数,本质上是在设计学习的方向。模型最终学到什么,并不只取决于网络结构或优化算法,也取决于损失函数告诉它:什么是错误,什么是更好的解释。
最后,我将损失函数的设计问题概括为一句话:损失函数是模型与真实世界之间差距的数学表达
参考与启发:
写于重新建站的第一天…
这一想法最开始来自于一次复现论文-发邮件向作者要代码的答复,他回复要我的主页,现在想来他或许只是想看看我想要做什么方向的试验…但之后就一直有了这个想法,在保研季和实习期间也看见一些大佬都有自己的主页,也就加深了这一想法,又经过一位老炮的手把手指导,于是乎就有了这一站点。
