前言
监督学习通过最小化损失函数,来更新梯度,实现算法的收敛,以下是大家见过无数次的机器学习原理通式:
θ
∗
=
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)
θ ∗ = arg θ min N 1 i = 1 ∑ N L ( y i , f ( x i ; θ ) ) + λ Φ ( θ ) 左侧的
L
(
y
i
;
f
(
x
i
;
θ
)
)
L\big(y_i;f(x_i;\theta)\big)
L ( y i ; f ( x i ; θ ) ) 即为通常意义上的损失函数;右侧
λ
Φ
(
θ
)
\lambda \Phi(\theta)
λ Φ ( θ ) 为正则项,泛指为预防过拟合而对相关参数进行惩罚的监督机制。正则项共有三种,分别为
L
0
L_0
L 0 范数、
L
1
L_1
L 1 范数和
L
2
L_2
L 2 范数:
L
0
L_0
L 0 范数:非零参数的个数
=
∑
i
δ
(
θ
i
≠
0
)
=\sum_i\delta(\theta_i\ne0)
= ∑ i δ ( θ i ̸ = 0 )
L
1
L_1
L 1 范数:参数绝对值之和
=
∑
i
∣
θ
i
∣
=\sum_i|\theta_i|
= ∑ i ∣ θ i ∣
L
2
L_2
L 2 范数:参数平方和的算术平方根
=
∑
i
θ
i
2
=\sqrt{\sum_i\theta_i^2}
= ∑ i θ i 2
下面开始正文部分。
一、回归
L1 Loss
L
=
∣
y
^
−
y
∣
L=|\hat y-y|
L = ∣ y ^ − y ∣ 该函数常用于收敛以回归目的的输出,代表一次线性差值。前提假设是输出结果的数学意义在值域上全局相等,且对输出结果偏高和偏低的惩罚一致。弱点是对近点 (
∣
y
^
−
y
∣
|\hat y-y|
∣ y ^ − y ∣ 接近于0) 的惩罚不够平滑,难以收敛至最优点。应用至批量数据即为 MAE。
L2 Loss
L
=
(
y
^
−
y
)
2
L=(\hat y-y)^2
L = ( 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}
L = { 2 1 ( y ^ − y ) 2 ∣ y ^ − y ∣ − 2 1 if ∣ y ^ − y ∣ < 1 otherwise 针对 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}
L = { 2 1 ( y ^ − y ) 2 ρ ( ∣ y ^ − y ∣ − 2 ρ ) if ∣ y ^ − y ∣ < ρ otherwise Huber Loss 是 Smooth L1 Loss 的阈值设定上的拓展,当 阈值
ρ
=
1
\rho =1
ρ = 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}
c o s h ( y , y ^ ) = 2 e y − y ^ + e − ( y − y ^ )
L
=
l
o
g
[
c
o
s
h
(
y
,
y
^
)
]
L=log\big[ cosh(y,\hat y) \big]
L = l o g [ c o s h ( y , y ^ ) ] Cosh 函数在
y
=
y
^
y=\hat y
y = 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 ∈ R k ,函数将进行以下处理:
Z
′
=
s
o
f
t
m
a
x
(
Z
)
Z' = softmax(Z)
Z ′ = s o f t m a x ( 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]
L = − i ∑ [ δ ( i = y ) l o g ( Z i ′ ) + δ ( i ̸ = y ) l o g ( 1 − Z i ′ ) ]
y
∈
{
1
,
2
,
.
.
.
,
k
}
y\in \{1,2,...,k\}
y ∈ { 1 , 2 , . . . , k } 为分类标签值所对应的分类,
δ
∈
{
0
,
1
}
\delta \in \{0,1\}
δ ∈ { 0 , 1 } 为符号函数。特别地,如果分类结果之间相互独立,可以将损失函数简化为:
L
=
−
l
o
g
(
Z
y
′
)
L=-log(Z'_y)
L = − l o g ( Z y ′ ) 这样一来,损失函数的计算仅参考标签值所对应分类的 softmax 值
Z
y
′
Z'_y
Z y ′ ,而不再参考其他分类的输出值,这样的设计在进行多分类任务时能大大减小计算复杂度,提高运行效率。
Sigmoid Binary Cross Entropy Loss
Sigmoid Binary Cross Entropy Loss 更贴近 Cross Entropy 的原始定义,用于二分类任务,如在 RPN 中用于判断锚框是否为前景。该损失函数的计算前提包括,标签值
y
y
y 取值为 0 或 1,以及分类输出
z
∈
R
z\in \mathbb R
z ∈ 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]
L = − y × l o g [ σ ( z ) ] − ( 1 − y ) × l o g [ 1 − σ ( z ) ] 当标签值
y
y
y 等于 0 时,我们希望分类输出越接近于负无穷大越好;反之,当标签值
y
y
y 等于 1 时,我们希望分类输出更接近于正无穷大;当分类输出为 0,代表模型赋予两个分类同样权重,无法区别。该函数与 Softmax Cross Entropy Loss 的一大区别在于前者利用的是单数值输出,而后者利用的是长度等于分类类别数量的极大似然概率分布序列。
Exponential Loss
L
=
exp
(
−
y
^
⋅
y
)
L = \exp(- {\hat y} \cdot y)
L = exp ( − y ^ ⋅ y ) 同样用于二分类任务,输出和标签需要同时满足来自于值集
{
−
1
,
1
}
\{-1,1\}
{ − 1 , 1 } 。常用于 Boosting 集成学习,由于在反向传播时披露的参数细节过少,不太招深度学习待见。
Logistic Loss
L
=
log
[
1
+
exp
(
−
y
^
⋅
y
)
]
L = \log\big[1 + \exp(- {\hat y} \cdot y)\big]
L = log [ 1 + exp ( − y ^ ⋅ y ) ] 又称为 Log Loss,用于 Logistic Regression,机理与 Exponential Loss 类似。
Hinge Loss
L
=
m
a
x
(
0
,
ρ
−
y
^
⋅
y
)
L = max(0, {\rho} - {\hat y} \cdot y)
L = m a x ( 0 , ρ − y ^ ⋅ y ) 看到 Hinge Loss 就应该能联想到大名鼎鼎的 SVM。该损失函数的核心思想是,当
y
^
\hat y
y ^ 与
y
y
y 异号时,距离越远损失越大;当
y
^
\hat y
y ^ 与
y
y
y 同号时,若
y
^
\hat y
y ^ 小于
ρ
/
y
\rho/y
ρ / y ,则努力让
y
^
\hat y
y ^ 靠近
ρ
/
y
\rho/y
ρ / y ,若
y
^
\hat y
y ^ 大于等于
ρ
/
y
\rho/y
ρ / y ,则不予置理。从 SVM 原理推及该函数,
ρ
\rho
ρ 设立太小会导致超平面划分不够精确,设立太大会导致因划分正确的元素奖励过大而导致的异常收敛。
Squared Hinge Loss
L
=
m
a
x
(
0
,
ρ
−
y
^
⋅
y
)
2
L = max(0, {\rho} - {\hat y} \cdot y)^2
L = m a x ( 0 , ρ − y ^ ⋅ y ) 2 Squared Hinge Loss 在 Hinge Loss 基础上加以平方,如此以来,若
y
^
\hat y
y ^ 大于
ρ
/
y
\rho/y
ρ / y 则同样进行梯度更新,可解决上述使用 Hinge Loss 时
ρ
\rho
ρ 设立过大导致的异常收敛问题。
Focal Loss
分类算法的训练很重要的一点,是训练样本中各类别的参与比例不能相差过大。这样的问题通常容易在 Faster R-CNN 等目标检测神经网络中出现,源于大多数时候图像中真正属于前景的部分非常少,绝大多数都是背景负案例。负案例在计算损失函数时参与比例过大,会导致梯度更新向负案例偏移,进行无效收敛。Focal Loss 通过将案例比例引入到函数的计算中,得以解决该项问题。定义神经网络输出为经过 Sigmoid 激活函数激活的
z
∈
[
0
,
1
]
z\in [0,1]
z ∈ [ 0 , 1 ] ,标签为
y
∈
{
0
,
1
}
y\in \{0,1\}
y ∈ { 0 , 1 } ,其中 0 代表占比为多数的负案例,1 代表占比较小的正案例。损失函数定义如下:
L
=
−
α
y
(
1
−
z
)
γ
l
o
g
(
z
)
L=-\alpha_y(1-z)^\gamma log(z)
L = − α y ( 1 − z ) γ l o g ( z ) 当
y
=
0
y=0
y = 0 时
α
y
\alpha_y
α y 取值为样本中正案例的比例,
y
=
1
y=1
y = 1 时
α
y
\alpha_y
α y 取值为样本中负案例的比例。进一步地,该公式引入
(
1
−
z
)
γ
(1-z)^\gamma
( 1 − z ) γ 用于控制易分和难分的案例比,加速收敛。
γ
\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)}
D ( p ∣ ∣ q ) = x ∈ q ∑ p ( x ) l o g q ( x ) p ( x ) = E p l o g q ( X ) p ( 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)
L = i ∑ Y i log ( Z i Y i ) ( 0 × l o g 0 0 = 0 × l o g q 0 = p × l o g 0 p = 0 ) 该函数的特别之处在于可以衡量单向相似度,适用于包括自然语言生成、语音合成和图像生成的任何生成式架构。
CTC Loss
…
Triplet Loss
…