常用损失函数

通常提到损失函数,我们不得不提到代价函数(Cost Function)及目标函数(Object Function)。 **损失函数**(Loss Function) 直接作用于单个样本,用来表达样本的误差 **代价函数**(Cost Function)作用于整个训练集,是整个样本集的平均误差,对所有损失函数值的平均 **目标函数**(Object Function)是我们最终要优化的函数,也就是代价函数+正则化函数(经验风险+结构风险) ::: hljs-center $\theta^{*}=\arg \min _{\theta} \frac{1}{N} \sum_{i=1}^{N} L\left(y_{i}, f\left(x_{i} ; \theta\right)\right)+\lambda \Phi(\theta)$ ::: 其中,第一部分是代价函数,L代表损失函数;第二部分是正则化函数(也可以称为惩罚项),可以试L1,也可以试L2或者其他正则函数。整个表达式是要找到是目标函数最好的值。 **理解**:损失函数旨在表示出logit和label的差异程度,不同的损失函数有不同的表示意义,也就是在最小化损失函数过程中,logit逼近label的方式不同,得到的结果可能也不同。 一般情况下,softmax和sigmoid使用交叉熵损失(logloss),hingeloss是SVM推导出的,hingeloss的输入使用原始logit即可。 # 1、平方损失函数(最小二乘法) 最小二乘法是线性回归的一种,最小二乘法(OLS)将问题转化成了一个凸优化问题。在线性回归中,它假设样本和噪声都服从高斯分布(为什么假设成高斯分布呢?其实这里隐藏了一个小知识点,就是**中心极限定理**,最后通过极大似然估计(MLE)可以推导出最小二乘式子。最小二乘的基本原则是:**最优拟合直线应该是使各点到回归直线的距离和最小的直线,即平方和最小**。换言之,OLS是基于距离的,而这个距离就是我们用的最多的**欧几里得距离**。为什么它会选择使用欧式距离作为误差度量呢(即Mean squared error, MSE),主要有以下几个原因: - 简单,计算方便; - 欧氏距离是一种很好的相似性度量标准; - 在不同的表示域变换后特征性质不变。 **平方损失(Square loss)的标准形式如下:** ::: hljs-center $L(Y, f(X))=(Y-f(X))^{2}$ ::: 当样本个数为n时,此时的损失函数变为: ::: hljs-center $L(Y, f(X))=\sum_{i=1}^{n}(Y-f(X))^{2}$ ::: **Y-f(X)** 表示的是残差,整个式子表示的是**残差的平方和**,而我们的目的就是最小化这个目标函数值(++注:该式子未加入正则项++),也就是**最小化残差的平方和**(residual sum of squares,RSS)。 而在实际应用中,通常会使用均方差(MSE)作为一项衡量指标,公式如下: ::: hljs-center $M S E=\frac{1}{n} \sum_{i=1}^{n}\left(\tilde{Y}_{i}-Y_{i}\right)^{2}$ ::: 上面提到了线性回归,这里额外补充一句,我们通常说的线性有两种情况,一种是因变量y是自变量x的线性函数,一种是因变量y是参数α的线性函数。在机器学习中,通常指的都是后一种情况。 ```language 优点: 计算方便,逻辑清晰,衡量误差较准确 梯度随着误差增大或减小,收敛效果好 缺点: 对异常点(离群值)敏感,异常点会产生较大的损失,模型追求对异常点预估准确从而牺牲整体精度。特别是对于长尾分布的数据(小数值占一大部分,同时会有长尾的大数值),长尾数据产生较大的loss,导致模型过于关注少量长尾数据,从而对于其他数据预估精度降低。 ``` # 2、Log Loss 对数损失函数(逻辑回归) 我们就模仿线性回归,用误差的平方和当做代价函数。代价函数如下所示: ::: hljs-center $J(w)=\sum_{i=1}^{n} \frac{1}{2}\left(\phi\left(z_{i}\right)-y_{i}\right)^{2}$ ::: 其中$z_{i}=W^{T} X_{i}+w_{0}$,$y_i$为$X_i$真实的类标号, $\phi(z)$ 为 $Sigmoid$函数:$\phi(z)=\frac{1}{1+e^{-z}}$,如下所示: ![ke9h2qet.png](https://cos.easydoc.net/17082933/files/kfhmbh7u.png) 按说此时可以对代价函数求解最小值了,但是如果你将 $\phi(z)=\frac{1}{1+e^{-z}}$ 带入代价公式$J(w)$的话,那么当前代价函数的图像是一个**非凸函数**,非凸函数有不止一个极值点,导致不容易做最优化计算。也就是说,这个代价函数不能用。 不过我们发现$Sigmoid$函数有一个好处,那就是因为其取值在0,1之间。所以可以**看做是测试元组属于类1的后验概率,即$p(y=1|X)$**。其实这一点从图像也可以看出来:$z$的值越大,表明元组的空间位置距离分类面越远,他就越可能属于类1,所以图中$z$越大,函数值也就越接近1;同理,$z$越小,表明元组越不可能属于类1。 所以可以得到下面的结论: ::: hljs-center $p(y=1 \mid X ; W)=\phi(z)$ $p(y=0 \mid X ; W)=1-\phi(z)$ ::: 更进一步,上式也可以这样表达: ::: hljs-center $p(y \mid X ; W)=\phi(z)^{y}(1-\phi(z))^{1-y}$ ::: 上面这个公式表达的含义是在参数$W$下,元组类标号为$y$的后验概率。假设现在已经得到了一个抽样样本,那么联合概率 $\prod_{i=1}^{n} p\left(y_{i} \mid X_{i} ; W\right)$ 的大小就可以反映模型的代价:联合概率越大,说明模型的学习结果与真实情况越接近;联合概率越小,说明模型的学习结果与真实情况越背离。而对于这个联合概率,我们可以通过计算参数的最大似然估计的那一套方法来确定使得联合概率最大的参数$W$,此时的W就是我们要选的最佳参数,它使得联合概率最大(即代价函数最小)。下面看具体的运算步骤。 ++关于参数的最大似然估计的相关知识可以参考博客++: [最大化期望算法(EM)详解](https://blog.csdn.net/guoziqing506/article/details/81274276) 因为在最大似然估计中,直接求导比较困难,**为了方便计算**,我们**先将其取对数再求导找极值点**: ::: hljs-center $\begin{aligned} L(W) &=\sum_{i=1}^{n} \log p\left(y_{i} \mid X_{i} ; W\right) \\ &=\sum_{i=1}^{n} \log \left(\phi\left(z_{i}\right)^{y_{i}}\left(1-\phi\left(z_{i}\right)\right)^{1-y_{i}}\right) \\ &=\sum_{i=1}^{n} y_{i} \log \phi\left(z_{i}\right)+\left(1-y_{i}\right) \log \left(1-\phi\left(z_{i}\right)\right.\end{aligned}$ ::: 通过上面的分析,我们要求得$L(W)$的最大值,那么显然 −$L(W)$ 就是代价函数$J(W)$。为方便后面的推导,我把$J(W)$也写出来: ::: hljs-center $J(W)=-\sum_{i=1}^{n} y_{i} \log \phi\left(z_{i}\right)+\left(1-y_{i}\right) \log \left(1-\phi\left(z_{i}\right)\right)$ ::: 这就是(逻辑回归)的**对数损失函数** > 有些人可能觉得逻辑回归的损失函数就是平方损失,其实并不是。**平方损失函数可以通过线性回归在假设样本是高斯分布的条件下推导得到**,而逻辑回归得到的并不是平方损失。在逻辑回归的推导中,它假设样本服从**伯努利分布(0-1分布)**,然后求得满足该分布的似然函数,接着取对数求极值等等。而逻辑回归并没有求似然函数的极值,而是把极大化当做是一种思想,进而推导出它的经验风险函数为:**最小化负的似然函数(即max F(y, f(x)) —> min -F(y, f(x)))**。从损失函数的视角来看,它就成了log损失函数了。 > >**log损失函数的标准形式:** $L(Y, P(Y \mid X))=-\log P(Y \mid X)$ >注意:softmax使用的即为交叉熵损失函数,binary_cossentropy为二分类交叉熵损失,categorical_crossentropy为多分类交叉熵损失,当使用多分类交叉熵损失函数时,标签应该为多分类模式,即使用one-hot编码的向量。 ```language (1) log对数损失函数能非常好的表征概率分布,在很多场景尤其是多分类,如果需要知道结果属于每个类别的置信度,那它非常适合。 (2)健壮性不强,相比于hinge loss对噪声更敏感。 ``` # 3、SoftMax 交叉熵 **损失函数=one-hot + softmax + cross-entropy 组合** - **one-hot** 在最理想的情况下,如果一个样本属于第k类,那么这个类别所对应的的输出节点的输出值应该为1,而其他节点的输出都为0,即[0,0,1,0,….0,0],这个数组也就是样本的Label,是模型最期望的输出结果。 - **softmax** softmax的输出值就是概率分布,应用于多分类问题。softmax也属于激活函数。softmax、one-hot和cross-entropy,一般组合使用。softmax公式如下: ::: hljs-center <font size=5>$a_{i}=\frac{e^{z_{i}}}{\sum_{k} e^{z_{k}}}$</font> ::: **交叉熵**(cross entropy)比较one-hot编码和softmax输出之间的**距离**,即模型的**真值和输出的距离**,也就是交叉熵的值越小,两个概率分布就越接近。 假设概率分布p为期望输出,概率分布q为实际输出,H(p,q)为交叉熵,则: ::: hljs-center $H(p, q)=-\sum_{x} p(x) \log q(x)$ ::: 举个例子: 假设N=3,期望输出为p=(1,0,0),实际输出q1=(0.5,0.2,0.3),q2=(0.8,0.1,0.1),那么: $H\left(p, q_{1}\right)=-\left(1 \times \log ^{0.5}+0 \times \log ^{0.2}+0 \times \log ^{0.3}\right)$ $H\left(p, q_{1}\right)=0.3$ $H\left(p, q_{2}\right)=-\left(1 \times \log ^{0.8}+0 \times \log ^{0.1}+0 \times \log ^{0.1}\right)$ $H\left(p, q_{2}\right)=0.1$ 参考: [softmax交叉熵损失函数及其求导](https://blog.csdn.net/fsdfasfawre/article/details/80586123) [损失函数 one-hot + softmax + cross-entropy 组合](https://www.jianshu.com/p/db6f7363acd5) # 4、指数损失函数(Adaboost) 学过Adaboost算法的人都知道,它是前向分步加法算法的特例,是一个加和模型,损失函数就是指数函数。在Adaboost中,经过m此迭代之后,可以得到$f_m(x)$: ::: hljs-center $f_{m}(x)=f_{m-1}(x)+\alpha_{m} G_{m}(x)$ ::: Adaboost每次迭代时的目的是为了找到最小化下列式子时的参数$α$ 和$G$: ::: hljs-center $\arg \min _{\alpha, G}=\sum_{i=1}^{N} \exp \left[-y_{i}\left(f_{m-1}\left(x_{i}\right)+\alpha G\left(x_{i}\right)\right)\right]$ ::: 而指数损失函数(exp-loss)的标准形式如下 ::: hljs-center $L(y, f(x))=\exp [-y f(x)]$ ::: 可以看出,Adaboost的目标式子就是指数损失,在给定n个样本的情况下,**Adaboost的损失函数为:** ::: hljs-center $L(y, f(x))=\frac{1}{n} \sum_{i=1}^{n} \exp \left[-y_{i} f\left(x_{i}\right)\right]$ ::: ```language 特点:对异常样本敏感,异常样本在迭代中可能得到较大权重,影响强学习器的预测准确性。 至于为什么 Adaboost 用指数损失函数,ESL 上介绍说有两个原因: 其连续可微,有良好的可计算性; 在更新权重时有比较简单的形式。 且极小化指数损失函数等价于最小化分类偏差率,所以用它来代替0/1损失函数做为优化目标。 [参考](https://www.shangmayuan.com/a/6b6a4b7eb18847f5a2d020cc.html) ``` # 5、Hinge损失函数(SVM) 在机器学习算法中,hinge损失函数和SVM是息息相关的。在**线性支持向量机**中,最优化问题可以等价于下列式子: ::: hljs-center $\min _{w, b} \sum_{i}^{N}\left[1-y_{i}\left(w \cdot x_{i}+b\right)\right]+\lambda\|w\|^{2}$ ::: 下面来对式子做个变形,令: ::: hljs-center $\left[1-y_{i}\left(w \cdot x_{i}+b\right)\right]=\xi_{i}$ ::: 于是,原式就变成了: ::: hljs-center $\min _{w, b} \sum_{i}^{N} \xi_{i}+\lambda\|w\|^{2}$ ::: 如若取λ=1/(2C),式子就可以表示成: ::: hljs-center $\min _{w, b} \frac{1}{C}\left(\frac{1}{2}\|w\|^{2}+C \sum_{i}^{N} \xi_{i}\right)$ ::: 其中,z=可以看出,该式子与下式非常相似: ::: hljs-center $\frac{1}{m} \sum_{i=1}^{m} l\left(w \cdot x_{i}+b, y_{i}\right)+\|w\|^{2}$ ::: **前半部分中的 $l$ 就是hinge损失函数**,而**后面相当于L2正则项**。(很玄妙吧~~) **Hinge 损失函数的标准形式:** ::: hljs-center $l(\tilde{y}\,,y)=\max (0,1-y \tilde{y}), y=\pm 1$ ::: 可以看出,当$y \tilde{y}>=1$时,$l(\tilde{y}\,,y)=0$ 补充一下:在libsvm中一共有4中核函数可以选择,对应的是-t参数分别是: - 0-线性核; - 1-多项式核; - 2-RBF核; - 3-sigmoid核。 ```language 特点:健壮性相对较高,对异常点、噪声不敏感,但它没太好的概率解释。 ``` # 6、其它损失函数 除了以上这几种损失函数,常用的还有: **0-1损失函数** $L(Y, f(X))=\left\{\begin{array}{ll}1, & Y \neq f(X) \\ 0, & y=f(X)\end{array}\right.$ ```language 特点:0-1损失函数直接对应分类判断错误的个数,但是它是一个非凸函数,不太适用. ``` **绝对值损失函数** $L(Y, f(X))=|Y-f(X)|$ ```language 优点: 对异常值具有较好鲁棒性 缺点: 梯度不变是个严重问题,即使对于很小的损失,梯度也很大,不利于模型收敛(比如神经网络),常使用变化的学习率解决,或者使用huber损失 ``` 下面来看看几种损失函数的可视化图像,对着图看看横坐标,看看纵坐标,再看看每条线都表示什么损失函数,多看几次好好消化消化。 ![15560943918146325ea8a29cd47109aa1421f8ed30142.png](https://cos.easydoc.net/17082933/files/kfhqakhz.png) # 补充 对数损失函数和交叉熵损失函数应该是等价的!!! ![v2ac627eab5f07ead5144cfaaff7f2163b_r.jpg](https://cos.easydoc.net/17082933/files/kfhri7st.jpg) --- 转载:[机器学习常用损失函数(Loss Function)](https://www.yuque.com/7125messi/rt18xv/noxa8m#c8f87e64)