简介
损失函数(loss function)或代价函数(cost function)是将随机事件或其有关随机变量的取值映射为非负实数以表示该随机事件的“风险”或“损失”的函数。在应用中,损失函数通常作为学习准则与优化问题相联系,即通过最小化损失函数求解和评估模型。例如在统计学和机器学习中被用于模型的参数估计(parameteric estimation) [1] ,在宏观经济学中被用于风险管理(risk mangement)和决策 [2] ,在控制理论中被应用于最优控制理论(optimal control theory) [3] 。(来自百度百科)
机器通过损失函数进行学习,这是一种评估特定算法对给定数据建模程度的方法。如果预测值与实际结果偏离较远,损失函数会得到一个非常大的值。在一些优化函数的辅助下,损失函数逐渐学会减少预测值的误差。
机器学习的三要素就是:表示,评估和优化。正如我们在《非参数模型》中提到的:
机器学习分为表示、评估和优化。表示指的是将样本空间映射到一个合适的特征空间,一般地,我们更青睐于这样的表示是低维度的,是更加稀疏交互的,同时也希望是相互独立的。而评估指的是模型在数据上表现的量化形式,我们选取合适的函数来表示什么样子的模型是好的,性能度量就是评估。在前两步都完成了以后,最后要做的就是优化,就是对评估函数进行求解,找出最合适的解,来确定最终的模型。
所谓的性能度量(performance measure)就是关于真实值和预测值的关系,真实值与预测值越接近,或者说真实的分布与预测分布越接近,性能越好。
(1)对于回归问题,我们可以选用均方误差(mean squared error),绝对误差(absolute Loss),决定系数(coefficient of determination )以及Huber Loss来度量模型的性能;
(2)对于分类问题,我们可以用准确率,错误率,或者得到混淆矩阵,进一步得到查准率(precision)、查全率(recall)以及P-R曲线和ROC曲线。
损失函数(Loss function)也是这样,真实值与预测值差别越大,Loss越大,我们的优化的目标就是减小Loss。从评估的角度来说,损失函数和性能度量所起到的作用是相同的,那么我们为什么既要有损失函数,也有要性能评估呢?事实上,常见的均方误差:
既可以被当作性能度量,同时也是回归问题的损失函数。注意:在更多的问题中,我们往往会为了减小模型的错误率,并不直接优化错误率,而是会优化另一个函数,比如在logistic回归中,我们会优化对数似然,在SVM中,我们会优化hinge loss,在adaboost中会优化指数损失。
没有一个适合所有机器学习算法的损失函数。针对特定问题选择损失函数涉及到许多因素,比如所选机器学习算法的类型、是否易于计算导数以及数据集中异常值所占比例。
从学习任务的类型出发,可以从广义上将损失函数分为两大类——回归损失和分类损失。(1)在分类任务中,我们要从类别值有限的数据集中预测输出,比如给定一个手写数字图像的大数据集,将其分为 0~9 中的一个。(2)在回归任务中,处理的则是连续值的预测问题,例如给定房屋面积、房间数量以及房间大小,预测房屋价格。
NOTE n - Number of training examples. i - ith training example in a data set. y(i) - Ground truth label for ith training example. y_hat(i) - Prediction for ith training example.
回归损失函数
均方误差/平方损失/L2 损失:
参数设置说明见本文的NOTE。顾名思义,均方误差(mean-square error,MSE)度量的是预测值和实际观测值间差的平方的均值。它只考虑误差的平均大小,不考虑其方向。但由于经过平方,与真实值偏离较多的预测值会比偏离较少的预测值受到更为严重的惩罚。再加上 MSE 的数学特性很好,这使得计算梯度变得更容易。
平均绝对误差/L1 损失:
参数设置说明见本文的NOTE。平均绝对误差(Mean Absolute Error,MAE)度量的是预测值和实际观测值之间绝对差之和的平均值。和 MSE 一样,这种度量方法也是在不考虑方向的情况下衡量误差大小。但和 MSE 的不同之处在于,MAE 需要像线性规划这样更复杂的工具来计算梯度。此外,MAE 对异常值更加稳健,因为它不使用平方。
平均偏差误差:
参数设置说明见本文的NOTE。与其它损失函数相比,平均偏差误差(mean bias error,MBE)在机器学习领域没有那么常见。它与 MAE 相似,唯一的区别是这个函数没有用绝对值。用这个函数需要注意的一点是,正负误差可以互相抵消。尽管在实际应用中没那么准确,但它可以确定模型存在正偏差还是负偏差。
分类损失函数
Hinge Loss/多分类 SVM 损失:
参数设置说明见本文的NOTE,简言之,在一定的安全间隔内(通常是 1),正确类别的分数应高于所有错误类别的分数之和。因此 hinge loss 常用于最大间隔分类(maximum-margin classification),最常用的是支持向量机。尽管不可微,但它是一个凸函数,因此可以轻而易举地使用机器学习领域中常用的凸优化器。 假设我们有三个训练样本,要预测三个类别(狗、猫和马),计算这 3 个训练样本的 hinge loss:
## 1st training example
max(0, (1.49) - (-0.39) + 1) + max(0, (4.21) - (-0.39) + 1)
max(0, 2.88) + max(0, 5.6)
2.88 + 5.6
8.48 (High loss as very wrong prediction)
## 2nd training example
max(0, (-4.61) - (3.28)+ 1) + max(0, (1.46) - (3.28)+ 1)
max(0, -6.89) + max(0, -0.82)
0 + 0
0 (Zero loss as correct prediction)
## 3rd training example
max(0, (1.03) - (-2.27)+ 1) + max(0, (-2.37) - (-2.27)+ 1)
max(0, 4.3) + max(0, 0.9)
4.3 + 0.9
5.2 (High loss as very wrong prediction)
交叉熵损失/负对数似然:
这是分类问题中最常见的设置(上面的式子是二分类,参数设置说明见本文的NOTE),随着预测概率偏离实际标签,交叉熵损失会逐渐增加。注意,当实际标签为 1(y(i)=1) 时,函数的后半部分消失,而当实际标签是为 0(y(i=0)) 时,函数的前半部分消失。简言之,我们只是把对真实值类别的实际预测概率的对数相乘。还有重要的一点是,交叉熵损失会重重惩罚那些置信度高但是错误的预测值。
对于多分类来说来说,是在二分类上面的扩展:
其中:
-
- ——指示变量(0或1),如果该类别和样本的类别相同就是1,否则是0;
- ——对于观测样本属于类别 的预测概率。
交叉熵损失函数经常用于分类问题中,特别是在神经网络做分类问题时,也经常使用交叉熵作为损失函数,此外,由于交叉熵涉及到计算每个类别的概率,所以交叉熵几乎每次都和sigmoid(或softmax)函数一起出现。
我们用神经网络最后一层输出的情况,来看一眼整个模型预测、获得损失和学习的流程:
- 神经网络最后一层得到每个类别的得分scores;
- 该得分经过sigmoid(或softmax)函数获得概率输出;
- 模型预测的类别概率输出与真实类别的one hot形式进行交叉熵损失函数的计算。
与目标函数的区别
损失函数和代价函数是同一个东西,目标函数是一个与他们相关但更广的概念,对于目标函数来说在有约束条件下的最小化就是损失函数(loss function)。
那是不是我们的目标就只是让loss function越小越好呢?还不是。这个时候还有一个概念叫风险函数(risk function)。风险函数是损失函数的期望,这是由于我们输入输出的
遵循一个联合分布,但是这个联合分布是未知的,所以无法计算。但是我们是有历史数据的,就是我们的训练集, 关于训练集的平均损失称作经验风险(empirical risk),即,所以我们的目标就是最小化,称为经验风险最小化。然而,经验风险函数最小也不是最好的,因为有时候会过度学习历史数据,导致它在真正预测时效果会很不好,这种情况称为过拟合(over-fitting)。
为什么会造成这种结果?大白话说就是它的函数太复杂了,这就引出了下面的概念,我们不仅要让经验风险最小化,还要让结构风险最小化。定义了一个函数
,这个函数专门用来度量模型的复杂度,在机器学习中也叫正则化(regularization)。常用的有 范数。因此,我们最终的优化函数为
,即最优化经验风险和结构风险,而这个函数就被称为目标函数。(基于Coursera上Andrew Ng的公开课和李航的《统计学习方法》)参考:
来源:CSDN
作者:lijfrank
链接:https://blog.csdn.net/Frank_LJiang/article/details/104266255