损失函数
一、损失函数和代价函数、目标函数的区别和练习
在机器学习中,经常会碰到 Loss Function、Cost Function 和 Objective Function,这三个术语,我们要了解他们之间的区别和联系。
(1)损失函数(Loss Function)通常是针对单个训练样本而言,给定一个模型输出 y' (预测值)和一个真实的y,损失函数输出一个实值
(2)代价函数(Cost Function)通常是针对整个训练集的总损失
(3)目标函数(Objective Function)表示任意希望被优化的函数,用于机器学习领域和非机器学习领域
一句话总结三者的关系就是:A loss function is a part of a cost function which is a type of an objective function。
二、损失函数的类别
通常机器学习每一个算法中都会有一个目标函数,算法的求解过程是通过对这个目标函数优化的过程。在分类或者回归问题中,通常使用损失函数(代价函数)作为其目标函数。损失函数用来评价模型的预测值和真实值不一样的程度,损失函数越好,通常模型的性能越好。不同的算法使用的损失函数不一样。
损失函数分为经验风险损失函数和结构风险损失函数。经验风险损失函数指预测结果和实际结果的差别,结构风险损失函数是指经验风险损失函数加上正则项。通常表示为如下:
其中,前面的均值项表示经验风险函数,L表示损失函数,后面的是正则化项(regularizer)或惩罚项(penalty term),它可以是L1、L2或者其他正则函数。整个式子表示要找到使得目标函数最小的值
(1)均方差(Mean Squared Error (MSE)损失(Mean Squared Error Loss)
是机器学习、深度学习回归任务中最常用的一种损失函数,也称为 L2 Loss。其基本形式如下
从直觉上理解均方差损失,这个损失函数的最小值为 0(当预测等于真实值时),最大值为无穷大。下图是对于真实值 y=0 ,不同的预测值 [-1.5,1.5] 的均方差损失的变化图。横轴是不同的预测值,纵轴是均方差损失,可以看到随着预测与真实值绝对误差 的增加,均方差损失呈二次方地增加。
实际上在一定的假设下,我们可以使用最大化似然得到均方差损失的形式。假设模型预测与真实值之间的误差服从标准正态分布(高斯分布)( μ=0,σ=1 ),则给定一个 xi , 模型输出真实值yi 的概率为
进一步我们假设数据集中 N 个样本点之间相互独立(因此概率相乘,最大似然法就log+),则给定所有 输出所有真实值 的概率,即似然 Likelihood,为所有的累乘,
通常为了计算方便,我们通常最大化对数似然 Log-Likelihood,
去掉与无关的第一项,然后转化为最小化负对数似然 Negative Log-Likelihood
可以看到这个实际上就是均方差损失的形式。也就是说在模型输出与真实值的误差服从(正态分布)高斯分布的假设下,最小化均方差损失函数与极大似然估计本质上是一致的,因此在这个假设能被满足的场景中(比如回归),均方差损失是一个很好的损失函数选择;当这个假设没能被满足的场景中(比如分类),均方差损失不是一个好的选择
(2)平均绝对误差(Mean Absolute Error Loss)
基本形式和原理:
平均绝对误差 Mean Absolute Error (MAE) 是另一类常用的损失函数,也称为 L1 Loss。其基本形式如下
同样的我们可以对这个损失函数进行可视化如下图,MAE 损失的最小值为 0(当预测等于真实值时),最大值为无穷大。可以看到随着预测与真实值绝对误差
的增加,MAE 损失呈线性增长
同样的我们可以在一定的假设下通过最大化似然得到 MAE 损失的形式,假设模型预测与真实值之间的误差服从拉普拉斯分布 Laplace distribution( μ=0,b=1 ),则给定一个 xi 模型输出真实值 yi 的概率为
与上面推导 MSE 时类似,我们可以得到的负对数似然实际上就是 MAE 损失的形式
MAE 与 MSE 区别
MAE 和 MSE 作为损失函数的主要区别是:MSE 损失相比 MAE 通常可以更快地收敛,但 MAE 损失对于 outlier 更加健壮,即更加不易受到 outlier(异常值的意思) 影响
MSE 通常比 MAE 可以更快地收敛。当使用梯度下降算法时,MSE 损失的梯度为 ,而 MAE 损失的梯度为 +-1 (梯度是斜率的意思) ,即 MSE 的梯度的 scale 会随误差大小变化,而 MAE 的梯度的 scale 则一直保持为 1,即便在绝对误差
很小的时候 MAE 的梯度 scale 也同样为 1,这实际上是非常不利于模型的训练的。当然你可以通过在训练过程中动态调整学习率缓解这个问题,但是总的来说,损失函数梯度之间的差异导致了 MSE 在大部分时候比 MAE 收敛地更快。这个也是 MSE 更为流行的原因
(3)Huber Loss
上文我们分别介绍了 MSE 和 MAE 损失以及各自的优缺点,MSE 损失收敛快但容易受 outlier 影响,MAE 对 outlier 更加健壮但是收敛慢,Huber Loss 则是一种将 MSE 与 MAE 结合起来,取两者优点的损失函数,也被称作 Smooth Mean Absolute Error Loss 。其原理很简单,就是在误差接近 0 时使用 MSE,误差较大时使用 MAE,公式为
上式中 δ 是 Huber Loss 的一个超参数, δ 的值是 MSE 和 MAE 两个损失连接的位置。上式等号右边第一项是 MSE 的部分,第二项是 MAE 部分,在 MAE 的部分公式为
是为了保证误差
时 MAE 和 MSE 的取值一致,进而保证 Huber Loss 损失连续可导
Huber Loss 的特点
Huber Loss 结合了 MSE 和 MAE 损失,在误差接近 0 时使用 MSE,使损失函数可导并且梯度更加稳定;在误差较大时使用 MAE 可以降低 outlier 的影响,使训练对 outlier 更加健壮。缺点是需要额外地设置一个 δ 超参数
(4)分位数损失(Quantile Loss)
分位数回归 Quantile Regression 是一类在实际应用中非常有用的回归算法,通常的回归算法是拟合目标值的期望或者中位数,而分位数回归可以通过给定不同的分位点,拟合目标值的不同分位数。例如我们可以分别拟合出多个分位点,得到一个置信区间,如下图所示(图片来自笔者的一个分位数回归代码 demo Quantile Regression Demo)
分位数回归是通过使用分位数损失 Quantile Loss 来实现这一点的,分位数损失形式如下,式中的 r 分位数系数
我们如何理解这个损失函数呢?这个损失函数是一个分段的函数 ,将 (高估) 和
(低估) 两种情况分开来,并分别给予不同的系数。当 r>0.5 时,低估的损失要比高估的损失更大,反过来当 r<0.5 时,高估的损失比低估的损失大;分位数损失实现了分别用不同的系数控制高估和低估的损失,进而实现分位数回归。特别地,当 r=0.5 时,分位数损失退化为 MAE 损失,从这里可以看出 MAE 损失实际上是分位数损失的一个特例 — 中位数回归(这也可以解释为什么 MAE 损失对 outlier 更鲁棒:MSE 回归期望值,MAE 回归中位数,通常 outlier 对中位数的影响比对期望值的影响小)。
下图是取不同的分位点 0.2、0.5、0.6 得到的三个不同的分位损失函数的可视化,可以看到 0.2 和 0.6 在高估和低估两种情况下损失是不同的,而 0.5 实际上就是 MAE
上文介绍的几种损失函数都是适用于回归问题损失函数,对于分类问题,最常用的损失函数是交叉熵损失函数 Cross Entropy Loss
(1)交叉熵损失 Cross Entropy Loss
二分类
考虑二分类,在二分类中我们通常使用 Sigmoid 函数将模型的输出压缩到 (0, 1) 区间内 ,用来代表给定输入 ,模型判断为正类的概率。由于只有正负两类,因此同时也得到了负类的概率
将两条式子合并成一条
假设数据点之间独立同分布,则似然可以表示为
对似然取对数,然后加负号变成最小化负对数似然,即为交叉熵损失函数的形式
下图是对二分类的交叉熵损失函数的可视化,蓝线是目标值为 0 时输出不同输出的损失,黄线是目标值为 1 时的损失。可以看到约接近目标值损失越小,随着误差变差,损失呈指数增长
多分类
在多分类的任务中,交叉熵损失函数的推导思路和二分类是一样的,变化的地方是真实值 现在是一个 One-hot 向量,同时模型输出的压缩由原来的 Sigmoid 函数换成 Softmax 函数。Softmax 函数将每个维度的输出范围都限定在(0,1) 之间,同时所有维度的输出和为 1,用于表示一个概率分布
其中 表示 K 个类别中的一类,同样的假设数据点之间独立同分布,可得到负对数似然为
由于 是一个 one-hot 向量,除了目标类为 1 之外其他类别上的输出都为 0,因此上式也可以写为
其中 是样本
的目标类。通常这个应用于多分类的交叉熵损失函数也被称为 Softmax Loss 或者 Categorical Cross Entropy Loss
分类中为什么不用均方差损失?上文在介绍均方差损失的时候讲到实际上均方差损失假设了误差服从高斯分布,在分类任务下这个假设没办法被满足,因此效果会很差。为什么是交叉熵损失呢?有两个角度可以解释这个事情,一个角度从最大似然的角度,也就是我们上面的推导;另一个角度是可以用信息论来解释交叉熵损失:
(2)合页损失 Hinge Loss
合页损失 Hinge Loss 是另外一种二分类损失函数,适用于 maximum-margin (最大间隔) 的分类,支持向量机 Support Vector Machine (SVM) 模型的损失函数本质上就是 Hinge Loss + L2 正则化。合页损失的公式如下
下图是 y 为正类, 即 时,不同输出的合页损失示意图
sng(如果数字大于0,则Sgn 返回1,数字等于0,则返回0,数字小于0,则返回-1,数字参数的符号决定了Sgn 函数的返回值)
可以看到当 y 为正类时,模型输出负值会有较大的惩罚,当模型输出为正值且在 (0,1) 区间时还会有一个较小的惩罚。即合页损失不仅惩罚预测错的,并且对于预测对了但是置信度不高的也会给一个惩罚,只有置信度高的才会有零损失。使用合页损失直觉上理解是要找到一个决策边界,使得所有数据点被这个边界正确地、高置信地被分类