数据分布与目标损失函数选择的关系

1,697 阅读4分钟

注意:大量引用
实际场景中遇到目标函数相关问题,遂调研并记录

一、通过极大似然法求解目标函数

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

1. 二分类问题

常见假设是标签服从伯努利分布,即两点分布。
伯努利分布是一个离散型机率分布。试验成功,随机变量取值为1;试验失败,随机变量取值为0。成功机率为p,失败机率为q =1-p,N次试验后,成功期望为NpN*p,方差为Np(1p)N*p*(1-p) ,所以伯努利分布又称两点分布。
假设观察二分类问题中的数据D1,D2,D3,...,Dn{D_1,D_2,D_3,...,D_n},极大似然的目标是:

maxP(D1,D2,D3,...,Dn)max P(D_1,D_2,D_3,...,D_n)

联合分布难计算,引入假设独立同分布(i.i.d.),目标公式改变为:

maxNiP(Di)(1)max\prod_{N}^{i} P(D_i) \tag{1}

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

maxNilogP(Di)(2)max\sum_{N}^{i} log P(D_i) \tag{2}

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

P(X)=pX(1p)1XD=D1,D2,D3,...,Dn(3)P(X)=p^X (1-p)^{1-X} \tag{3}\\ D = {D_1,D_2,D_3,...,D_n}
maxplogP(D)=maxplogNiP(Di)=maxpNilogP(Di)=maxpNi[Dilogp+(1Di)log(1p)](4)\max_{p} log P(D) = \max_{p} log\prod_{N}^{i} P(D_i) \\ = \max_{p} \sum_{N}^{i} log P(D_i) \\ = \max_{p} \sum_{N}^{i} [D_i logp+(1-D_i)log(1-p)] \tag{4}

即二元交叉熵公式,又称logloss类别数为2的特例等。

2. 线性回归

线性回归的损失函数MSE,公式为:

C=i=1n(yiy^i)2(5)C=\sum_{i=1}^{n}(y_i-\hat y_i)^2 \tag{5}

另还有其他的线性回归损失函数,如使用mae,Poisson,tweedie loss都可以,不过也许不那么线性了(...)
从统计学角度出发:

y(i)=θTx(i)+ε(i)(6)y^{(i)}=\theta^{T}x^{(i)}+\varepsilon^{(i)} \tag{6}

假设线性回归中的残差符合正态分布:

p(ϵ(i))=12πσexp((ϵ(i))22σ2)(7)p(\epsilon^{(i)})=\frac{1}{\sqrt{2\pi}\sigma } exp(-\frac{(\epsilon^{(i)})^{2}}{2\sigma^2}) \tag{7}

代入得到了以线性回归待求解参数为正态分布的待求解分布参数的公式

p(y(i)x(i);θ)=12πσexp((y(i)θTx(i))22σ2)(8)p(y^{(i)}|x^{(i)};\theta)=\frac{1}{\sqrt{2\pi}\sigma } exp(-\frac{(y^{(i)}-\theta^T x^{(i)})^{2}}{2\sigma^2}) \tag{8}

取log后化简:

logL(θ)=logi=1m12πσexp((y(i)θTx(i))22σ2)(9)logL(\theta )=log\prod_{i=1}^{m}\frac{1}{\sqrt{2\pi}\sigma } exp(-\frac{(y^{(i)}-\theta^T x^{(i)})^{2}}{2\sigma^2}) \tag{9}
i=1mlog12πσexp((y(i)θTx(i))22σ2)=mlog12πσ1σ212i=1m(y(i)θTx(i))2(10)\sum_{i=1}^{m}log\frac{1}{\sqrt{2\pi}\sigma } exp(-\frac{(y^{(i)}-\theta^T x^{(i)})^{2}}{2\sigma^2}) \\ =mlog\frac{1}{\sqrt{2\pi}\sigma }-\frac{1}{\sigma^2}\cdot \frac{1}{2}\sum_{i=1}^{m}{(y^{(i)}-\theta^T x^{(i)})^{2}} \tag{10}

等式右侧的第一项为一个常量,似然函数要取最大值,因而第二项越小越好,有:

J(θ)=12i=1m(y(i)θTx(i))2(11)J(\theta )=\frac{1}{2}\sum_{i=1}^{m}{(y^{(i)}-\theta^T x^{(i)})^{2}}\tag{11}

即为MSE

残差必须服从独立正态分布,自变量和残差一定保持相互独立。 线性回归的损失函数mse就是:在某个(u,σ2)(u,σ^2)下,使得服从正态分布的εε取得现有样本εiε_i的概率最大从而推算出来的损失函数的表达式。
mse实际上是方差加偏差。可以同时优化,所以常用MSE。
批量梯度下降时,需要除样本数量n,这样损失才在一个量级上。此时MSE前系数取1/N。

参考:线性回归相关知识点

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

二、在实际应用场景中,当回归问题数据不符合正态分布时(如长尾分布),应该如何讨论?

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

1.分类问题

在分类问题中,基于公式(4):Ni[Dilogp+(1Di)log(1p)] \sum_{N}^{i} [D_i logp+(1-D_i)log(1-p)],并不涉及数据分布对logloss的影响。但实际场景中,数据的分布不均衡在工程上会对模型的表现造成影响,即不均衡样本影响模型对类别的学习。这种影响在样本量较少时比较显著;在样本量大时,由于模型能够充分学习到各个类别的特征,模型同样可以充分学习,一般不需要进行不均衡处理。

不均衡学习针对的更多是“绝对不均衡”的问题,即样本的绝对数量很稀少而不是比例。

2.回归问题

在回归问题中,连续标签并没有“不均衡”这个概念,而是标签分布不符合高斯分布状态。 当标签分布不符合高斯分布时,以MSE12i=1m(y(i)θTx(i))2\frac{1}{2}\sum_{i=1}^{m}{(y^{(i)}-\theta^T x^{(i)})^{2}})为损失函数的模型拟合效果差,此时一般采取两个方式:

  • 1.在标签层面进行样本处理,使用对数变换或boxcox变换使标签尽量接近高斯分布;
  • 2.采用别的损失函数,如tweedie loss、possion loss等。

tweedie loss

image.png 如图是tweedie分布的经典例子。
Predictive Modeling with the Tweedie Distribution
tweedie loss保姆级推导过程 Tweedie 回归在信贷模型中的应用

在有些场景中, 如保险定价场景中,样本的标签分布往往不是正态分布的。90%的值是0,<%10有值,属于长尾分布。其分布有两个特征:

  • right-skewed: 样本主要分布在左边,而靠右的样本极少,表现出长尾分布;
  • zero-inflated: 在标签取值等于0处,聚集了大量的样本; 在保险定价相关的模型中,通常会将理赔次数这个随机变量记为N, 假定其分布为泊松分布: Npois(λ)N∼pois(λ)理赔金额随机变量记为ZiZ_i, 其分布为伽马分布:ZiGamma(α,γ)Z_i∼Gamma(α,γ), 总的理赔金额YY:
Y=i=1NZiY = \sum_{i=1}^{N}Z_i

在概率论中随机变量Y的分布被称为Compound Poisson–Gamma Distribution,基于该分布的概率密度函数和极大似然估计,又可以推导出tweedie损失函数,或者说tweedie分布是Compound Poisson–Gamma Distribution的一个特例. 常规的损失函数和Tweedie的对比: image.png

  • MSE基于真实标签分布为正态分布推导而来, 对异常值敏感, 倾向于预测值为mean(y)
  • MAE倾向于中位数
  • Tweedie对预测值比真实值小的情况惩罚更严重(保险/损失等预估场景)

Tweedie的损失函数形式:

Tweedie=1Ni=1N(yiμi1ρ1ρμi2ρ2ρ)Tweedie = \frac{1}{N} \sum_{i=1}^{N}-(y_i \frac{\mu _{i}^{1-\rho}}{1-\rho}-\frac{\mu _{i}^{2-\rho}}{2-\rho} )

在实际回归场景中(如预测),可以避免如MAE/MSE生成一致预测值的倾向

三、经典损失函数

参考:经典损失函数

  • 均方误差(Mean Squared Error,MSE)
  • 交叉熵损失(Cross-Entropy Loss)
  • 对数损失(Log Loss)
  • 平滑L1损失(Smooth L1 Loss)
  • 平滑L2损失(Smooth L2 Loss)
  • 对数平方误差(Log Cosine Loss)
  • Margin Loss
  • 对数sigmoid损失(Log Sigmoid Loss)
  • Hinge Loss
  • Triplet Loss

1.回归损失

(1)均方误差(Mean Squared Error,MSE)

MSE=1mi=1m(y(i)y^(i))2MSE=\frac{1}{m}\sum_{i=1}^{m}{(y^{(i)}-\hat y^{(i)})^{2}}

yiy_i 表示真实值,y^i\hat{y}_i表示预测值,nn表示数据样本数。

(2)平滑L1损失(Smooth L1 Loss,Huber函数δ=1时的特例)

平滑L1损失(Smooth L1 Loss)是一种混合损失函数,用于回归问题。平滑L1损失的数学模型公式如下:

LSmoothL1(y,y^)={0.5y2if yccy0.5c2if y>cL_{SmoothL1}(y, \hat{y}) = \begin{cases} 0.5y^2 & \text{if } |y| \leq c \\ c|y| - 0.5c^2 & \text{if } |y| > c \end{cases}

其中,yy 表示真实值,y^\hat{y}表示预测值,cc 是一个常数,通常取为0.01。

Huber损失函数(平滑平均绝对误差)。Huber函数是对MAE和MSE二者的综合,其在函数值为0时,它也是可微分的。包含了一个超参数δ,δ 值决定了 Huber侧重于 MSE 还是 MAE:

  • 当δ~ 0时,Huber损失会趋向于MSE;
  • 当δ~ ∞,Huber损失会趋向于MAE。

image.png

为什么使用Huber Loss? 使用MAE训练神经网络的一个大问题是经常会遇到很大的梯度,使用梯度下降时可能导致训练结束时错过最小值。对于MSE,梯度会随着损失接近最小值而降低,从而使其更加精确。

在这种情况下,Huber Loss可能会非常有用,因为它会使最小值附近弯曲,从而降低梯度。另外它比MSE对异常值更鲁棒。因此,它结合了MSE和MAE的优良特性。

但是,Huber Loss的问题是可能需要迭代地训练超参数delta。

(3)平滑L2损失(Smooth L2 Loss)

平滑L2损失(Smooth L2 Loss)是一种混合损失函数,用于回归问题。平滑L2损失的数学模型公式如下:

LSmoothL2(y,y^)=12(yy^)2+λ2y^2L_{SmoothL2}(y, \hat{y}) = \frac{1}{2}(y - \hat{y})^2 + \frac{\lambda}{2}\hat{y}^2

其中,yy 表示真实值,y^\hat{y} 表示预测值,λ\lambda是一个正常数,用于调整平滑L2损失的程度。

(4)绝对误差(MAE)& L1误差(nn.L1Loss)

绝对误差与L1误差,两者的误差都根据模型预测值 f(x)f(x) 与样本真实值 yy 之间距离计算。其公式如下:

MAE=1ni=1nyiyipL1=i=1nyiyipMAE = \frac {1}{n} \sum_{i=1}^{n}|y_i-y_{i}^{p}| \\ L1 = \sum_{i=1}^{n}|y_i-y_{i}^{p}|

2.分类损失

(1)交叉熵损失(Cross-Entropy Loss)

H(p,q)=i=1n[yilog(y^i)+(1yi)log(1y^i)]H(p, q) = -\sum_{i=1}^{n} [y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i)]

其中,yiy_i表示真实标签(0或1),y^i\hat{y}_i表示预测概率,nn表示数据样本数。

(2)对数损失(Log Loss)

对数损失(Log Loss)是一种特殊的交叉熵损失,用于二分类问题。对数损失的数学模型公式如下:

LogLoss=1ni=1n[yilog(y^i)+(1yi)log(1y^i)]Log Loss = -\frac{1}{n} \sum_{i=1}^{n} [y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i)]

其中,yiy_i表示真实标签(0或1),y^i\hat{y}_i表示预测概率,nn表示数据样本数。

(3)对数平方误差(Log Cosine Loss)

对数平方误差(Log Cosine Loss)是一种用于角度相似度问题的损失函数。对数平方误差的数学模型公式如下:

LogCosineLoss=12log(22cos(θ))Log Cosine Loss = -\frac{1}{2} \log(2 - 2 \cos(\theta))

其中,θ\theta表示真实角度与预测角度之间的角度差。

(4)Margin Loss

Margin Loss 是一种用于多类分类问题的损失函数,用于处理软标签。Margin Loss 的数学模型公式如下:

MarginLoss=max(0,1yy^)Margin Loss = \max(0, 1 - y \cdot \hat{y})

其中,yy 表示真实标签,y^\hat{y} 表示预测概率。

(5)对数sigmoid损失(Log Sigmoid Loss)

对数sigmoid损失(Log Sigmoid Loss)是一种用于二分类问题的损失函数。对数sigmoid损失的数学模型公式如下:

LogSigmoidLoss=1ni=1n[yilog(y^i)+(1yi)log(1y^i)]Log Sigmoid Loss = -\frac{1}{n} \sum_{i=1}^{n} [y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i)]

其中,yiy_i表示真实标签(0或1),y^i\hat{y}_i表示预测概率,nn表示数据样本数。

(6)Hinge Loss

Hinge Loss 是一种用于多类分类问题的损失函数,用于处理软标签。Hinge Loss 的数学模型公式如下:

HingeLoss=max(0,1yy^)Hinge Loss = \max(0, 1 - y \cdot \hat{y})

其中,yy表示真实标签,y^\hat{y}表示预测概率。

(7)Triplet Loss

Triplet Loss 是一种用于多类分类问题的损失函数,用于处理三元组数据。Triplet Loss 的数学模型公式如下:

TripletLoss=max(0,d(a,p)d(a,n)+m)Triplet Loss = \max(0, d(a, p) - d(a, n) + m)

其中,aa 表示查询样本,pp 表示正样本,nn表示负样本,d(a,p)d(a, p)表示查询样本与正样本之间的距离,d(a,n)d(a, n)表示查询样本与负样本之间的距离,mm是一个正常数,用于调整三元组损失的程度。

工业应用中如何选择合适的损失函数

选择合适的损失函数

1.对于MAE、MSE、Huber

  • 从误差的角度来说: MSE可以用来评价数据变化的程度,MAE则能更好的反应预测值误差的实际情况
  • 从离群点角度选择:  如果离群点仅仅只是在数据提取的过程中的损坏或者清洗中的错误采样,则无须给予过多关注,那么我们应该选择 MAE, 但如果离群点是实际的数据或者重要的数据需要被检测到的异常值,那我们应该选择 MSE。

由于MSE对误差e(e)进行平方操作yypredicted=e(y - y_predicted = e),如果e>1e> 1,误差的值会增加很多。如果数据中有一个离群点,ee的值将会很高,将会远远大于e|e|。和以MAE为损失的模型相比,以MSE为损失的模型会赋予更高的权重给离群点。

对所有的观测数据,如果只给一个预测结果来最小化MSE,那么该预测值应该是所有目标值的均值。但是如果试图最小化MAE,那么这个预测就是所有目标值的中位数。中位数对于离群点比平均值更鲁棒,这使得MAE比MSE更加鲁棒。

使用MAE损失(特别是对于神经网络)的一个大问题是它的梯度始终是相同的,这意味着即使对于小的损失值,其梯度也是大的。这对模型的学习不好。为了解决这个问题,可以使用随着接近最小值而减小的动态学习率。MSE在这种情况下的表现很好,即使采用固定的学习率也会收敛。MSE损失的梯度在损失值较高时会比较大,随着损失接近0时而下降,从而使其在训练结束时更加精确。

一个以MAE为损失的模型可能对所有观测数据都预测为150,而忽略10%的离群情况,因为它会尝试去接近中值

  • 从收敛速度的角度来说: MSE>Huber>MAE
  • 从求解梯度的复杂度来说:MSE 要优于 MAE,且梯度也是动态变化的,MSE能较快准确达到收敛。
  • 从模型的角度选择:对于大多数CNN网络,我们一般是使用MSE而不是MAE,因为训练CNN网络很看重训练速度,对于边框预测回归问题,通常也可以选择平方损失函数,但平方损失函数缺点是当存在离群点(outliers)的时候,这些点会占loss的主要组成部分。对于目标检测FastR CNN采用稍微缓和一点绝对损失函数(smooth L1损失),它是随着误差线性增长,而不是平方增长。

参考:5 Regression Loss Functions All Machine Learners Should Know image.png 连续损失函数:(A)MSE损失函数; (B)MAE损失函数; (C)Huber损失函数; (D)Quantile损失函数。用有噪声的sinc(x)数据来拟合平滑GBM的示例:(E)原始sinc(x)函数; (F)以MSE和MAE为损失拟合的平滑GBM; (G)以Huber Loss拟合的平滑GBM, = {4,2,1}; (H)以Quantile Loss拟合的平滑GBM。

All the loss functions in a single plot.

image.png