理论基础(2)损失函数

损失函数

机器学习中的监督学习本质上是给定一系列训练样本 \(\left(x_i, y_i\right)\), 尝试学习 \(x \rightarrow y\) 的映射关系, 使得给定一个 \(x\) , 即便这个 \(x\) 不在训练样本中, 也能够得到尽量接近真实 \(y\) 的输出 \(\hat{y}\) 。而损失函数 (Loss Function) 则是这 个过程中关键的一个组成部分, 用来衡量模型的输出 \(\hat{y}\) 与真实的 \(y\) 之间的差距, 给模型的优化指明方向。

本文将介绍机器学习、深度学习中分类与回归常用的几种损失函数, 包括均方差损失 Mean Squared Loss、平 均绝对误差损失 Mean Absolute Error Loss、Huber Loss、分位数损失 Quantile Loss、交叉樀损失函数 Cross Entropy Loss、Hinge 损失 Hinge Loss。主要介绍各种损失函数的基本形式、原理、特点等方面。

img

前言

在正文开始之前, 先说下关于 Loss Function、Cost Function 和 Objective Function 的区别和联系。在机器学习 的语境下这三个术语经常被交叉使用。

  • 损失函数 Loss Function 通常是针对单个训练样本而言, 给定一个模型输出 \(\hat{y}\) 和一个真实 \(y\), 损失函数输 出一个实值损失 \(L=f\left(y_i, \hat{y_i}\right)\)
  • 代价函数 Cost Function 通常是针对整个训练集(或者在使用 mini-batch gradient descent 时一个 minibatch)的总损失 \(J=\sum_{i=1}^N f\left(y_i, \hat{y}_i\right)\)
  • 目标函数 Objective Function 是一个更通用的术语, 表示任意希望被优化的函数, 用于机器学习领域和非机 器学习领域 (比如运筹优化)

一句话总结三者的关系就是: A loss function is a part of a cost function which is a type of an objective function.

由于损失函数和代价函数只是在针对样本集上有区别,因此在本文中统一使用了损失函数这个术语,但下文的相关公式实际上采用的是代价函数 Cost Function 的形式,请读者自行留意。

结构风险函数

损失函数(loss function)是用来估量模型的预测值f(x)与真实值\(Y\)不一致的程度,它是一个非负实数值函数,通常使用\(L(Y,f(x))\)来表示,损失函数越小,模型的鲁棒性就越好。损失函数是经验风险函数的核心部分,也是结构风险函数的重要组成部分。模型的结构风险函数包括了经验风险项和正则项,通常可以表示成如下的式子:

image-20220821223950768

前面的均值函数表示的是经验风险函数,L代表的是损失函数,后面的Φ是正则化项(regularizer)或者叫惩罚项(penalty term),它可以是L1,也可以是L2等其他的正则函数。整个式子表示的意思是找到使目标函数最小时的θ值。下面列出集中常见的损失函数。

一、 对数损失函数(逻辑回归)MLE 【交叉熵损失函数】

https://zhuanlan.zhihu.com/p/52100927

一文搞懂交叉熵在机器学习中的使用,透彻理解交叉熵背后的直觉

损失函数|交叉熵损失函数

有些人可能觉得逻辑回归的损失函数就是平方损失,其实并不是。平方损失函数可以通过线性回归在假设样本是高斯分布的条件下推导得到,而逻辑回归得到的并不是平方损失。在逻辑回归的推导中,它假设样本服从伯努利分布(0-1分布),然后求得满足该分布的似然函数,接着取对数求极值等等。而逻辑回归并没有求似然函数的极值,而是把极大化当做是一种思想,进而推导出它的经验风险函数为:

最小化负的似然函数(即\(maxF(y,f(x))—>min−F(y,f(x))\))。从损失函数的视角来看,它就成了log损失函数了。

原理解释1:==条件概率下方便计算极大似然估计==

Log损失函数的标准形式:

\(L(Y,P(Y|X))=−logP(Y|X)\)

刚刚说到,取对数是为了方便计算极大似然估计,因为在MLE中,直接求导比较困难,所以通常都是先取对数再求导找极值点。损失函数\(L(Y.P(Y|X))\)表达的是样本在分类\(Y\)的情况下,使概率\(P(Y|X)\)达到最大值(换言之,就是利用已知的样本分布,找到最有可能(即最大概率)导致这种分布的参数值;或者什么样的参数才能使我们观测到目前这组数据的概率最大)。因为log函数是单调递增的,所以\(logP(Y|X)\)也会达到最大值,因此在前面加上负号之后,最大化\(P(Y|X)\)就等价于最小化\(L\)了。

logistic回归\(P(y|x)\)表达式如下(为了将类别标签y统一为1和0,下面将表达式分开表示):

image-20220322202521355

将上面的公式合并在一起,可得到第i个样本正确预测的概率:

image-20220322202548296

上式是对一个样本进行建模的数据表达。对于所有的样本,假设每条样本生成过程独立,在整个样本空间中(N个样本)的概率分布为:

image-20220322202618734

将上式代入到对数损失函数中,得到最终的损失函数为:

image-20220322202653661

原理解释2:相对熵(KL散度)推理

相对熵又称KL散度,如果我们对于同一个随机变量 x 有两个单独的概率分布 P(x) 和 Q(x),我们可以使用 KL 散度(Kullback-Leibler (KL) divergence)来衡量这两个分布的差异.\(DKL\)的值越小,表示q分布和p分布越接近.

相对熵:

image-20220330133351613

相对熵 = 信息熵 + 交叉熵 :

image-20220330134202064

【对数损失函数(Log loss function)】和【交叉熵损失函数(Cross-entroy loss funtion)】在很多文献内是一致的,因为他们的表示式的本质是一样的。

二、 平方损失函数(线性回归,GBDT,最小二乘法,Ordinary Least Squares)MSE

最小二乘法是线性回归的一种,OLS 将问题转化成了一个凸优化问题。在线性回归中,它假设样本和噪声都服从高斯分布(为什么假设成高斯分布呢?其实这里隐藏了一个小知识点,就是中心极限定理,可以参考【central limit theorem】),最后通过极大似然估计(MLE)可以推导出最小二乘式子。最小二乘的基本原则是:最优拟合直线应该是使各点到回归直线的距离和最小的直线,即平方和最小。换言之,OLS是基于距离的,而这个距离就是我们用的最多的欧几里得距离。为什么它会选择使用欧式距离作为误差度量呢(即Mean squared error, MSE),主要有以下几个原因:

  • 简单,计算方便;
  • 欧氏距离是一种很好的相似性度量标准;
  • 在不同的表示域变换后特征性质不变。

平方损失(Square loss)的标准形式如下:\(L(Y,f(X))=(Y−f(x))^2\)当样本个数为n时,此时的损失函数变为:

image-20220322202912962

\(Y−f(X)\) 表示的是残差,整个式子表示的是残差的平方和,而我们的目的就是最小化这个目标函数值(注:该式子未加入正则项),也就是最小化残差的平方和(residual sum of squares,RSS)。

而在实际应用中,通常会使用均方差(MSE)作为一项衡量指标,公式如下:

image-20220322202957484

三、 指数损失函数(Adaboost)

Adaboost训练误差以指数下降。所以说,指数损失本身并没有带来优化上的特殊,优点在于计算和表达简单。

学过Adaboost算法的人都知道,它是前向分步加法算法的特例,是一个加和模型,损失函数就是指数函数。在Adaboost中,经过m此迭代之后,可以得到\(fm(x)\):

image-20220322203050695

Adaboost每次迭代时的目的是为了找到最小化下列式子时的参数 \(a\)\(G\)

image-20220322203141435

而指数损失函数(exp-loss)的标准形式如下:

image-20220322203221432

可以看出,Adaboost的目标式子就是指数损失,在给定N个样本的情况下,Adaboost的损失函数为:

image-20220322203238853

四、 ==Hinge 合页损失函数==(SVM,advGAN)

image-20220401165315551

线性支持向量机学习除了原始最优化问题,还有另外一种解释,就是最优化以下目标函数:

image-20220322205741804

目标函数的第一项是经验损失或经验风险函数:

image-20220322205801232

称为合页损失函数(hinge loss function)。下标”+”表示以下取正值的函数:

image-20220322205844003

这就是说,当样本点\((xi,yi)\)被正确分类且函数间隔(确信度)\(yi(w·xi+b)\)大于1时,损失是0,否则损失是\(1−yi(w·xi+b)\)。目标函数的第二项是系数为 \(λ\)\(w\)\(L2\) 范数,是正则化项。

接下来证明线性支持向量机原始最优化问题:

image-20220322210000477

image-20220322210121285

先令\([1−yi(w·xi+b)]+=ξi\),则\(ξi≥0\),第二个约束条件成立;由\([1−yi(w·xi+b)]+=ξi\),当\(1−yi(w·xi+b)>0\)时,有\(yi(w·xi+b)=1−ξi\);当\(1−yi(w·xi+b)≤0\)时,\(ξi=0\),有\(yi(w·xi+b)≥1−ξi\),所以第一个约束条件成立。所以两个约束条件都满足,最优化问题可以写作

image-20220322210943775

若取 \(λ=1/2C\) 则:

image-20220322211012150

五、Softmax函数和Sigmoid函数的区别与联系

https://zhuanlan.zhihu.com/p/356976844

5.1 分类任务

sigmoid

Sigmoid ===多标签分类问题===多个正确答案=非独占输出(例如胸部X光检查、住院)。构建分类器,解决有多个正确答案的问题时,用Sigmoid函数分别处理各个原始输出值。

Softmax =多类别分类问题=只有一个正确答案=互斥输出(例如手写数字,鸢尾花)。构建分类器,解决只有唯一正确答案的问题时,用Softmax函数处理各个原始输出值。Softmax函数的分母综合了原始输出值的所有因素,这意味着,Softmax函数得到的不同概率之间相互关联。

Sigmoid函数是一种logistic函数,它将任意的值转换到 [公式] 之间,如图1所示,函数表达式为: [公式]

它的导函数为: [公式]

img

优点

  1. Sigmoid函数的输出在(0,1)之间,输出范围有限,优化稳定,可以用作输出层
  2. 连续函数,便于求导

缺点

  1. 最明显的就是饱和性,从上图也不难看出其两侧导数逐渐趋近于0,容易造成梯度消失

2.激活函数的偏移现象。Sigmoid函数的输出值均大于0,使得输出不是0的均值,这会导致后一层的神经元将得到上一层非0均值的信号作为输入,这会对梯度产生影响。

  1. 计算复杂度高,因为Sigmoid函数是指数形式。

Softmax

Softmax函数,又称归一化指数函数,函数表达式为: [公式]

img

Softmax函数是二分类函数Sigmoid在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。如图2所示,Softmax直白来说就是将原来输出是3,1,-3通过Softmax函数一作用,就映射成为(0,1)的值,而这些值的累和为1(满足概率的性质),那么我们就可以将它理解成概率,在最后选取输出结点的时候,我们就可以选取概率最大(也就是值对应最大的)结点,作为我们的预测目标。

由于Softmax函数先拉大了输入向量元素之间的差异(通过指数函数),然后才归一化为一个概率分布,在应用到分类问题时,它使得各个类别的概率差异比较显著,最大值产生的概率更接近1,这样输出分布的形式更接近真实分布。

Softmax可以由三个不同的角度来解释。从不同角度来看softmax函数,可以对其应用场景有更深刻的理解:

  1. softmax可以当作argmax的一种平滑近似,与arg max操作中暴力地选出一个最大值(产生一个one-hot向量)不同,softmax将这种输出作了一定的平滑,即将one-hot输出中最大值对应的1按输入元素值的大小分配给其他位置。
  2. softmax将输入向量归一化映射到一个类别概率分布,即 [公式] 个类别上的概率分布(前文也有提到)。这也是为什么在深度学习中常常将softmax作为MLP的最后一层,并配合以交叉熵损失函数(对分布间差异的一种度量)。
  3. 概率图模型的角度来看,softmax的这种形式可以理解为一个概率无向图上的联合概率。因此你会发现,条件最大熵模型与softmax回归模型实际上是一致的,诸如这样的例子还有很多。由于概率图模型很大程度上借用了一些热力学系统的理论,因此也可以从物理系统的角度赋予softmax一定的内涵。

5.2 总结

  1. 如果模型输出为非互斥类别,且可以同时选择多个类别,则采用Sigmoid函数计算该网络的原始输出值。
  2. 如果模型输出为互斥类别,且只能选择一个类别,则采用Softmax函数计算该网络的原始输出值。
  3. Sigmoid函数可以用来解决多标签问题Softmax函数用来解决单标签问题
  4. 对于某个分类场景,当Softmax函数能用时,Sigmoid函数一定可以用。

6 损失函数Q&A

==平方误差损失函数和交叉熵损失函数分别适合什么场景?==

一般还说,平方损失函数更适合输出为连续,并且最后一层不含sigmod或softmax激活函数的神经网络;交叉熵损失函数更适合二分类或多分类的场景。