求职方向

这个世界不是线性的,而是复杂、多变量、充满概率的。

业务算法

可用得到把模型做成可用系统的经验

希望我的行动可以被市场即时的验证,

不太能承受长期的叙事,更愿意持续接受真实世界反馈。

Loss Function损失函数的设计

经过大学课程的学习与考试,我善于各类损失函数的计算,但对损失函数是如何设计出来的,只有一知半解。在此进行探究,复现我学习的思路,以期得到系统而深入的理解。

损失的含义:理想模型与学习模型的比较

我们先进行一个基本假设:

  • 存在着一个绝对正确的理想统计模型,记作真实分布 PP
  • 另有一个是需要学习、需要调整参数的概率统计模型,记作 QθQ_\theta
  • 任务目标是调整参数 θ\theta,使得 QθQ_\theta 尽可能接近 PP

所以,损失函数设计的问题可以收束为,我们如何比较两个概率模型 P 与 Qθ P \text{ 与 } Q_\theta

如果我们知道真实分布 P,最自然的做法是直接定义某种‘距离’或‘差异度’:D(P,Qθ)D(P, Q_\theta),然后选择使其的参数:

θ=argminθD(P,Qθ)\theta^* = \arg\min_\theta D(P, Q_\theta)

如此,我们便定义了广义意义上的损失。需要注意的是,这里的‘距离’不一定是欧式距离,也不一定满足数学上严格的距离定义,它需要满足的是:① 当 QθQ_\theta 越接近 PP 时,损失越小;当 QθQ_\theta 偏离 PP 时,损失越大。

但现实中,真实的分布 PP 不可直接获得,我们只有从中通过观察采样得到的一批数据Dataset:𝒟={(xi,yi)}i=1nDataset:\mathcal{D}=\{(x_i,y_i)\}_{i=1}^{n}。因此,损失函数需要满足:② 用有限样本近似真实分布下的整体误差。

理论上我们关心的是期望风险Risk:R(θ)=𝔼(x,y)P[(fθ(x),y)]R(\theta)=\mathbb{E}{(x,y)\sim P}\left[\ell(f\theta(x),y)\right],但实际训练时只能使用经验风险:R^(θ)=1ni=1n(fθ(xi),yi)\hat{R}(\theta)=\frac{1}{n}\sum_{i=1}^{n}\ell(f_\theta(x_i),y_i)

综上,我所理解的损失函数,本质就是“我们希望模型怎样接近真实世界”量化成一个可以在数据上计算、可以被算法优化的目标;设计的目标就是找到符合上面两个条件的函数,来连接真实模型、现实模型与观测数据。

在我研究问题的过程中,有三个关键词一直出现:最小二乘、极大似然估计、交叉熵,这恰恰是比较两个模型‘差距’的三种思路1:最小二乘法强调数值误差,极大似然估计强调模型解释数据的概率能力,交叉熵强调概率分布之间的匹配。

最小二乘法:MSE和MAE的设计

最小二乘法(Ordinary Least Squares, OLS)或许是比较两个模型‘差距’最简单的办法,当我们考虑回归类问题,模型给出预测值 fθ(xi)f_\theta(x_i),真实观测值为 yiy_i

OLS的目标是最小化 Loss(θ)=i=1n(yifθ(xi))2Loss(\theta)=\sum_{i=1}^{n}(y_i-f_\theta(x_i))^2

这本身看起来像是一个很自然的计算规则,从计算角度看,这种平方误差形式简单、可导、容易优化;而从设计角度看,它来自于一个概率模型的假设,我们假设了观测值等于模型预测值加上随机误差:yi=fθ(xi)+εiy_i=f_\theta(x_i)+\varepsilon_i

如果我们进一步假设误差服从高斯分布εi𝒩(0,σ2)\varepsilon_i\sim \mathcal{N}(0,\sigma^2),在给定 xix_i 和参数 θ\theta 时,yiy_i 的条件概率密度为:p(yi|xi;θ)=12πσe((yifθ(xi))22σ2)p(y_i|x_i;\theta)=\frac{1}{\sqrt{2\pi}\sigma}e^{(-\frac{(y_i-f_\theta(x_i))^2}{2\sigma^2})},如果样本独立同分布,整个数据集的似然函数为:L(θ)=i=1np(yi|xi;θ)L(\theta)=\prod_{i=1}^{n}p(y_i|x_i;\theta),极大化这个似然函数等价于极小化负对数似然:logL(θ)-\log L(\theta),代入高斯分布后,可以得到:L(θ)=常数+12σ2i=1n(yifθ(xi))2L(\theta)=\text{常数} + \frac{1}{2\sigma^2}\sum_{i=1}^{n}(y_i-f_\theta(x_i))^2,而由于常数和正比例系数不影响最优解,所以极大似然估计等价于最小二乘法。

这证明了 平方损失对应着“误差服从高斯分布”的建模假设。换句话说,当我们使用均方误差时,实际上考虑的是:我们认为预测误差大体上是对称的、集中在零附近的,并且大误差应该受到更严重的惩罚。

换句话说,我们可以认为最小二乘法=高斯噪声假设下的极大似然估计

平方损失的特点也由此产生。因为误差被平方,较大的偏差会被放大,所以均方误差对异常值非常敏感。如果数据中存在大量异常点,平方损失可能并不是最合适的选择。这时可以考虑绝对误差:i=1n|yifθ(xi)|\sum_{i=1}^{n}|y_i-f_\theta(x_i)|。它对应的统计假设通常与拉普拉斯分布有关。相比平方损失,绝对误差对异常值更稳健。这也说明,损失函数的选择往往反映了我们对噪声结构的判断。

在这一part,我明白了损失函数的选择,本质上依赖于我们对数据噪声的假设。

极大似然估计:模型解释数据的能力

在上一部分,我们已经提到了极大似然估计(Maximum Likelihood Estimation, MLE),它的思想是:如果模型是好的,那么它应该给已经发生的数据较高的概率。

  • 假设模型为数据点 ziz_i 分配概率 qθ(zi)q_\theta(z_i)。整个数据集的似然为:i=1nqθ(zi)\prod_{i=1}^{n}q_\theta(z_i)
  • 极大似然估计选择:θ=argmaxθi=1nqθ(zi)\theta^*=\arg\max_\theta \prod_{i=1}^{n}q_\theta(z_i)
  • 为了便于优化、解决数据溢出问题,通常取对数:θ=argmaxθi=1nlogqθ(zi)\theta^*=\arg\max_\theta \sum_{i=1}^{n}\log q_\theta(z_i)
  • 进一步,将最大化问题转化为最小化问题:θ=argminθi=1nlogqθ(zi)\theta^*=\arg\min_\theta -\sum_{i=1}^{n}\log q_\theta(z_i)
  • 于是,负对数似然自然成为一种损失函数:(θ;zi)=logqθ(zi)\ell(\theta;z_i)=-\log q_\theta(z_i)

这一形式表达着一个原则:真实发生的事件,模型给出的概率越高,损失越小;模型给出的概率越低,损失越大。尤其当模型把真实发生的事件赋予接近 0 的概率时,logqθ(zi)-\log q_\theta(z_i) 会变得非常大。这意味着负对数似然会显著惩罚那些对错误结果赋予过高置信度的模型(模型非常肯定地给出了错误答案)。

我们抽象这种思想:先假设数据由某个概率模型生成,再用模型赋予观测数据的概率大小来衡量模型好坏。不同的概率假设会导出不同的损失函数。

据此设计的损失函数因此有明确的统计性质:模型可以最大程度解释观察到的数据

在上一部分,高斯噪声导出平方损失,拉普拉斯噪声导出绝对损失,而在下一部分,我将推导伯努利分布如何导出二分类的交叉熵,类别分布导出多分类交叉熵。统一框架部分总结为:许多看似不同的损失函数,其实都可以统一理解为负对数似然。

交叉熵:概率分布之间的匹配

在分类问题中,模型的输出通常不是一个单一数值,而是一个概率分布。例如,对于一个 K 分类问题,真实标签可以表示为分布 pp,模型预测可以表示为分布 qθq_\thetap=(p1,p2,,pK),qθ=(q1,q2,,qK)p=(p_1,p_2,\dots,p_K),\quad q_\theta=(q_1,q_2,\dots,q_K)

如果真实类别是第 c 类,那么 one-hot 标签满足:pc=1,pj=0 (jc)p_c=1,\quad p_j=0\ (j\neq c)

交叉熵定义为:H(p,qθ)=j=1KpjlogqjH(p,q_\theta)=-\sum_{j=1}^{K}p_j\log q_j,在 one-hot 情况下,它化简为:H(p,qθ)=logqcH(p,q_\theta)=-\log q_c

也就是说,多分类交叉熵就是要求模型给真实类别尽可能高的概率。若模型给真实类别的概率为 0.9,损失较小;若模型给真实类别的概率为 0.01,损失会很大。

交叉熵与信息论中的熵和 KL 散度有密切关系。

  • 真实分布 P 与模型分布 Q 的交叉熵为:H(P,Q)=𝔼xP[logQ(x)]H(P,Q)=\mathbb{E}_{x\sim P}[-\log Q(x)]
  • 可以分解为:H(P,Q)=H(P)+DKL(P|Q)H(P,Q)=H(P)+D_{\mathrm{KL}}(P|Q)
  • 其中 H(P) 是真实分布自身的熵:H(P)=𝔼xP[logP(x)]H(P)=\mathbb{E}_{x\sim P}[-\log P(x)]
  • 而 KL 散度为:𝔼xP[logP(x)Q(x)]\mathbb{E}_{x\sim P}\left[\log\frac{P(x)}{Q(x)}\right]

因为真实分布 P 固定,所以 H(P) 对模型参数 θ\theta 来说是常数。因此,最小化交叉熵等价于最小化:DKL(P|Qθ)D_{\mathrm{KL}}(P|Q_\theta)

这就回答了最初的问题:如果我们要比较一个真实概率模型和一个学习得到的概率模型,交叉熵提供了一种自然方法。它衡量的是:如果真实数据来自 P,而我们却用 QθQ_\theta 去编码或解释这些数据,平均需要付出多少额外代价。

在机器学习中,由于真实分布 (P) 不可直接获得,我们用样本平均来近似期望:H(P,Qθ)1ni=1nlogQθ(yi|xi)H(P,Q_\theta) \approx -\frac{1}{n}\sum_{i=1}^{n}\log Q_\theta(y_i|x_i)

这正是分类任务中常用的交叉熵损失,也就是负对数似然。

损失函数设计的原则总结

从最小二乘法、极大似然估计和交叉熵中,可以总结出损失函数设计的几个基本原则。

第一,损失函数应该对应问题目标。回归问题关注数值预测误差,分类问题关注类别概率,排序问题关注相对顺序,生成模型关注数据分布。目标不同,损失函数自然不同。

第二,损失函数应该反映对数据噪声的假设。如果认为误差近似高斯分布,平方损失是自然选择;如果认为异常值较多,绝对损失或 Huber 损失可能更合适;如果输出是离散类别,交叉熵更符合概率建模。

第三,损失函数应该能够比较真实分布与模型分布。理想情况下,我们希望最小化某种分布差异,如 KL 散度、交叉熵或其他 divergence。由于真实分布未知,我们通常使用样本上的经验损失来近似。

第四,损失函数应该便于优化。一个理论上合理但难以求导、非连续、极度不稳定的损失函数,可能无法在实际训练中使用。因此,损失函数往往还要考虑可导性、凸性、梯度稳定性等计算性质。

第五,损失函数应该避免错误激励。模型会按照损失函数的规则学习。如果损失函数只奖励表面指标,模型可能学到与真实目标不一致的策略。例如,在类别极度不平衡的问题中,普通交叉熵可能会让模型偏向多数类,此时需要加权交叉熵、重采样或 focal loss 等改进。

统一视角:损失函数是建模假设的外化

我在此建设一个框架:建模假设概率模型似然函数负对数似然损失函数\text{建模假设} \rightarrow \text{概率模型} \rightarrow \text{似然函数} \rightarrow \text{负对数似然} \rightarrow \text{损失函数},很多损失函数都可以看作某种概率模型下的负对数似然得到:

  • 对回归问题:高斯分布→最大化似然→最小化负对数似然→平方损失
  • 对分类问题:类别分布→最大化似然→最小化负对数似然→交叉熵损失

从这个视角看,损失函数不是任意选择的计算公式,而是我们对问题的理解、对误差的假设、对模型好坏的评价标准的集中体现。

小结

学习损失函数,最初往往是从计算开始的。我们会计算均方误差,会展开似然函数,会代入交叉熵公式。但真正深入理解损失函数,需要进一步追问:这个损失函数在惩罚什么?它假设数据如何产生?它鼓励模型学到什么?它与真实分布之间的差异有什么关系?

如果说模型是我们对世界的描述,那么损失函数就是我们评价这种描述是否准确的标准。设计损失函数,本质上是在设计学习的方向。模型最终学到什么,并不只取决于网络结构或优化算法,也取决于损失函数告诉它:什么是错误,什么是更好的解释。

最后,我将损失函数的设计问题概括为一句话:损失函数是模型与真实世界之间差距的数学表达

参考与启发:

  1. “损失函数”是如何设计出来的?直观理解“最小二乘法”和“极大似然估计法”_哔哩哔哩_bilibili ↩︎

关于建站的思考

写于重新建站的第一天…

为什么建站

这一想法最开始来自于一次复现论文-发邮件向作者要代码的答复,他回复要我的主页,现在想来他或许只是想看看我想要做什么方向的试验…但之后就一直有了这个想法,在保研季和实习期间也看见一些大佬都有自己的主页,也就加深了这一想法,又经过一位老炮的手把手指导,于是乎就有了这一站点。

建站选择

  • github.io:这是我最开始尝试的选择,跟着bilibili一个up主的视频一步步完成,做出了一个学术风格的主页。只需要一个github账号,免费快速,问题在于访问通常要使用vpn。在之后我简单学习了html和css,尝试变化了不同的风格。
  • 云服务器和网址:受限于国内无法直接访问github.io的问题,我寻找解决办法,一个最便捷的方式是使用腾讯云的云服务器与网址,每年要缴纳租金,但无国内访问限制,内容设计上也会更自由些。

建站流程

  • 1.购买云服务器和网址
  • 2.网址实名与备案(2周)
  • 3.服务器使用宝塔界面,下载PHP、Mysql等
  • 4.wordpress一键部署
  • 5.使用wordpress主题设计