损失函数
引自:https://blog.csdn.net/github_38140310/article/details/85061849
文章分析讨论了机器学习中分类与回归问题应用的几个经典、简单的损失函数。
在机器学习中,所有的机器学习算法都或多或少的依赖于对目标函数最大化或者最小化的过程,我们常常把最小化的函数称为损失函数,它主要用于衡量机器学习模型的预测能力。回归会预测给出一个数值结果而分类则会给出一个标签。最小二乘法是损失函数的一种优化方法。但是有些损失函数采用传统数学方法是很难求解最小值的,而机器学习中的反向传播算法为求解极值点提供了一种简单有效的途径,从而我们只需要把重点放在损失函数的自身特性上,而不用花过多心思在函数求解的方法上。
在机器学习的任务中,损失函数的选取十分重要。针对不同问题,应该选取最合适的损失函数。充分理解不同类型损失函数的特性有助于我们求解实际应用问题,在任务中得到更好的优化结果。这也有助于我们理解机器学习的本质,以及它本后的数学支撑,为进一步的研究做好准备。
机器学习分为四大块,分别是 classification (分类), regression (回归), clustering (聚类), dimensionality reduction (降维)。
如下图所示。给定一个样本特征 , 我们希望预测其对应的属性值 , 如果属性值是离散的, 那么这就是一个分类问题,反之,如果是连续的实数, 这就是一个回归问题。如果给定一组样本特征 , 我们没有对应的属性值 , 而是想发掘这组样本在 维空间的分布, 比如分析哪些样本靠的更近,哪些样本之间离得很远, 这就是属于聚类问题。如果我们想用维数更低的子空间来表示原来高维的特征空间, 那么这就是降维问题[8]。
图 1 机器学习图谱
图 2 机器学习四大板块示意图
这里着重分析分类和回归问题。无论是分类还是回归,都是想建立一个预测模型 ,给定一个输入 , 可以得到一个输出 。不同的只是在分类问题中, 输出是离散的; 而在回归问题中输出是连续的。所以总的来说,两种问题的学习算法都很类似。所以在这个图谱上,我们看到在分类问题中用到的学习算法,在回归问题中也能使用。分类问题最常用的学习算法包括 SVM (支持向量机) , SGD (随机梯度下降算法), Bayes (贝叶斯估计), Ensemble, KNN 等。而回归问题也能使用 SVR, SGD, Ensemble 等算法,以及其它线性回归算法。
机器学习的三要素就是:表示,评估和优化。
表示指的是将样本空间映射到一个合适的特征空间,评估指的是模型在数据上表现的量化形式,我们选取合适的函数来表示什么样子的模型是好的,性能度量就是评估。在前两步都完成了以后,最后要做的就是优化,就是对评估函数进行求解,找出最合适的解,来确定最终的模型。
所谓的性能度量(performance measure)就是关于真实值和预测值的关系,真实值与预测值越接近,或者说真实的分布与预测分布越接近,性能越好。对于回归问题,我们可以选用均方误差(mean squared error),绝对误差(absolute Loss),决定系数(coefficient of determination )以及Huber Loss来度量模型的性能,对于分类问题,我们可以用准确率,错误率,或者得到混淆矩阵,进一步得到查准率(precision)、查全率(recall)以及P-R曲线和ROC曲线。
我们可以很容易想到,损失函数(Loss function)也是这样一回事情,真实值与预测值差别越大,Loss越大,我们的优化的目标就是减小Loss。从评估的角度来说,损失函数和性能度量所起到的作用是相同的,那么我们为什么既要有损失函数,也有要性能评估呢?常见的误差如下面要介绍的均方误差,既可以被当作性能度量,同时也是回归问题的损失函数。但在更多的问题中,我们会发现,我们往往会为了减小模型的错误率,并不直接优化错误率,而是会优化另一个函数。比如分类问题,我们采用logistic回归后,我们会优化对数似然。
这里所讨论的问题,都不涉及正则化。损失函数和代价函数基本相同,有时候会分别针对单个样本或整体样本集。
1.回归问题[1]
回归问题中有众多损失函数,而目前机器学习主流的损失函数还是均方误差函数,平均绝对误差也使用较多,在此基础上发展出了很多其他函数,Huber损失函数就是其中一种。
1.1平均绝对误差——L1损失函数
平均绝对误差(MAE)是另一种常用的回归损失函数,它是目标值与预测值之差绝对值的和,表示了预测值的平均误差幅度,而不需要考虑误差的方向,范围是0到∞,其公式如下所示:
其中代表真实值,代表预测结果,两者都是向量。因为绝对误差相当于对误差求L1范数,所以也称为L1损失函数(L1 loss)。对最简单的一维情况,平均绝对误差函数曲线如下:
图 3 MAE损失(Y轴)与预测误差(X轴)的关系图
很明显,L1误差函数在0处不可导,并且损失函数值随着误差呈线性增长。
1.2均方误差——L2损失函数
均方误差(MSE)是回归损失函数中最常用的误差,它是预测值与目标值之间差值的平方和,其公式如下所示:
公式与L1损失函数区别在于多了一步平方计算,等价于对误差求L2范数,所以也叫L2损失函数(L2 loss)。
下图是均方误差值的曲线分布,其中最小值为预测值为目标值的位置。我们可以看到随着误差的增加损失函数增加的更为迅猛,可见均方误差值对异常值较为敏感。
图 4 MSE损失(Y轴)与预测误差(X轴)的关系图
可以发现,这里的损失函数正是最小二乘法所解决的问题。希尔伯特空间中线性逼近问题的求解方法称为最小二乘法[4],最小二乘法优化对象的基本形式可以看成n倍的均方误差。所以这里可以采用最小二乘法求解均方误差的最小值,以及对应的最优参数值。最小二乘法有不同的形式,课本[4]中给出了三种形式,包括求导法、配方法和投影法。而机器学习采用了梯度反传与迭代等方法,后文会具体介绍。
另外加权最小二乘法也可以找到对应的公式。若每一项平方误差有一定权重,我们能得到加权的均方误差,如下公式:
与加权最小二乘法优化对象只相差n倍。这样通过调整的大小,可以调整每个样本的权重。
最小二乘法将问题转化成了一个凸优化问题。在线性回归中,根据中心极限定理[5],我们假设样本和噪声都服从高斯分布,可以通过极大似然估计(MLE)推导出均方误差。注意其中的推导过程涉及取对数(log函数),因为凸函数的嵌套依然是凸函数,在取对数之后,极大值点依然是极大值,这一步可以简化高斯函数的求导计算复杂度。最小二乘的基本原则是:最优拟合直线应该是使各点到回归直线的距离和最小的直线,即平方和最小。换言之,OLS是基于距离的,而这个距离就是我们用的最多的欧几里得距离。我们常采用均方误差也是因为它简单、计算方便,并且欧氏距离是一种很好的相似性度量标准,在不同的表示域变换后特征性质保持不变。
1.3 Huber损失——平滑平均绝对误差
Huber损失相比于平方损失来说对于异常值不敏感,但它同样保持了可微的特性。它基于绝对误差,但在误差很小的时候变成了平方误差。我们可以使用超参数δ来调节这一误差的阈值。当δ趋向于0时它就退化成了MAE,而当δ趋向于无穷时则退化为了MSE,其表达式如下,是一个连续可微的分段函数:
下图是该误差函数的曲线分布。
图 5 Huber损失(Y轴)与预测误差(X轴)的关系图
对于Huber损失来说,δ的选择十分重要,它决定了模型处理异常值的行为。当残差大于δ时使用L1损失,很小时则使用更为合适的L2损失来进行优化。
Huber损失函数克服了MAE和MSE的缺点,不仅可以保持损失函数具有连续的导数,同时可以利用MSE梯度随误差减小的特性来得到更精确的最小值,也对异常值具有更好的鲁棒性。
而Huber损失函数的良好表现得益于精心训练的超参数δ。
2.分类问题
分类问题相对回归问题更为具体,目标量只存在于一个有限集合,并且是离散的。分类问题往往比回归问题多出了一步,用于判断类别。回归问题的损失函数就是性能度量函数,而分类问题的损失函数不能直接用于性能度量,其最终评估的标准不是离目标的距离,而是类别判断的准确率。为了最大地提升类别判断准确率,我们需要为分类问题定义不同的损失函数。
2.1 0-1损失函数
以二分类问题为例,错误率=1-正确率,也就是0-1损失函数,可以定义为
当判断错误时,损失函数加一;判断正确时,损失函数值不改变。这样的函数并不是连续的,因为参数的变化会反映到错误率上,而错误率的变化不可能是连续的,当我们预测对的样本每增加一个,错误率就会跃变1/n,如果我们采用梯度下降或者牛顿法去优化,就会利用到它的一阶导数甚至二阶导数,会发现导数根本不存在,并且0-1损失也是非凸函数。
所以损失函数一定要是连续的,这是寻找损失函数的第一个条件。此外,根本性的问题在于,我们想优化的根本不是经验风险,所谓的经验风险,如同上式,是定义在训练集上的样本上损失;我们真正想优化的是期望风险,定义在全部样本(包含测试集)的损失,用期望来表示:
拆成积分形式就是:
联合分布P(x,y)可以被拆为先验概率和条件概率。但是当我们可以假设模型的概率分布时,比如线性回归假设了高斯分布,logistic回归假设了伯努利分布,我们就可以利用极大似然估计来逼近期望风险,这也叫做一致性,是我们寻找损失的函数第二个条件。
如果是连续的凸函数,在0处可导,且导数小于零,就具备与0-1损失函数的一致性,我们把这些损失函数叫做替代损失(Surrogate loss),值得注意的是,这是我们选用凸函数的最重要的原因,虽然凸函数具备局部最小值就是全局最小值的性质,但主要是为了计算上的便利,而非本质意义上的。
图 6 0-1损失(Y轴)与预测误差(X轴)的关系图(黄色曲线)
2.2 交叉熵损失函数(Logistic回归)[6]
从0-1损失函数得出,为了便于优化,我们需要连续的损失函数,因而可以用期望风险代替经验风险,并且上文已经说明对期望风险的优化就是对经验风险的优化。
Logistic回归主要用于二分类问题,包含激活函数和损失函数两部分。激活函数是logistic函数(又叫sigmoid函数),损失函数是交叉熵函数。
logistic函数作用在分类算法的最后,它使得对任意的输入值,对应的输出都在区间(0,1)内,可以将输入从实数域映射到(0,1)区间,刚好满足概率的范围。函数公式为:,曲线如下所示:
因为曲线形状像“S”型,所以又叫 sigmoid曲线(S型曲线)。
结合交叉熵函数,通过推导可以得到logistic的损失函数表达式:
最后得到的目标子式如下:
从概率角度来看,logistic回归假设样本服从伯努利分布(0-1分布),然后求得满足该分布的似然函数P(y|x),接着取对数logP(y|x)并求极大值。这里并没有求似然函数的极大值,而是把极大化当做是一种思想,进而最小化负的对数似然函数(即max P(y|x) —> min -logP(y|x)))。取对数是为了方便计算极大似然估计,因为在MLE(最大似然估计)中,直接求导比较困难,所以通常都是先取对数再求导找极值点。损失函数L(Y, P(Y|X))表达的是样本X在分类Y的情况下,使概率P(Y|X)达到最大值(换言之,就是利用已知的样本分布,找到最有可能(即最大概率)导致这种分布的参数值;或者说什么样的参数才能使我们观测到目前这组数据的概率最大)。因为log函数是单调递增的,所以logP(Y|X)也会达到最大值,因此在前面加上负号之后,最大化P(Y|X)就等价于最小化L了。
在使用梯度下降来求逻辑回归的最优解的时候,它的迭代公式与平方损失采用最小二乘法求导后的式子非常相似,形式相似但实际上是两种不同的方法。总的来说,逻辑回归假设数据服从伯努利分布,通过极大化似然函数的方法,运用梯度下降来求解参数,来达到将数据二分类的目的。
2.3 交叉熵损失函数(Softmax激活)
交叉熵用到了log函数的特性,它不改变凸函数的凹凸性,同时能简化计算,是常用的技巧。这里主要讲多分类问题,激活函数是softmax,作用在神经网络的最后一层,损失函数是对数似然函数,也可以看成是交叉熵损失函数。
softmax激活函数表达式为:,当类别数C=2时,softmax函数就等于sigmoid函数,可见两者只是分量个数的差异。激活后的是长度为C的向量,每个分量都在(0,1)区间内,并且和为1,而最大分量所对应的类别就是我们所预测的结果。
由于类别较多,交叉损失函数的分量太多,所以这里的log损失函数一般只作用在目标类别。即,只有目标类别的分量系数为1,其余都为0。同样,在二分类问题上,这里的损失函数与逻辑回归损失函数也是一样的。两种方法分别是为二分类问题和多分类问题设计的。
3.回归问题与分类问题的相似性与差异性
•回归模型本身就可以用距离或者其他连续函数来评估它的性能,而分类模型的类别是有限的,准确率(经验风险)是一系列离散值,无法求导和优化,所以衍生出了期望风险,用期望风险来代替经验风险,从而将分类问题的损失函数变成连续的、可优化的。
•其实,两种问题在损失函数上,也可以是类似的,优化目标都是让损失函数最小。他们的区别主要是在,回归问题的损失函数极小值可以直接判断回归算法的性能;而分类问题的损失函数不等于准确率,在优化过程中,准确率是呈阶跃变化的,损失函数越小,并不代表准确率越小,只是能同时达到提高准确率的趋势。从某种角度来说,分类问题也可以看成回归问题。
•在应用方面,没有任何一种损失函数适用于所有的模型。通过前文的描述,我们可以发现,尽管我们面临的问题种类繁多,但归根结底都属于机器学习的几个基本模型之一,我们优化的直接对象也就是损失函数。
•在分类问题中用到的优化算法,在回归问题中也能使用。分类问题最常用的优化算法包括 SVM (支持向量机) , SGD (随机梯度下降算法), Bayes (贝叶斯估计), Ensemble, KNN 等。而回归问题也能使用 SVR, SGD, Ensemble 等算法,以及其它线性回归算法。
准确率(Accuracy) 精确率(Precision) 召回率(Recall)和F1-Measure
引自https://blog.csdn.net/github_36869152/article/details/79791332
先验知识
我们首先将数据的类别统一分为两类:正类和负类。例如:一个数据集中的数据一共有3类,小学生、中学生、高中生。我们的目标是预测小学生,那么标记为小学生的数据就是正类,标记为其他类型的数据都是负类。
数据有两种状态:测试集数据和预测结果数据。
对一批测试数据进行预测,结果可以分成四种。
TP(True Positive): 原本是正类,预测结果为正类。(正确预测为正类)
FP(False Positive): 原本是负类,预测结果为正类。(错误预测为正类)
TN(True Negative): 原本是负类,预测结果为负类。(正确预测为负类)
FN(False Negative): 原本是正类,预测结果为负类。(错误预测为负类)
准确率(Accuracy)
对于给定的测试数据集,分类器正确分类的样本数与样本总数之比,就称为准确率,即(TP+TN)/(TP+TN+FP+FN)
精确率(Precision)
在预测结果为正类的数据中,有多少数据被正确预测(原本就是正类),即TP/(TP+FP)。
对应于检索中的查准率,检索出相关文档数/检索出的文档总数
召回率(Recall)
在测试集中为正类的数据中,有多少数据被正确预测(预测结果是正类),即TP/(TP+FN)。
对应于检索中的查全率。检索出相关文档数/文档库中相关文档总数
F1-Measure
精确率和召回率的调和平均值:Recall * Precision * 2 / (Recall + Precision)
总结
理论上,数据预测的准确率和召回率越接近1,说明预测模型的效果越好。但是实际中也不一定,取决于场景更倾向于哪一种。例如我们去某搜索引擎搜索XX病,一共返回了10条结果,其中5条广告,5条有用的相关信息,那么准确率就是50%,而后台数据库中一共就5条有用的相关信息,召回率却是100%,所以大家就认为这个搜索引擎也能凑合用。
区别精确率和召回率主要记住他们是分母不同就好了,召回率是对应测试集中的正类数据而言,而准确率是对应预测结果为正类的数据而言。
区别:
这些指标是针对整体测试集/验证集来说的,而不是针对某一个样本来讲的。指标不要与损失函数混淆,损失函数是训练中用于反馈模型预测值与真值的差距,以更新权重的,损失函数作用在训练集的每一个样本;而指标是在测试集或验证集中评价模型性能的,此时模型已经训练完成了,不能再更新权重了。
指标是统计值,所以每一个指标函数根本不可导,不能用在训练中更新权重,损失函数必须得可导,才能有梯度,才能下降。两者的作用完全不一样,不要混淆。