十三种Loss函数总结

前言

监督学习通过最小化损失函数,来更新梯度,实现算法的收敛,以下是大家见过无数次的机器学习原理通式: θ = arg min θ 1 N i = 1 N L ( y i , f ( x i ; θ ) ) + λ Φ ( θ ) \theta^*=\arg\min_{\theta}\frac{1}{N}\sum_{i=1}^NL\big(y_i,f(x_i;\theta)\big)+\lambda \Phi(\theta) 左侧的 L ( y i ; f ( x i ; θ ) ) L\big(y_i;f(x_i;\theta)\big) 即为通常意义上的损失函数;右侧 λ Φ ( θ ) \lambda \Phi(\theta) 为正则项,泛指为预防过拟合而对相关参数进行惩罚的监督机制。正则项共有三种,分别为 L 0 L_0 范数、 L 1 L_1 范数和 L 2 L_2 范数:

  • L 0 L_0 范数:非零参数的个数 = i δ ( θ i 0 ) =\sum_i\delta(\theta_i\ne0)
  • L 1 L_1 范数:参数绝对值之和 = i θ i =\sum_i|\theta_i|
  • L 2 L_2 范数:参数平方和的算术平方根 = i θ i 2 =\sqrt{\sum_i\theta_i^2}

下面开始正文部分。

一、回归

L1 Loss

L = y ^ y L=|\hat y-y| 该函数常用于收敛以回归目的的输出,代表一次线性差值。前提假设是输出结果的数学意义在值域上全局相等,且对输出结果偏高和偏低的惩罚一致。弱点是对近点 ( y ^ y |\hat y-y| 接近于0) 的惩罚不够平滑,难以收敛至最优点。应用至批量数据即为 MAE。

L2 Loss

L = ( y ^ y ) 2 L=(\hat y-y)^2 L2 Loss 应用最小二乘法的收敛思路。在 L1 Loss 的基础上将绝对值改为均方,解决了 L1 Loss 的问题,但同时导致离群点惩罚过高。应用至批量数据即为 MSE。

Smooth L1 Loss

L = { 1 2 ( y ^ y ) 2  if  y ^ y < 1 y ^ y 1 2 otherwise L = \begin{cases} \frac{1}{2} ({\hat y} - y)^2 & \text{ if } |{\hat y} - y| < {1} \\ |{\hat y} - y| - \frac{1}{2} & \text{otherwise} \end{cases} 针对 L1 Loss 和 L2 Loss 的缺点,Smooth L1 Loss 采用了一种折中方案。通过设立阈值 1,偏离小于 1 的用最小二乘法计算损失,而大于 1 的用线性误差。这样一来完美解决了以上问题。在 Faster R-CNN 中,Smooth L1 Loss 被用于收敛区域建议网络 (RPN) 中的锚框坐标偏移量。

Huber Loss

L = { 1 2 ( y ^ y ) 2  if  y ^ y < ρ ρ ( y ^ y ρ 2 ) otherwise L = \begin{cases} \frac{1}{2} ({\hat y} - {y})^2 & \text{ if } |{\hat y} - {y}| < {\rho} \\ \rho \big(|{\hat y} - {y}| - \frac{\rho}{2}\big) & \text{otherwise} \end{cases} Huber Loss 是 Smooth L1 Loss 的阈值设定上的拓展,当 阈值 ρ = 1 \rho =1 时,Huber Loss 等同于 Smooth L1 Loss。

Log Cosh Loss

c o s h ( y , y ^ ) = e y y ^ + e ( y y ^ ) 2 cosh(y,\hat y) = \frac{e^{y-\hat y}+e^{{-(y-\hat y)}}}{2} L = l o g [ c o s h ( y , y ^ ) ] L=log\big[ cosh(y,\hat y) \big] Cosh 函数在 y = y ^ y=\hat y 时达到极小值,使得损失函数最小。与 Huber Loss 同样,Log Cosh Loss 能减小对离群点的惩罚,而平滑近点的损失,囊括 Huber Loss 的所有优点。但相对于 Huber Loss,Log Cosh Loss 二阶可导,使得通过牛顿法计算海森矩阵 (Hessian Matrix),实现算法优化成为可能。

二、分类

Softmax Cross Entropy Loss

该函数常用于以分类为目的设计的神经网络,典型的代表是 CNN。当我们希望神经网络的输出是一列向量,而向量中分类所对应的位置为最大值时,适用该函数。当网络输出为 Z R k Z \in \mathbb{R}^{k} ,函数将进行以下处理:
Z = s o f t m a x ( Z ) Z' = softmax(Z)

L = i [ δ ( i = y ) l o g ( Z i ) + δ ( i y ) l o g ( 1 Z i ) ] L=-\sum_i \big[\delta (i=y)log(Z'_i)+\delta (i\ne y)log(1-Z'_i)\big] y { 1 , 2 , . . . , k } y\in \{1,2,...,k\} 为分类标签值所对应的分类, δ { 0 , 1 } \delta \in \{0,1\} 为符号函数。特别地,如果分类结果之间相互独立,可以将损失函数简化为: L = l o g ( Z y ) L=-log(Z'_y) 这样一来,损失函数的计算仅参考标签值所对应分类的 softmax 值 Z y Z'_y ,而不再参考其他分类的输出值,这样的设计在进行多分类任务时能大大减小计算复杂度,提高运行效率。

Sigmoid Binary Cross Entropy Loss

Sigmoid Binary Cross Entropy Loss 更贴近 Cross Entropy 的原始定义,用于二分类任务,如在 RPN 中用于判断锚框是否为前景。该损失函数的计算前提包括,标签值 y y 取值为 0 或 1,以及分类输出 z R z\in \mathbb R 为一个浮点数值,数学意义以 0 为中心左右对称分布。公式如下: L = y × l o g [ σ ( z ) ] ( 1 y ) × l o g [ 1 σ ( z ) ] L=-y\times log\big[\sigma (z)\big]-(1-y)\times log\big[1-\sigma (z)\big] 当标签值 y y 等于 0 时,我们希望分类输出越接近于负无穷大越好;反之,当标签值 y y 等于 1 时,我们希望分类输出更接近于正无穷大;当分类输出为 0,代表模型赋予两个分类同样权重,无法区别。该函数与 Softmax Cross Entropy Loss 的一大区别在于前者利用的是单数值输出,而后者利用的是长度等于分类类别数量的极大似然概率分布序列。

Exponential Loss

L = exp ( y ^ y ) L = \exp(- {\hat y} \cdot y) 同样用于二分类任务,输出和标签需要同时满足来自于值集 { 1 , 1 } \{-1,1\} 。常用于 Boosting 集成学习,由于在反向传播时披露的参数细节过少,不太招深度学习待见。

Logistic Loss

L = log [ 1 + exp ( y ^ y ) ] L = \log\big[1 + \exp(- {\hat y} \cdot y)\big] 又称为 Log Loss,用于 Logistic Regression,机理与 Exponential Loss 类似。

Hinge Loss

L = m a x ( 0 , ρ y ^ y ) L = max(0, {\rho} - {\hat y} \cdot y) 看到 Hinge Loss 就应该能联想到大名鼎鼎的 SVM。该损失函数的核心思想是,当 y ^ \hat y y y 异号时,距离越远损失越大;当 y ^ \hat y y y 同号时,若 y ^ \hat y 小于 ρ / y \rho/y ,则努力让 y ^ \hat y 靠近 ρ / y \rho/y ,若 y ^ \hat y 大于等于 ρ / y \rho/y ,则不予置理。从 SVM 原理推及该函数, ρ \rho 设立太小会导致超平面划分不够精确,设立太大会导致因划分正确的元素奖励过大而导致的异常收敛。

Squared Hinge Loss

L = m a x ( 0 , ρ y ^ y ) 2 L = max(0, {\rho} - {\hat y} \cdot y)^2 Squared Hinge Loss 在 Hinge Loss 基础上加以平方,如此以来,若 y ^ \hat y 大于 ρ / y \rho/y 则同样进行梯度更新,可解决上述使用 Hinge Loss 时 ρ \rho 设立过大导致的异常收敛问题。

Focal Loss

分类算法的训练很重要的一点,是训练样本中各类别的参与比例不能相差过大。这样的问题通常容易在 Faster R-CNN 等目标检测神经网络中出现,源于大多数时候图像中真正属于前景的部分非常少,绝大多数都是背景负案例。负案例在计算损失函数时参与比例过大,会导致梯度更新向负案例偏移,进行无效收敛。Focal Loss 通过将案例比例引入到函数的计算中,得以解决该项问题。定义神经网络输出为经过 Sigmoid 激活函数激活的 z [ 0 , 1 ] z\in [0,1] ,标签为 y { 0 , 1 } y\in \{0,1\} ,其中 0 代表占比为多数的负案例,1 代表占比较小的正案例。损失函数定义如下: L = α y ( 1 z ) γ l o g ( z ) L=-\alpha_y(1-z)^\gamma log(z) y = 0 y=0 α y \alpha_y 取值为样本中正案例的比例, y = 1 y=1 α y \alpha_y 取值为样本中负案例的比例。进一步地,该公式引入 ( 1 z ) γ (1-z)^\gamma 用于控制易分和难分的案例比,加速收敛。 γ \gamma 取值越大,代表损失函数越倚重难分案例。相关论文链接

三、生成

KL Divergence Loss

KL Divergency (KL散度) 又称 Kullback-Leibler Divergence,或相对熵 (Relative Entropy),是信息论中的重要概念,反映两组概率分布间的非对称性差异 (用 Q 的分布来拟合 P 所造成的损失),相关数学公式如下: D ( p q ) = x q p ( x ) l o g p ( x ) q ( x ) = E p l o g p ( X ) q ( X ) D(p||q)=\sum_{x\in q}p(x)log\frac{p(x)}{q(x)}=\mathbb{E}_plog\frac{p(X)}{q(X)} 移步至机器学习领域,当输出和标签为长度相同、元素之间一一对应的概率分布序列时,可使用: L = i Y i log ( Y i Z i ) ( 0 × l o g 0 0 = 0 × l o g 0 q = p × l o g p 0 = 0 ) L = \sum_{i} {Y_i} \log(\frac{Y_i}{Z_i})\\ \big(0\times log\frac{0}{0}=0\times log\frac{0}{q}=p\times log\frac{p}{0}=0\big) 该函数的特别之处在于可以衡量单向相似度,适用于包括自然语言生成、语音合成和图像生成的任何生成式架构。

CTC Loss

Triplet Loss

猜你喜欢

转载自blog.csdn.net/weixin_43269174/article/details/88588658