ROC/AUC/GAUC/AUUC

Table of Contents

混淆矩阵、分类指标与阈值

当我们考虑一个二分类问题的场景,结果无非四种,我们可以做成一个混淆矩阵:

预测结果\真实结果PositiveNegative
PositiveTP (True Positive)FP (False Positive)
NegativeFN (False Negative)TN (True Negative)

其中我们可以关注两个指标:

  • TPR:TPTP+FN\frac{TP}{TP+FN},即真实为正的人群中,判别出的比例,召回率,越高越好
  • FPR:FPFP+TN\frac{FP}{FP+TN},即真实为负的人群中,被错判为正的比例,误报率,越低越好

当我们考虑分类模型的输出,经过线性层得到 logits 值,再经过非线性变化为概率值,比如 Positive 的概率为0.9,那我们以判定是 P,判定的标准可以是0.5,也可以根据任务的侧重改变,但总有一个阈值来根据概率值进行分类判别。在不同阈值下,TPR和FPR的值都会发生改变

ROC曲线

ROC曲线(Receiver Operating Characteristic)就是在不同阈值下的TPR与FPR的曲线,纵轴表示TPR大小,横轴表示FPR大小。我们先列出不同阈值下的比值,当阈值为1时,样本全部被判定为N,召回率为0;此后随着阈值增加,被判定为T的样本数增加,召回率上升;阈值为0时,样本全部被判定为T,召回率为1。

以原点为起点,可以画出随机分类器基线,表示随机猜测的结果。

AUC:ROC评估结果

AUC(Area Under Curve)表示ROC曲线下的面积,一般取值[0.5,1.0],0.5时等价于随机模型,1.0时为理想分类器。AUC是ROC曲线的量化评估结果,整体评价不受阈值影响,类别不平衡时(均衡时准确率Accuracy有效)依然可靠,更方便比较不同模型能力。

AUC可直观理解为:随机抽取一个P样本和N样本,模型给P打分比给N打分高的概率。又可以理解为模型把正样本排序在负样本之前的概率。

Gini系数是AUC的归一化:Gini=2AUC1Gini=2\cdot AUC-1

GAUC:分组AUC

G即代表Group,核心思想是:先对样本进行分组,计算组内AUC,然后按照各组的权重(样本量等),对组内AUC进行加权平均。

问题源于AUC考虑所有的样本,而在推荐领域,我们考虑的是同个用户内部的点击或转化的item的排序。用户偏差对评估结果会干扰,例如Score shift问题:

  • 假设有用户A点击率0.20,用户B点击率0.01,模型给A的所有item打高分,B的item打低分,AUC值就很高
  • 不会考虑模型有没有把A/B会点的商品排在不会点的商品前面
  • 用户只会看到自己的列表,模型线上效果差。

Uplift曲线与AUUC

累计增益曲线就是按预测 uplift 值从高到低排序,观察随着投放比例增加,累计能拿到多少的真实增量收益,比如:

  • uplift分数排序后 top10%,top20%分桶
  • 计算这一批一批用户的平均uplift
  • 作累积值

横轴是用户比例,纵轴是指标(增量GMV、增量下单),好的模型左侧快速上升,并且整体高于随机基准线,随着用户比例的增加,增速缓慢,是因为人群uplift比较低,甚至是负值,不值得继续投放。

同时还有Qini 曲线,表示相比随机策略,获得了多少增量。QINI系数表示累计增益曲线与随机基准线围成的面积。

在真实业务中,我们可以把它当作是一个粗略的投放阈值参照,如果20%的时候上升快,30%后趋于平缓,那么业务上可能就更多给前20%左右的人发券,但是也要考虑预算约束、风险等问题。

求职方向

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

业务算法

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

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

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

网络干扰下基于最优传输的因果效应估计研究-实验

PPT

数据生成机制

合成实验中,处理分配概率依赖个体协变量 XiX_i、邻居协变量 XN(i)\bar{X}_{N(i)}、度数 did_i、社群归属 CiC_i和非线性交互项, γ\gamma 控制网络混杂强度。简化表达为

P(Ti=1|X,G)=logit1{γf(Xi,XN(i),di,Ci)P(T_i=1\mid X,G)=\operatorname{logit}^{-1}\{\gamma \cdot f(X_i,\bar{X}_{N(i)},d_i,C_i)

结果生成模型包含基线结果、邻居影响-暴露效应 λEi\lambda E_i、自身处理效应 TiτiT_i\tau_i 以及处理与协变量、度数、邻居协变量和暴露之间的交互(TiXi,TidiT_iX_i, T_id_i等):

Yi=μ0(Xi,XN(i),di,Ci)+λEi+Tiτi+εiY_i=\mu_0(X_i,\bar{X}_{N(i)},d_i,C_i)+\lambda E_i+T_i\tau_i+\varepsilon_i

τi\tau_i (忽略网络干扰的ITE)在模拟过程中已知,因此可以计算真实的平均处理效应,并进一步计算偏差和均方根误差。

真实拓扑半合成实验中,网络结构取自真实 Facebook 社交网络,did_i 分布长尾且高度数节点存在; 社区结构更明显; 局部聚集性更强; 邻居之间更可能相似;处理变量和结果变量用人工机制生成。

处理概率依赖个体特征、邻居特征、度数和社区结构,从而形成网络混杂;结果模型同时包含自身处理效应和邻居暴露效应,从而体现网络干扰。

对比指标

估计的准确程度

  • 偏差:Bias=E(τ^τ)Bias=E(\hat{\tau}-\tau)
  • 均方根误差:RMSE=E[(τ^τ)2]RMSE=\sqrt{E[(\hat{\tau}-\tau)^2]}

方法诊断与边界分析:

  • 传输成本:判别匹配难度与稳健性(成本高时,表示差异大,依赖外推,不够稳健)
  • 有效对照样本量 ESS:判别重叠/支持度
  • 最大负载:判别最重要的对照样本承担了多少匹配权重(权重集中,估计不稳定)
  • 传输前后标准化均值差 SMD:两个分布的平衡改善情况
  • 拓扑扰动下的估计漂移:网络扰动(边重连)后估计稳定性
  • 未观测混杂敏感性区间:如果还有隐藏混杂,结论是否可靠(远离 0,结论稳健)

对比方法与结果

Naive同一暴露内处理组与对照组直接均值差
IPW固定暴露基于个体协变量的逆概率加权
OR固定暴露使用调整表示的结果回归
OT-no-exp忽略暴露的最优传输匹配
OT-match在暴露内做最优传输,无残差化校正
OT-no-web不使用网络结构表示,仅保留个体协变量
本文方法暴露约束、容量上限传输与残差化校正

重复24次,指标为RMSE(Bias),Variance=MSE2Bias2MSE^2-Bias^2

场景NaiveIPWOROT-no-expOT-matchOT-no-web本文方法
强网络混杂1.763 (1.745)0.544 (0.487)0.455 (0.420)0.803 (0.784)0.851 (0.839)0.637 (0.608)0.369 (0.330)
高同质性1.677 (1.662)0.536 (0.485)0.362 (0.326)0.647 (0.635)0.777 (0.761)0.529 (0.505)0.282 (0.236)
弱重叠消融1.905 (1.882)0.783 (0.726)0.561 (0.522)1.047 (1.023)0.966 (0.951)0.794 (0.759)0.430 (0.370)
真实拓扑半合成1.624 (1.605)0.682 (0.657)0.494 (0.478)0.605 (0.581)0.816 (0.799)0.607 (0.591)0.403 (0.376)
Naive:误差最大,说明网络观测数据中确实存在显著混杂
IPW/OR:能够降低误差,但在网络结构混杂较强时仍不充分
OT-no-exp:跨暴露状态匹配破坏因果对比性
OT-match:存在较大偏差。
OT-no-web:去掉结构表示会导致性能下降
本文方法(暴露约束、网络结构表示、容量上限和残差化校正):在四个场景中均取得最低均方根误差
方差:各类场景下,本文方法方差均小于IPW方法

理论验证诊断:

A:当源分布与目标分布的调整表示偏移增大时,纯传输误差明显增加,本文方法基本稳态
B:估计偏差项与纯传输误差较强对应关系
C:方差代理量与平方误差之间的关系
D:样本量增大时,RMSE下降,趋势接近 n1n^{-1}合理的收敛趋势
E、F:标准化误差的正态近似 和 Wald 覆盖率接近 95%:在稳定设计下可以使用近似推断

合成网络验证:压力测试与消融实验

A:网络混杂强度上升,Naive和OT-match误差快速增大,本文方法保持较低误差
B:随着同质性增强,网络结构相关混杂更明显
C:溢出效应增强时,OT-no-exp 产生明显误差
D:暴露区间数与有效对照样本量之间需要权衡
E:弱重叠场景下的消融实验
F:OT后的表示平衡情况:改善了多个维度上的分布差异

真实拓扑半合成实验

A:网络度分布具有明显长尾特征:大多节点连接边少,连接边集中于少数节点
B:本文方法在真实拓扑场景中仍然取得最低RMSE
C:不同暴露层的处理样本、对照样本和有效对照样本量:高暴露单元支持不足
D:边重连扰动下的估计漂移和暴露标签不稳定性:当拓扑扰动改变暴露状态时,估计目标本身也会发生变化
E:未观测网络混杂的敏感性区间
F:真实拓扑表示上的平衡改善情况

结论

围绕网络干扰下的因果效应估计问题,设计了一种基于暴露约束、最优传输和残差化校正的估计方法:通过暴露映射明确因果对比,在固定暴露状态内使用带容量上限的最优传输构造对照分布,最后通过交叉拟合结果回归进行残差化校正。
实验表明,在强网络混杂、高同质性、弱重叠和真实拓扑半合成场景中,本文方法均取得最低均方根误差。消融实验进一步说明,忽略暴露状态、去掉残差化校正或不使用网络结构表示都会导致性能下降。多面板诊断图表明,该方法不仅能降低估计误差,也能提供有效样本量、平衡性、拓扑稳定性和未观测混杂敏感性等辅助判断。

本方法并不声称可以消除网络因果推断中问题,但能够在明确暴露的前提下,将最优传输的分布平衡能力与因果推断中的残差化校正结合起来,为复杂网络场景下的政策评估和机制分析提供有价值的工具。

IPW与本文方法的比较:

  • 都基于再加权思想,目标都是构造一个更可比的对照分布,来近似RCT
  • 回归结合思想,前者双重稳健估计,后者残差化校正
  • 前者通过倾向得分模型实现平衡,是处理概率校正
  • 后者通过表示空间距离实现平衡,是分布几何对齐

后续方向

  1. 引入图神经网络进行表示学习,提高表示对潜在网络混杂的捕捉能力
  2. 更优秀的暴露映射选择策略,在偏差和样本支持之间自动权衡
  3. 在真实业务数据上进行案例研究

优惠券核销预测与发放策略

O2O优惠券使用预测问题

天池数据:用户在2016年1月1日至2016年6月30日之间真实线上线下消费行为,预测用户在2016年7月领取优惠券后15天以内的使用情况。

目标:是预测投放的优惠券是否核销,使用优惠券核销预测的平均AUC作为评价标准。 即对每个优惠券coupon_id单独计算核销预测的AUC值,再对所有优惠券的AUC值求平均作为最终的评价标准。

数据集:提供了三个数据集:

  • 用户线下消费和优惠券领取行为
  • 用户线上点击/消费和优惠券领取行为
  • 用户O2O线下优惠券使用预测样本

数据探索性分析

数据预处理方法

熵、相对熵、交叉熵的信息论角度推导

在MLE和loss function设计章节,我在统计角度推导了交叉熵损失函数是如何产生的,在这一部分,我将从信息论角度出发,推导信息量、熵、相对熵、交叉熵的公式。

信息量公式的推导

熵通常被理解为系统的混乱程度和不确定性,不过在定义熵之前,我们需要先讨论什么是‘信息量’。我们先推导信息量的公式:设某个事件发生的概率为 p,我们希望定义一个函数 f(p):=信息量f(p):=\text{信息量}

在直觉上,一个事件越难发生,它一旦发生了,信息量就越大。例如,我们假定2026年阿根廷卫冕冠军这一事件,现在我们知道阿根廷已经进入了8强,假设每支球队夺冠概率相同,我们有

  • 阿根廷夺冠概率为1/8
  • 阿根廷进入决赛的概率1/4
  • 阿根廷在决赛中胜利的概率1/2

‘阿根廷夺冠’可以分为两个阶段:1.进入决赛;2.决赛中胜利,那么它的信息量也应该可以分为两个部分:f(1/8)=f(1/4)+f(1/2)f(1/8)=f(1/4)+f(1/2)

也就是说,两个独立事件同时发生的概率是相乘的,而它们的信息量应该是相加的。因此我们希望信息量函数满足性质1f(pq)=f(p)+f(q)f(pq)=f(p)+f(q)

满足这种性质的函数,自然会出现对数形式。因为:log(pq)=logp+logq\log(pq)=\log p+\log q

另有性质2:概率越小,信息量应该越大;而 logp\log p0<p<10<p<1 时是负数,并且概率越小,logp\log p 越小。所以我们加上负号,定义信息量为:f(p)=logpf(p)=-\log p

如果以 2 为底,则有:f(p)=log2pf(p)=-\log_2 p,这时信息量的单位叫做 bit。例如:f(1/8)=log2(1/8)=3f(1/8)=-\log_2(1/8)=3,阿根廷夺冠的信息量是3bit,为进入决赛和赢得决赛的信息量之和。

而从另一个角度看,如果以 2 为底,那么信息量可以理解为“需要多少次二选一的问题才能确定结果”。例如,连续抛 3 次硬币,全部正面的概率是:12×12×12=18\frac{1}{2}\times \frac{1}{2}\times \frac{1}{2}=\frac{1}{8},因此这个事件的信息量就是 3 bit。

熵:整个系统的平均不确定性

信息量衡量的是单个时间发生时带来的信息多少,但一个随机系统或分布有多个可能的结果,假设一个系统有 K 种可能结果:x1,x2,,xKx_1,x_2,\cdots,x_K

它们对应的概率分布为:P=(p1,p2,,pK)P=(p_1,p_2,\cdots,p_K),其中:i=1Kpi=1\sum_{i=1}^{K}p_i=1

每个事件 xix_i 的信息量是:log2pi-\log_2 p_i

那么整个系统的平均信息量,就是对所有可能结果的信息量做加权平均:H(P)=i=1Kpi(log2pi)H(P)=\sum_{i=1}^{K}p_i\cdot (-\log_2 p_i),也就是:H(P)=i=1Kpilog2piH(P)=-\sum_{i=1}^{K}p_i\log_2 p_i

这就是熵,我将其理解为一个概率系统在平均意义上的不确定性

如果某个结果几乎必然发生,那么系统的不确定性很低,熵也低。例如 P=(1,0,0,0)P=(1,0,0,0),这个系统没有不确定性,因为结果已经确定。但如果每个结果都差不多可能发生,例如:P=(1/4,1/4,1/4,1/4)P=(1/4,1/4,1/4,1/4),那么系统的不确定性更高,熵也更大。

相对熵:用 Q 描述 P 时,损失了多少信息?

假设有两个概率分布:P=(p1,p2,,pK)P=(p_1,p_2,\cdots,p_K)Q=(q1,q2,,qK)Q=(q_1,q_2,\cdots,q_K),其中其中,P 是真实分布,Q 是我们用来近似真实分布的模型分布。

问题便可以收束为:如果真实世界服从分布 (P),但我们用分布 (Q) 去描述它,会额外损失多少信息?

对于第 i 个事件,如果我们按照真实分布 P 来看,它的信息量是:log2pi-\log_2 p_i

但如果我们错误地用 Q 来描述它,那么它的信息量会被写成:log2qi-\log_2 q_i

两者的差值是:log2qi(log2pi)-\log_2 q_i – (-\log_2 p_i),也就是:log2piqi\log_2 \frac{p_i}{q_i}

由于真实系统中第 i 个事件出现的概率是 pip_i(以P为基准),所以我们对所有事件做加权平均:DKL(P|Q)=i=1Kpi[(log2qi)(log2pi)]D_{KL}(P|Q)=\sum_{i=1}^{K}p_i\left[(-\log_2 q_i)-(-\log_2 p_i)\right]

化简可得:DKL(P|Q)=i=1Kpilog2piqiD_{KL}(P|Q)=\sum_{i=1}^{K}p_i\log_2 \frac{p_i}{q_i}

这就是 KL 散度,也叫相对熵。我将其理解为衡量两个分布之间的差异:当真实分布是 (P),但我们使用近似分布 (Q) 来描述它时,平均多出来的信息代价

KL 散度有一个重要性质:DKL(P|Q)0D_{KL}(P|Q)\geq 0,并且只有当 P=Q 时,KL 散度等于 0。这个性质来自吉布斯不等式,在此不再证明。

不过需要注意的是,KL 散度不是严格意义上的距离,因为通常:DKL(P|Q)DKL(Q|P)D_{KL}(P|Q)\neq D_{KL}(Q|P),它是有方向的。

交叉熵:真实分布 P 下,用 Q 编码所需要的信息量

我们回看 KL 散度的展开式:DKL(P|Q)=i=1Kpi(log2qi)i=1Kpi(log2pi)D_{KL}(P|Q)=\sum_{i=1}^{K}p_i(-\log_2 q_i)-\sum_{i=1}^{K}p_i(-\log_2 p_i)

后半部分是 P 自身的熵:H(P)=i=1Kpi(log2pi)H(P)=\sum_{i=1}^{K}p_i(-\log_2 p_i)

前半部分我们称之为交叉熵:H(P,Q)=i=1Kpi(log2qi)H(P,Q)=\sum_{i=1}^{K}p_i(-\log_2 q_i)

因此:DKL(P|Q)=H(P,Q)H(P)D_{KL}(P|Q)=H(P,Q)-H(P)

也就是说:H(P,Q)=H(P)+DKL(P|Q)H(P,Q)=H(P)+D_{KL}(P|Q)

这说明交叉熵由两部分组成:

  1. 真实分布 P 自身的不确定性;
  2. 用 Q 近似 P 所带来的额外信息损失。

在机器学习中,真实分布 P 通常是固定的。我们无法改变真实世界本身的不确定性 H(P),能改变的是模型分布 Q。

所以,最小化 KL 散度minQDKL(P|Q)\min_Q D_{KL}(P|Q) 等价于最小化交叉熵minQH(P,Q)\min_Q H(P,Q)

这就是为什么分类模型中经常使用交叉熵作为损失函数。

机器学习视角下的交叉熵

在公式中,有两个关键参数,K与N,对应着类别数量和样本数量。

当我们有一个三分类问题 K=3,对应的类别可能是猫、狗、鸟\text{猫、狗、鸟},那么一个样本的交叉熵可以写作:k=1Kyklogy^k-\sum_{k=1}^{K}y_k\log \hat y_k,这里的 k 是类别编号。

当我们有一个训练集,样本量为 N:(x1,y1),(x2,y2),,(xN,yN)(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N),整个训练集上的平均交叉熵可以写作:L=1Ni=1Nk=1Kyiklogy^ikL=-\frac{1}{N}\sum_{i=1}^{N}\sum_{k=1}^{K}y_{ik}\log \hat y_{ik},这里 i 表示第 i 个样本。

机器学习中的分类任务,本质上都是在做一件事情:用模型预测出来的概率分布 (Q),去拟合真实标签背后的分布 (P)

而对一个样本,真实标签通常是 one-hot 形式。

  • 假设模型预测的概率分布是:y^=(0.1,0.7,0.2)\hat y=(0.1,0.7,0.2)
  • 那么这个样本的交叉熵损失是:k=1Kyklogy^k-\sum_{k=1}^{K}y_k\log \hat y_k
  • 由于真实标签 y 是 one-hot 向量,只有正确类别对应的位置为 1,其他位置都是 0。所以这个式子实际上会变成:log0.7-\log 0.7

在此,我发现,分类交叉熵本质上惩罚的是:模型给真实类别分配的概率不够高。如果模型给真实类别的概率越高,损失越小;如果模型给真实类别的概率越低,损失越大。例如:log0.9-\log 0.9很小,而:log0.01-\log 0.01很大。这也说明了交叉熵的一个重要特点:它会对“自信但错误”的预测给予非常大的惩罚。

二分类交叉熵

在二分类问题中,真实标签通常为:y0,1y\in{0,1}

模型输出的是样本属于类别 1 的概率:y^=P(y=1|x)\hat y=P(y=1|x)

那么样本属于类别 0 的概率就是:1y^1-\hat y

如果真实标签是 1,我们希望 y^\hat y 越接近 1 越好。如果真实标签是 0,我们希望 y^\hat y 越接近 0 越好,也就是 1y^1-\hat y 越接近 1 越好。

因此二分类交叉熵写作:L=[ylogy^+(1y)log(1y^)]L=-\left[y\log \hat y+(1-y)\log(1-\hat y)\right],我们可以分情况看:

  • 当 y=1 时,L=logy^L=-\log \hat y,此时模型越相信样本属于类别 1,损失越小。
  • 当 y=0 时,L=log(1y^)L=-\log (1-\hat y),此时模型越相信样本属于类别 0,损失越小。

设计的本质是:根据真实标签,取出模型给真实类别分配的概率,然后对它取负对数。

多分类交叉熵与 Softmax

在多分类问题中,模型通常不会直接输出概率,而是先输出一组实数分数,叫做 logits。

设模型对 K 个类别输出:z1,z2,,zKz_1,z_2,\cdots,z_K,其中 zkz_k 表示模型对第 k 类的原始打分,需要注意的是 logits 不是概率:

  • 它们可以是任意实数
  • 不一定大于 0
  • 加起来也不等于 1

因此我们需要用 Softmax 操作把 logits 转换成概率分布:y^k=softmax(zk)=ezkj=1Kezj\hat y_k=\text{softmax}(z_k)=\frac{e^{z_k}}{\sum_{j=1}^{K}e^{z_j}}

可以看出,softmax的作用是:将一个实数向量转换成概率分布,使每个元素表示属于对应类别的概率,并且所有概率之和为 1

经过 Softmax 后,有:y^1+y^2++y^K=1\hat y_1+\hat y_2+\cdots+\hat y_K=1,并且:0<y^k<10<\hat y_k<1

于是,多分类交叉熵可以写成:L=k=1Kyklogy^kL=-\sum_{k=1}^{K}y_k\log \hat y_k

把 Softmax 代入其中,就得到:L=k=1Kyklog(ezkj=1Kezj)L=-\sum_{k=1}^{K}y_k\log\left(\frac{e^{z_k}}{\sum_{j=1}^{K}e^{z_j}}\right)

小结

信息量描述的是单个事件发生后带来的信息多少:f(p)=logpf(p)=-\log p,概率越小,信息量越大。

熵描述的是整个概率系统的平均不确定性:H(P)=i=1KpilogpiH(P)=-\sum_{i=1}^{K}p_i\log p_i

KL 散度描述的是近似分布 (Q) 描述真实分布 (P) 时,多出来的信息损失:DKL(P|Q)=i=1KpilogpiqiD_{KL}(P|Q)=\sum_{i=1}^{K}p_i\log\frac{p_i}{q_i}

交叉熵描述的是:在真实分布 (P) 下,使用模型分布 (Q) 进行描述所需要的平均信息量:H(P,Q)=i=1KpilogqiH(P,Q)=-\sum_{i=1}^{K}p_i\log q_i

它们之间的关系是:H(P,Q)=H(P)+DKL(P|Q)H(P,Q)=H(P)+D_{KL}(P|Q)

由于真实分布的熵 H(P) 是固定的,所以最小化交叉熵,就等价于让模型分布 (Q) 尽可能接近真实分布 (P)。这就是交叉熵损失函数的核心思想。

在分类任务中,真实标签通常是 one-hot 分布,模型输出的是各类别的预测概率。因此交叉熵损失可以简单理解为:惩罚模型没有给真实类别足够高的概率。这也是为什么交叉熵特别适合分类问题。它不是一个孤立的公式,而是从信息量、熵、KL 散度一路自然推导出来的结果。

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主题设计