机器学习——损失函数

机器学习——损失函数

    • 前言
    • 一、分类问题的损失函数
      • 1、0-1损失(one-zero loss)
      • 2、Log Loss
      • 3、Focal Loss
      • 4、相对熵、KL散度(Relative Entropy/Kullback-Leibler Divergence)
      • 5、指数损失(Exponential Loss)
      • 6、Hinge Loss
    • 二、回归问题的损失函数
      • 1、均值平方差(Mean Squared Error,MSE)
      • 2、均方根误差(Root Mean Square Error,RMSE)
      • 3、平均绝对值误差(Mean Absolute Deviation,MAD)
      • 4、平滑平均绝对误差(Huber Loss/Smooth Mean/Absolute Error)
      • 5、Log-Cosh损失函数
      • 6、分位数损失(Quantile Loss)

前言

对于机器学习算法,大部分依赖对目标函数的最大化或最小化,常常把最小化的函数称为损失函数,主要用于衡量机器学习模型的预测能力;对于深度学习,损失函数是绝对网络学习质量的关键,无论什么样的网络结构,如果使用损失函数不正确最终都将难以训练出正确的模型。
按照算法任务的不同,可将损失函数总结成下图的形式。
本篇针对不同的任务(回归和分类),主要说明
机器学习——损失函数_第1张图片

一、分类问题的损失函数

1、0-1损失(one-zero loss)

0-1损失不连续、非凸,优化困难,因而常使用其他的代理损失函数进行优化。
L ( y , f ( x ) ) = { 1 , i f   y   ≠ f ( x ) 0 , i f   y   = f ( x ) (1) L(y,f(x))= \left\{\begin{matrix} 1,& if\ y\ \neq f(x)\\ 0,& if\ y\ = f(x) \end{matrix}\right.\tag{1} L(y,f(x))={1,0,if y =f(x)if y =f(x)(1)

2、Log Loss

对数损失、对数似然损失,也被称为逻辑斯蒂回归损失(Logistic Loss)或交叉熵损失(cross-entropy Loss),常用于多项逻辑斯蒂回归和神经网络,可用于评估分类器的 概率输出。
对数损失通过惩罚错误的分类,实现对分类器的准确度(Accuracy)的量化.。最小化对数损失基本等价于最大化分类器的准确度。为了计算对数损失, 分类器必须提供对输入的所属的每个类别的概率值, 不只是最可能的类别.。对数损失函数的计算公式如下:
L ( Y , P ( Y ∣ X ) ) = − l o g P ( Y ∣ X ) = − 1 N ∑ i = 1 N ∑ j = 1 M y i j   l o g ( p i j ) (2) L(Y,P(Y|X))=-logP(Y|X)= -\frac{1}{N}\sum_{i=1}^{N}\sum_{j=1}^{M}y_{ij}\ log(p_{ij}) \tag{2} L(Y,P(YX))=logP(YX)=N1i=1Nj=1Myij log(pij)(2)
其中L为损失函数,Y为输出变量,X为输入变量,N为样本数,M为类别数, y i j ∈ { 0 , 1 } y_{ij}\in \{0,1\} yij{0,1}表示类别j是否是输入实例 x i x_{i} xi的真实类别, p i j p_{ij} pij为模型或分类器预测输入实例 x i x_{i} xi属于类别j的概率。(这块需要一定实践基础才能看的懂)
假如只有两类 y ∈ { 0 , 1 } y\in \{0,1\} y{0,1},怎上式可化简为如下形式(对于交叉熵的推导过程可参见我的另一篇博文:逻辑斯蒂回归(式(8))):
− 1 N ∑ i = 1 N ( y i l o p   p i + ( 1 − y i ) ( l o g ( 1 − p i ) ) ) (3) -\frac{1}{N}\sum_{i=1}^{N}(y_{i}lop\ p_{i}+(1-y_{i})(log(1-p_{i})))\tag{3} N1i=1N(yilop pi+(1yi)(log(1pi)))(3)
其中, y i y_{i} yi为输入 x i x_{i} xi的真实类别, p i p_{i} pi为算法对输入实例 x i x_{i} xi的预测值,
(2)式也被称为交叉熵损失,交叉熵损失越小,代表预测结果越准确。
关于交叉熵损失的直观理解和其他形式参见此博文:交叉熵损失的直观理解和其他形式。

如果输入标签是分类标志,使用交叉熵或更合适。

代码:

# y_true: 输入实例的真实标签
# y_pred:输入实例的预测标签
def logloss(y_true, y_pred, eps=1e-15):
    import numpy as np

    # Prepare numpy array data
    y_true = np.array(y_true)
    y_pred = np.array(y_pred)
    assert (len(y_true) and len(y_true) == len(y_pred))

    # Clip y_pred between eps and 1-eps
    p = np.clip(y_pred, eps, 1-eps)
    loss = np.sum(- y_true * np.log(p) - (1 - y_true) * np.log(1-p))

    return loss / len(y_true)

3、Focal Loss

Focal Loss 首先提出来是用在目标检测当中,目的是为了解决正负样本比例严重失衡的问题。该损失函数是在交叉熵损失的基础上进行修改的,这里以为前辈总结得相当明了,直接引用了:Focal Loss理解

4、相对熵、KL散度(Relative Entropy/Kullback-Leibler Divergence)

相对熵(relative entropy)又称为KL散度(Kullback–Leibler divergence,简称KLD),信息散度(information divergence),信息增益(information gain),是两个概率分布(probability distribution)间差异的非对称性度量,相对熵等价于两个概率分布的信息熵(Shannon entropy)的差值,差值越小,两者分部就越接近。 简单来说,相对熵用来衡量两个取值为正的函数或概率分布P和Q之间的差异,其计算公式如下:
设P(x)和Q(x)是随机变量X上的两个概率分布,则在离散和连续随机变量的情形下,相对熵的定义如下:
K L ( P ∣ ∣ Q ) = ∑ P ( x ) l o g P ( x ) Q ( x ) KL(P||Q)=\sum P(x)log \frac{P(x)}{Q(x)} KL(PQ)=P(x)logQ(x)P(x)
K L ( P ∣ ∣ Q ) = ∫ P ( x ) l o g P ( x ) Q ( x ) d x (4) KL(P||Q)=\int P(x)log \frac{P(x)}{Q(x)}dx\tag{4} KL(PQ)=P(x)logQ(x)P(x)dx(4)
具体怎么使用?下面给出一个计算实例:

假设n个样本的真实分类标签为: Y = { y 1 , y 2 , . . . , y n } Y= \{y_{1},y_{2},...,y_{n}\} Y={y1,y2,...,yn},而此时分类算法得到的预测分类为 P = { p i , p 2 , . . . , p n } P=\{p_{i},p_{2},...,p_{n}\} P={pi,p2,...,pn},那么此时的相对熵为:
K L ( A ∣ ∣ B ) = y 1 l o g   y 1 p 1 + y 2 l o g   y 2 p 2 + . . . + y n l o g   y n p n KL(A||B)=y_{1}log\ \frac{y_{1}}{p_{1}}+y_{2}log\ \frac{y_{2}}{p_{2}}+...+y_{n}log\ \frac{y_{n}}{p_{n}} KL(AB)=y1log p1y1+y2log p2y2+...+ynlog pnyn

代码:

def Relitive_Entroy(y_true,y_pred,eps=1e-15):
    return np.dot(y_true,np.transpose(y_true / (y_pred + eps)))

5、指数损失(Exponential Loss)

Adaboost算法就是使用指数损失作为其损失函数的,其形式如下:
L ( y , f ( x ) ) = e y f ( x ) (5) L(y,f(x))=e ^{yf(x)}\tag{5} L(y,f(x))=eyf(x)(5)
机器学习——损失函数_第2张图片
观察其图像可知,和squared loss一样,对异常点敏感。
代码很简单,就不写了。

6、Hinge Loss

Hinge Loss又称为合页损失,令y表示样本的真实标签,f(x)为输入样本的输出预测值,合页损失使得 y f ( x ) > 1 yf(x)>1 yf(x)>1的样本损失皆为0,由此带来了稀疏解
L ( y , f ( x ) ) = m a x ( 0 , 1 − y ( f ( x ) ) ) (6) L(y,f(x))= max(0,1-y(f(x)))\tag{6} L(y,f(x))=max(0,1y(f(x)))(6)
机器学习——损失函数_第3张图片
Hinge Loss 为SVM中使用的损失函数,下面就推导下这个损失函数:
带软间隔的svm最后的优化问题可表示为:
m i n w , b , ξ   1 2 ∥ w ∥ 2 + C ∑ i = 1 m ξ i (7) \underset{w,b,\xi }{min} \ \frac{1}{2}\left \| w \right \|^{2}+C\sum_{i=1}^{m}\xi_{i} \tag{7} w,b,ξmin 21w2+Ci=1mξi(7)
s . t .   y i ( w T x i + b ) ≥ 1 − ξ i (8) s.t.\ y_{i}(w^{T}x_{i} + b)\geq 1-\xi_{i}\tag{8} s.t. yi(wTxi+b)1ξi(8)
ξ i ≥ 0 , i = 1 , 2 , . . . , m (9) \xi_{i}\geq0,i = 1,2,...,m\tag{9} ξi0,i=1,2,...,m(9)
式(8)可写成如下形式:
ξ i ≥ 1 − y i ( w T x i + b ) (10) \xi_{i}\geq1-y_{i}(w^{T}x_{i}+b)\tag{10} ξi1yi(wTxi+b)(10)
1 − y i ( w T x i + b ) < 0 1-y_{i}(w^{T}x_{i}+b) <0 1yi(wTxi+b)<0时,由于约束(9)的存在,此时应为0;当 1 − y i ( w T x i + b ) ≥ 0 1-y_{i}(w^{T}x_{i}+b) \geq 0 1yi(wTxi+b)0时,则 ξ i ≥ 1 − y i ( w T x i + b ) \xi_{i}\geq1-y_{i}(w^{T}x_{i}+b) ξi1yi(wTxi+b),所以将(8)和(9)合起来表达,就会有如下形式:

ξ i ≥ m a x ( 0 , 1 − y i ( w T x i + b ) ) = m a x ( 0 , 1 − y i f ( x i ) ) (11) \xi_{i}\geq max(0,1-y_{i}(w^{T}x_{i}+b))=max(0,1-y_{i}f(x_{i}))\tag{11} ξimax(0,1yi(wTxi+b))=max(0,1yif(xi))(11)
由于此约束问题(7)是最小化问题,所以取 ξ i \xi_{i} ξi的极小值,即令 ξ i = m a x ( 0 , 1 − y i f ( x i ) ) \xi_{i}=max(0,1-y_{i}f(x_{i})) ξi=max(0,1yif(xi))带入式(7)中,令 λ = 1 2 C \lambda =\frac{1}{2C} λ=2C1:
m i n C ∑ i = 1 m m a x ( 0 , 1 − y i f ( x i ) ) + 1 2 ∣ ∣ w ∣ ∣ 2 ∝ m i n ∑ i = 1 m m a x ( 0 , 1 − y i f ( x i ) ) ⏟ h i n g e   l o s s + λ ∣ ∣ w ∣ ∣ 2 (12) minC\sum_{i=1}^{m}max(0,1-y_{i}f(x_{i}))+\frac{1}{2}||w||^{2}\propto min \sum_{i=1}^{m}\underbrace{max(0,1-y_{i}f(x_{i}))}_{hinge \ loss}+\lambda ||w||^{2}\tag{12} minCi=1mmax(0,1yif(xi))+21w2mini=1mhinge loss max(0,1yif(xi))+λw2(12)

可以看到 svm 这个形式的损失函数是自带参数 w 的L2 正则的,而相比之下Logistic Regression的损失函数则没有显式的正则化项,需要另外添加。
代码:

def Hinge_Loss(y_true,y_pred):
  return np.maximum(0,np.multiply(y_pred,y_true))

二、回归问题的损失函数

1、均值平方差(Mean Squared Error,MSE)

也称为“均方误差”,表达预测值与真实值之间的差异,在数理统计中,均方误差是指参数估计值与参数真实值之差的期望值,计算公式如下:
M S E = 1 m ∑ i = 1 m ( y i − f ( x i ) ) 2 (13) MSE =\frac{1}{m}\sum_{i=1}^{m}(y_{i}-f(x_{i}))^{2}\tag{13} MSE=m1i=1m(yif(xi))2(13)
均方误差的值越小,表明模型越好。
代码:

def MSE(y_true,y_pred):
  return np.sum(np.square(y_true-y_pred)) / len(y_pred)

2、均方根误差(Root Mean Square Error,RMSE)

RMSE将MSE开平方
R M S E = 1 m ∑ i = 1 m ( y i − f ( x i ) ) 2 (14) RMSE=\sqrt{\frac{1}{m}\sum_{i=1}^{m}(y_{i}-f(x_{i}))^{2}}\tag{14} RMSE=m1i=1m(yif(xi))2 (14)
代码:

def RMSE(y_true,y_pred):
  return np.sqrt(np.sum(np.square(y_true-y_pred)) / len(y_pred))

3、平均绝对值误差(Mean Absolute Deviation,MAD)

对一个真实值与预测值相减的绝对值取平均值:
M A D = 1 m ∑ i = 1 m ∣ y i − f ( x i ) ∣ (15) MAD= \frac{1}{m}\sum_{i=1}^{m}|y_{i}-f(x_{i})|\tag{15} MAD=m1i=1myif(xi)(15)
代码:

def MAD(y_true,y_pred):
  return np.sum(np.abs(y_true-y_pred))/len(y_pred)

总结:MAD损失对于异常值更鲁棒,但它的导数不连续使得寻找最优解的过程低效;MSE损失对于异常值敏感,但在优化过程中更为稳定和准确。

4、平滑平均绝对误差(Huber Loss/Smooth Mean/Absolute Error)

为了解决损失函数对噪声数据敏感的问题,平滑平均绝对误差更具鲁棒性。

Huber损失相比于平方损失来说对于异常值不敏感,但它同样保持了可微的特性。它基于绝对误差但在误差很小的时候变成了平方误差。我们可以使用超参数δ来调节这一误差的阈值。当δ趋向于0时它就退化成了MAE,而当δ趋向于无穷时则退化为了MSE,其表达式如下,是一个连续可微的分段函数:
L δ ( y , f ( x ) ) = { 1 2 ( y − f ( x ) ) 2 , ∣ y − f ( x ) ∣ ≤ δ δ ∣ y − f ( x ) ∣ − 1 2 δ 2 , o t e r w i s e (16) L_{\delta}(y,f(x))=\left\{\begin{matrix} \frac{1}{2}(y-f(x))^{2} ,&|y-f(x)|\leq\delta \\ \delta |y-f(x)|-\frac{1}{2}\delta^{2} ,&oterwise \end{matrix}\right.\tag{16} Lδ(y,f(x))={21(yf(x))2,δyf(x)21δ2,yf(x)δoterwise(16)
当预测偏差小于 δ 时,它采用平方误差,
当预测偏差大于 δ 时,采用的线性误差。
相比于最小二乘的线性回归,HuberLoss降低了对离群点的惩罚程度,所以 HuberLoss 是一种常用的鲁棒的回归损失函数。
机器学习——损失函数_第4张图片代码:

def huber_loss(res, delta):
    return (abs(res)delta)*delta(abs(res)-delta/2)

def total_huber_loss(theta, x=x, y=y, e=e, delta=3):
    return huber_loss((y-(theta[0]+theta[1]*x))/e, delta).sum()

5、Log-Cosh损失函数

Log-Cosh损失函数是一种比均值平方差更为平滑的损失函数,利用双曲余弦来计算预测误差:
L ( y , f ( x ) ) = ∑ i = 1 m l o g ( c o s h ( f ( x i ) − y i ) ) (17) L(y,f(x))=\sum_{i=1}^{m}log(cosh(f(x_{i})-y_{i}))\tag{17} L(y,f(x))=i=1mlog(cosh(f(xi)yi))(17)
机器学习——损失函数_第5张图片
优点:对于较小的X值,log(cosh(x))约等于(x ** 2) / 2;对于较大的X值,则约等于abs(x) - log(2)。这意味着Log-cosh很大程度上工作原理和平均方误差很像,但偶尔出现错的离谱的预测时对它影响又不是很大。它具备了Huber损失函数的所有优点,但不像Huber损失,它在所有地方都二次可微。
缺点:如果始终出现非常大的偏离目标的预测值时,它就会遭受梯度问题。
代码:

def logcosh(true, pred):
    loss = np.log(np.cosh(pred - true))return np.sum(loss)

6、分位数损失(Quantile Loss)

通常情况下我们利用最小二乘回归来预测取值区间主要基于这样的假设:取值残差的方差是常数,但很多时候对于线性模型是不满足的。不懂?那就用下面的两个图来说明:
机器学习——损失函数_第6张图片上面的左图就是我们的假设情况,即线性具有恒定的方差(常数);而右图则是现实数据的分布情况,大体上呈线性关系,但是方差逐渐增大。
那么怎么解决方差不是常数的情况呢?
这时候分位数损失就派上用场了,它会预测出一个取值空间,而不是一个个具体的点。使用0.5和0.95分位数损失对右图进行预测:
机器学习——损失函数_第7张图片正如前面所述,它会预测出一个取值区间,从图中可以清晰地看到建模后预测值得取值范围。

分位数回归的目标在于估计给定预测值的条件分位数。实际上分位数回归就是平均绝对误差的一种拓展。分位数值得选择在于我们是否希望让正的或者负的误差发挥更大的价值。损失函数会基于分位数γ对过拟合和欠拟合的施加不同的惩罚。例如选取γ为0.25时意味着将要惩罚更多的过拟合而尽量保持稍小于中值的预测值。

L γ ( y , f ( x ) ) = ∑ i = y i < f ( x i ) ( γ − 1 ) ⋅ ∣ y i − f ( x i ) ∣ + ∑ i = y i ≥ f ( x i ) γ ∣ y i − f ( x i ) ∣ (18) L_{ \gamma }(y,f(x))=\sum_{i=y_{i}Lγ(y,f(x))=i=yi<f(xi)(γ1)yif(xi)+i=yif(xi)γyif(xi)(18)
γ的取值通常在0-1之间
可能没说明白分位数损失,这里有个例子,看完了就知道咋回事了。

你可能感兴趣的:(机器学习算法,机器学习,损失函数)