在有监督学习中,损失函数刻画了模型的预测值与训练样本的匹配程度。令函数 f : X → Y f : X \rightarrow Y f:X→Y 表示我们的机器学习模型,模型关于第 i i i 个样本的输出为 f ( x i ) f(x_i) f(xi),为了刻画模型的预测值与训练样本的匹配程度,定义损失函数 J : Y × Y → R ≥ 0 J: Y\times Y \rightarrow R_{\geq 0} J:Y×Y→R≥0,损失函数的值 J ( f ( x i ) , y i ) ) J(f(x_i),y_i)) J(f(xi),yi)) 越小,表示模型匹配的越好。
针对回归问题和分类问题,使用的损失函数会有所不同。
均方差损失是回归任务中最常用的一种损失函数,也称为 L2 Loss,其基本形式为:
J M S E = 1 N ∑ i = 1 N ( y i − f ( x i ) ) 2 J_{MSE}=\frac{1}{N} \sum_{i=1}^N (y_i - f(x_i))^2 JMSE=N1i=1∑N(yi−f(xi))2
均方差损失函数假设模型的预测值于真实值之间的误差服从 标准的正态分布( μ = 0 , σ = 1 \mu=0,\sigma=1 μ=0,σ=1),则给定一个输入 x i x_i xi,模型输出真实值 y i y_i yi 的概率为:
p ( y i ∣ x i ) = 1 2 π exp ( − ( y i − f ( x i ) ) 2 2 ) p(y_i|x_i)=\frac{1}{\sqrt{2\pi}} \exp(-\frac{(y_i-f(x_i))^2}{2}) p(yi∣xi)=2π 1exp(−2(yi−f(xi))2)
假设数据集中的 N N N 个样本点互相独立,根据条件独立性假设,则给定所有输入样本 x i x_i xi,输出所有真实值 y y y 的概率,即似然(Likelihood),为所有 p ( y i ∣ x i ) p(y_i|x_i) p(yi∣xi) 的累积:
L ( x , y ) = ∏ i = 1 N p ( y i ∣ x i ) = ∏ i = 1 N 1 2 π exp ( − ( y i − f ( x i ) ) 2 2 ) \begin{aligned} L(x,y) &= \prod_{i=1}^N p(y_i|x_i) \\ &= \prod_{i=1}^N \frac{1}{\sqrt{2\pi}} \exp(-\frac{(y_i-f(x_i))^2}{2}) \end{aligned} L(x,y)=i=1∏Np(yi∣xi)=i=1∏N2π 1exp(−2(yi−f(xi))2)
为了方便计算,对上式取对数,则它的对数似然(Log Likelihood, LL)为:
L L ( x , y ) = log ( L ( x , y ) ) = − N 2 log 2 π − 1 2 ∑ i = 1 N ( y i − f ( x i ) ) 2 \begin{aligned} LL(x,y) &= \log(L(x,y)) \\ &= -\frac{N}{2} \log 2\pi - \frac{1}{2} \sum_{i=1}^{N} (y_i-f(x_i))^2 \end{aligned} LL(x,y)=log(L(x,y))=−2Nlog2π−21i=1∑N(yi−f(xi))2
第一项与 f ( x i ) f(x_i) f(xi) 无关可以去掉,因此,最终问题可以转化为最小化负对数似然(Negative Log Likelihood, NLL):
N L L ( x , y ) = 1 2 ∑ i = 1 N ( y i − f ( x i ) ) 2 NLL(x,y)=\frac{1}{2} \sum_{i=1}^{N} (y_i-f(x_i))^2 NLL(x,y)=21i=1∑N(yi−f(xi))2
可以看出,上面的式子实际上就是均方差损失的形式。
综上所述,在模型输出与真实值的误差服从高斯分布的假设下,最小化均方差损失函数与极大似然估计本质上是一致的。因此在这个假设能被满足的场景中(比如回归),均方差损失是一个很好的损失函数选择。
基本形式为:
J M A E = 1 N ∑ i = 1 N ∣ y i − f ( x i ) ∣ J_{MAE}=\frac{1}{N} \sum_{i=1}^N |y_i - f(x_i)| JMAE=N1i=1∑N∣yi−f(xi)∣
平均绝对误差损失函数假设模型的预测值于真实值之间的误差服从 拉普拉斯(Laplace)分布( μ = 0 , b = 1 \mu=0,b=1 μ=0,b=1),则给定一个输入 x i x_i xi,模型输出真实值 y i y_i yi 的概率为:
p ( y i ∣ x i ) = 1 2 exp ( ∣ y i − f ( x i ) ∣ ) p(y_i|x_i)=\frac{1}{2} \exp(|y_i-f(x_i)|) p(yi∣xi)=21exp(∣yi−f(xi)∣)
与 MSE 中的推导类似,同样可以得到:
L ( x , y ) = ∏ i = 1 N 1 2 exp ( ∣ y i − f ( x i ) ∣ ) L L ( x , y ) = − N 2 − ∑ i = 1 N ∣ y i − f ( x i ) ∣ N L L ( x , y ) = ∑ i = 1 N ∣ y i − f ( x i ) ∣ \begin{aligned} L(x,y) &= \prod_{i=1}^N \frac{1}{2} \exp(|y_i-f(x_i)|) \\ LL(x,y) &= -\frac{N}{2} - \sum_{i=1}^{N} |y_i-f(x_i)| \\ NLL(x,y) &= \sum_{i=1}^{N} |y_i-f(x_i)| \end{aligned} L(x,y)LL(x,y)NLL(x,y)=i=1∏N21exp(∣yi−f(xi)∣)=−2N−i=1∑N∣yi−f(xi)∣=i=1∑N∣yi−f(xi)∣
(1)MSE 通常比 MAE 可以更快的收敛
我们知道,在求解机器学习的参数值时,通常是采用梯度下降法求解的,MSE 损失的梯度为 − f ( x i ) -f(x_i) −f(xi),而 MAE 的梯度一直是 ± 1 \pm 1 ±1,因此,MSE 梯度的绝对值会随着误差的变换而变化,而 MAE 不会,MAE 的这个特性非常不利于模型的训练。因此,MSE 通常比 MAE 可以更快的收敛,这也是 MSE 用的更多的原因。
(2)MAE 对异常点的鲁棒性更强,即 MAE 更不容易受到异常值的影响
可以从两个角度来分析,
MSE 的损失与误差是平方关系,当误差很大时,MSE 损失会远远大于 MAE 损失,对模型的训练会产生更大的影响,因此,MSE 更容易受异常值的影响。或者从两种损失的原理来分析,MSE 假设误差服从高斯分布,而 MAE 假设服从拉普拉斯分布,这两种分布相比,拉普拉斯对异常值的鲁棒性更强因为 MAE 与 MSE 各有所长,各有所短,因此就有了 Huber 损失,Huber 损失是一种将 MSE 与 MAE 相结合、取两者优点的损失函数。
其基本原理就是在误差接近于 0 时使用 MSE,误差较大时使用 MAE,公式为:
J h u b e r = 1 N ∑ i = 1 N I ∣ y i − f ( x i ) ∣ ≤ δ ( y i − f ( x i ) ) 2 2 + I ∣ y i − f ( x i ) ∣ > δ ( δ ∣ y i − f ( x i ) ∣ − 1 2 δ 2 ) J_{huber}=\frac{1}{N} \sum_{i=1}^N I_{|y_i-f(x_i)|\leq \delta} \frac{(y_i - f(x_i))^2}{2} + I_{|y_i-f(x_i)| > \delta} (\delta|y_i-f(x_i)| - \frac{1}{2} \delta^2) Jhuber=N1i=1∑NI∣yi−f(xi)∣≤δ2(yi−f(xi))2+I∣yi−f(xi)∣>δ(δ∣yi−f(xi)∣−21δ2)
其中 δ \delta δ 是 Huber Loss 的一个超参数, δ \delta δ 的值是 MSE 和 MAE 两个损失连接的位置。可以看出,第一项是 MSE 的部分,第二项是 MAE 的部分,公式中的 δ ∣ y i − f ( x i ) ∣ − 1 2 δ 2 \delta|y_i-f(x_i)| - \frac{1}{2} \delta^2 δ∣yi−f(xi)∣−21δ2 是为了保证当 ∣ y − f ( x ) ∣ = ± δ |y-f(x)|=\pm \delta ∣y−f(x)∣=±δ 时,MAE 与 MSE 的取值一致,进而保证 Huber Loss 损失连续可导。
二分类的交叉损失熵损失函数为:
J C E = − ∑ i = 1 N ( y i l o g ( f ( x i ) ) + ( 1 − y i ) l o g ( 1 − f ( x i ) ) ) J_{CE}=-\sum_{i=1}^N (y_i log(f(x_i)) + (1-y_i)log(1-f(x_i))) JCE=−i=1∑N(yilog(f(xi))+(1−yi)log(1−f(xi)))
在多分类问题中,真实值 y i y_i yi 是一个 One-hot 向量,除了目标类为 1 之外,其他类别的输出都为 0。
令类别的总数为 K K K,样本 x i x_i xi 的目标类为 c i c_i ci,则损失函数为:
J C E = − ∑ i = 1 N ∑ k = 1 K y i k log ( f ( x i ) k ) = − ∑ i = 1 N y i c i log ( f ( x i ) c i ) \begin{aligned} J_{CE} &=-\sum_{i=1}^N \sum_{k=1}^K y_i^k \log (f(x_i)^k) \\ &= -\sum_{i=1}^N y_i^{c_i} \log (f(x_i)^{c_i}) \end{aligned} JCE=−i=1∑Nk=1∑Kyiklog(f(xi)k)=−i=1∑Nyicilog(f(xi)ci)
分类问题中为什么不用均方损失误差?
上面提到,均方损失误差的假设前提是误差服从高斯分布,但在分类问题中下这个假设是不成立的,因此效果会很差。
交叉熵损失为什么就适合呢?
可以从两个角度进行分析:
(1)交叉熵损失其实是一种最小化负对数似然
以二分类为例,令类别 y ∈ ( 0 , 1 ) y\in (0,1) y∈(0,1),则对样本 x i x_i xi 有:
p ( y i = 1 ∣ x i ) = f ( x i ) p ( y i = 0 ∣ x i ) = 1 − f ( x i ) \begin{aligned} p(y_i=1|x_i) &= f(x_i) \\ p(y_i=0|x_i) &= 1-f(x_i) \end{aligned} p(yi=1∣xi)p(yi=0∣xi)=f(xi)=1−f(xi)
合并到一起,则对样本 x i x_i xi 的似然可以写作:
p ( y i ∣ x i ) = ( f ( x i ) ) y i ( 1 − f ( x i ) ) 1 − y i p(y_i|x_i)=(f(x_i))^{y_i}(1-f(x_i))^{1-y_i} p(yi∣xi)=(f(xi))yi(1−f(xi))1−yi
假设数据样本之间互相独立,则在整个样本集上的似然函数可以写作:
L ( x , y ) = ∏ i = 1 N ( f ( x i ) ) y i ( 1 − f ( x i ) ) 1 − y i L(x,y)=\prod_{i=1}^N (f(x_i))^{y_i}(1-f(x_i))^{1-y_i} L(x,y)=i=1∏N(f(xi))yi(1−f(xi))1−yi
对上面的似然函数取对数,再加个负号,就变成了最小化负对数似然,即为交叉熵损失函数的形式:
N L L ( x , y ) = J C E = − ∑ i = 1 N ( y i l o g ( f ( x i ) ) + ( 1 − y i ) l o g ( 1 − f ( x i ) ) ) NLL(x,y) = J_{CE} = -\sum_{i=1}^N (y_i log(f(x_i)) + (1-y_i)log(1-f(x_i))) NLL(x,y)=JCE=−i=1∑N(yilog(f(xi))+(1−yi)log(1−f(xi)))
(2)从 KL 散度来分析交叉熵损失
对一个样本 x i x_i xi,假设存在一个最优的分布 y i ∗ y_i^* yi∗ 可以真实的表示样本 x i x_i xi 属于各个类别的概率,那么,我们总是希望模型的输出 f ( x i ) f(x_i) f(xi) 可以尽可能地逼近这个最优分布。
在信息论中,我们常用 KL 散度来衡量两个分布之间的相似性。
KL 散度(Kullback–Leibler Divergence) 又称相对熵(Relative Entropy),两个分布 P P P 和 Q Q Q 的 KL 散度记为 K L ( P ∥ Q ) KL(P\| Q) KL(P∥Q),计算公式为: K L ( P ∥ Q ) = E x ∼ P ( x ) [ log P ( x ) Q ( x ) ] = ∑ i = 1 n [ P ( x i ) log P ( x i ) Q ( x i ) ] KL(P\| Q)=E_{x\sim P(x)}[\log\frac{P(x)}{Q(x)}]=\sum_{i=1}^n [P(x_i) \log\frac{P(x_i)}{Q(x_i)}] KL(P∥Q)=Ex∼P(x)[logQ(x)P(x)]=i=1∑n[P(xi)logQ(xi)P(xi)]
在我们这个分类问题中,共有 K K K 个类别,则对两个分布 P P P 和 Q Q Q ,它们的 KL 散度可以写作:
K L ( P ∥ Q ) = ∑ k = 1 K P k log ( P k ) − ∑ k = 1 K P k log ( Q k ) KL(P\| Q)=\sum_{k=1}^K P^k \log(P^k) - \sum_{k=1}^K P^k \log(Q^k) KL(P∥Q)=k=1∑KPklog(Pk)−k=1∑KPklog(Qk)
其中,式子的第一项为分布 P P P 的信息熵,第二项为分布 P P P 和 Q Q Q 的交叉熵。
令最优分布 y i ∗ y_i^* yi∗ 和输出分布 f ( x i ) f(x_i) f(xi) 分别为分布 P P P 和 Q Q Q 并代入,得到:
K L ( y i ∗ ∥ f ( x i ) ) = ∑ k = 1 K y i ∗ k log ( P k ) − ∑ k = 1 K y i ∗ k log ( f ( x i ) k ) KL(y_i^* \| f(x_i))=\sum_{k=1}^K y_i^{*k} \log(P^k) - \sum_{k=1}^K y_i^{*k} \log(f(x_i)^k) KL(yi∗∥f(xi))=k=1∑Kyi∗klog(Pk)−k=1∑Kyi∗klog(f(xi)k)
我们希望最优分布 y i ∗ y_i^* yi∗ 和输出分布 f ( x i ) f(x_i) f(xi) 尽可能地相似,即它们的 KL 散度最小。其中第一项的信息熵仅与最优分布 y i ∗ y_i^* yi∗ 有关,因此在求最小值时可以忽略,简化后的最小化目标函数即为:
− ∑ k = 1 K y i ∗ k log ( f ( x i ) k ) - \sum_{k=1}^K y_i^{*k} \log(f(x_i)^k) −k=1∑Kyi∗klog(f(xi)k)
由于最优分布 y i ∗ y_i^* yi∗ 未知,我们可以将训练样本中的真实类别信息 y i y_i yi 看作是 y i ∗ y_i^* yi∗ 的一个近似分布,则单个样本的最小化目标函数就可以写作:
L ( x i ) = − ∑ k = 1 K y i k log ( f ( x i ) k ) L(x_i)=- \sum_{k=1}^K y_i^{k} \log(f(x_i)^k) L(xi)=−k=1∑Kyiklog(f(xi)k)
考虑整个数据集,则损失函数可以写作:
J K L = ∑ i = 1 N L ( x i ) = − ∑ i = 1 N ∑ k = 1 K y i k log ( f ( x i ) k ) = − ∑ i = 1 N y i c i log ( f ( x i ) c i ) \begin{aligned} J_{KL} &= \sum_{i=1}^N L(x_i) \\ &= - \sum_{i=1}^N \sum_{k=1}^K y_i^{k} \log(f(x_i)^k) \\ &= - \sum_{i=1}^N y_i^{c_i} \log (f(x_i)^{c_i}) \end{aligned} JKL=i=1∑NL(xi)=−i=1∑Nk=1∑Kyiklog(f(xi)k)=−i=1∑Nyicilog(f(xi)ci)
因此,最小化 KL 散度得到的目标函数与交叉熵损失是一致的。
合页损失是一种二分类损失函数,适合于基于最大间隔的分类算法,如 SVM。
合页损失的标准公式为:
J h i n g e = ∑ i = 1 N m a x ( 0 , 1 − y i f ( x i ) ) , y i = ± 1 J_{hinge}=\sum_{i=1}^N max(0, 1 - y_i f(x_i)), y_i = \pm 1 Jhinge=i=1∑Nmax(0,1−yif(xi)),yi=±1
Hinge损失函数和 SVM 是息息相关的。
根据 支持向量机(Support Vector Machine, SVM),在线性分类中,带有松弛变量的 SVM 算法在 Hinge 损失下的目标函数为:
min w , b 1 2 ∥ w ∥ 2 + C ∑ i = 1 m m a x ( 0 , 1 − y i ( w T x i + b ) ) \min_{{\bf w},b} \frac{1}{2}{\|{\bf w}\|^2}+C\sum_{i=1}^m max(0, 1-y_i({\bf w}^T{\bf x}_i+b) ) w,bmin21∥w∥2+Ci=1∑mmax(0,1−yi(wTxi+b))
该式中,第一项为正则项,第二项即为 Hinge 损失。
合页损失在 y f ( x ) = 1 y f(x)=1 yf(x)=1 处不可导,因此不能用梯度下降法求解,一般采用 次梯度下降法(Subgradient Descent Method)。
Log 对数损失函数的标准形式为:
L ( Y , P ( Y ∣ X ) ) = − log P ( Y ∣ X ) L(Y,P(Y|X))=-\log P(Y|X) L(Y,P(Y∣X))=−logP(Y∣X)
假设各个样本都是独立同分布的,有:
J l o g = − log P ( Y ∣ X ) = − log ∏ i P ( y i ∣ x i ) = − ∑ i log P ( y i ∣ x i ) J_{log}=-\log P(Y|X)= - \log \prod_{i} P(y_i|x_i) = -\sum_{i} \log P(y_i|x_i) Jlog=−logP(Y∣X)=−logi∏P(yi∣xi)=−i∑logP(yi∣xi)
分析
(1)Log 对数损失函数能非常好的表征概率分布,在很多场景尤其是多分类,如果需要知道结果属于每个类别的置信度,那它非常适合。
(2)相比于 Hinge loss,Log 损失对噪声更敏感。
(3)逻辑回归的损失函数就是log对数损失函数。
0-1 损失是一种二分类的损失函数,它的思想非常简单,若 x i x_i xi 预测的类别标签相同,则损失为 0,否则为 1,因此,即对 x i x_i xi 的损失为:
L 0 − 1 ( x i , y i ) = { 1 f ( x i ) ≠ y i 0 f ( x i ) = y i L_{0-1}(x_i,y_i) = \begin{cases} 1 & f(x_i) \neq y_i\\ 0 & f(x_i) = y_i \end{cases} L0−1(xi,yi)={10f(xi)=yif(xi)=yi
因此,对所有样本的损失函数为:
J 0 − 1 = ∑ i = 1 N L 0 − 1 ( x i , y i ) J_{0-1} = \sum_{i=1}^N L_{0-1}(x_i,y_i) J0−1=i=1∑NL0−1(xi,yi)
分析
0-1损失虽然非常简单、直观,但由于其非凸、非光滑的特点,使得算法很难对该函数进行优化。
交叉熵损失 与 合页损失 都是 0-1损失相对紧的凸上界,因此都可以作为 0-1 损失的代理函数。