前言
我们都知道在机器学习中,希望算法或者网络收敛更快,有些是对数据预处理,尤其是Batch Normalization,有些是采用不同的激活函数,尤其是Relu激活函数取得了巨大的成功,还有一种加速收敛方法是更换损失函数。本博客就是针对均方差损失(MSE)和交叉熵损失的收敛速度做一个推导,当然少不了参考他人博客啦,但是参考归参考,重在自己推导一遍。
国际惯例,来一波地址
Kullback–Leibler divergence(相对熵,KL距离,KL散度)
两种损失函数对比
前提条件
在三层BP神经网络(输入->隐层->输出)中,设 y y y为模型输出, o o o为真实标注,激活函数为 s i g m o i d sigmoid sigmoid(用 σ \sigma σ表示),输出层偏置为b,隐层单元值为h,隐层到输出层权重为 w w w,这样就能得到 y = σ ( w h + b ) y=\sigma(wh+b) y=σ(wh+b)
为了简便起见,只对比隐层中的一个单元与输出层之间的连接权重对于一个样本输入的更新梯度。提前关注
s
i
g
m
o
i
d
sigmoid
sigmoid函数
σ
(
x
)
=
1
1
+
e
−
x
\sigma(x)=\frac{1}{1+e^{-x}}
σ(x)=1+e−x1
以及
s
i
g
m
o
i
d
sigmoid
sigmoid函数的导数
σ
′
(
x
)
=
∂
σ
(
x
)
x
=
σ
(
x
)
(
1
−
σ
(
x
)
)
\sigma'(x)=\frac{\partial \sigma(x)}{x}=\sigma(x)(1-\sigma(x))
σ′(x)=x∂σ(x)=σ(x)(1−σ(x))
还有
y
y
y对权重的导数
y
′
=
∂
y
∂
w
=
y
(
1
−
y
)
h
y'=\frac{\partial y}{\partial w}=y(1-y)h
y′=∂w∂y=y(1−y)h
均方差损失
函数表达为:
L
MSE
=
1
2
∣
∣
(
o
−
y
)
∣
∣
2
2
=
1
2
(
o
−
y
)
2
L_{\text{MSE}}=\frac{1}{2}||(o-y)||_2^2=\frac{1}{2}(o-y)^2
LMSE=21∣∣(o−y)∣∣22=21(o−y)2
权重梯度更新,更详细的推导看我前面的博客
∂
L
MSE
∂
w
=
(
o
−
y
)
σ
′
(
w
h
+
b
)
h
\frac{\partial L_{\text{MSE}}}{\partial w}=(o-y)\sigma'(wh+b)h
∂w∂LMSE=(o−y)σ′(wh+b)h
交叉熵损失
函数表达为:
L
c
r
o
s
s
−
e
n
t
r
o
p
y
(
o
,
y
)
=
−
(
[
o
log
y
]
+
(
1
−
o
)
log
(
1
−
y
)
)
L_{cross-entropy}(o,y)=-([o\log y]+(1-o)\log(1-y))
Lcross−entropy(o,y)=−([ology]+(1−o)log(1−y))
【题外话】为什么不能将交叉熵内的
y
,
o
y,o
y,o互换位置呢?因为
o
o
o是真实标注,可能取到0值,但是
y
y
y是
s
i
g
m
o
i
d
sigmoid
sigmoid激活的值,只能无限逼近0,而不会等于0。这样
log
\log
log才有意义嘛。
权重更新梯度,利用到前提条件中
y
y
y对权重的导数
∂
L
cross-entropy
∂
w
=
−
(
o
y
⋅
y
′
−
1
−
o
1
−
y
⋅
y
′
)
=
−
[
o
−
y
y
(
1
−
y
)
⋅
y
′
]
=
(
y
−
o
)
h
\begin{aligned} \frac{\partial L_{\text{cross-entropy}}}{\partial w}&=-(\frac{o}{y}\cdot y'-\frac{1-o}{1-y}\cdot y')\\ &=-\left[\frac{o-y}{y(1-y)}\cdot y'\right]\\ &=(y-o)h \end{aligned}
∂w∂Lcross-entropy=−(yo⋅y′−1−y1−o⋅y′)=−[y(1−y)o−y⋅y′]=(y−o)h
对比
因为是查看的是梯度更新的步长,所以不用关心正负,对比均方差和交叉熵两种损失函数更新梯度的绝对值即可
Δ
MSE
=
∣
o
−
y
∣
⋅
∣
σ
′
(
w
h
+
b
)
∣
⋅
∣
h
∣
Δ
cross-entropy
=
∣
y
−
0
∣
⋅
∣
h
∣
\Delta_{\text{MSE}}=|o-y|\cdot|\sigma'(wh+b)|\cdot|h|\\ \Delta_{\text{cross-entropy}}=|y-0|\cdot|h|
ΔMSE=∣o−y∣⋅∣σ′(wh+b)∣⋅∣h∣Δcross-entropy=∣y−0∣⋅∣h∣
可以发现
Δ
MSE
Δ
cross-entropy
=
∣
σ
′
(
w
h
+
b
)
∣
≤
0.25
\frac{\Delta_{\text{MSE}}}{\Delta_{\text{cross-entropy}}}=|\sigma'(wh+b)|\leq0.25
Δcross-entropyΔMSE=∣σ′(wh+b)∣≤0.25
【注】这个最大值0.25,就是斜率
y
′
y'
y′的最大值,直接对
y
′
=
y
(
1
−
y
)
=
y
−
y
2
y'=y(1-y)=y-y^2
y′=y(1−y)=y−y2求导等于0,就可以发现
y
=
1
2
y=\frac{1}{2}
y=21的时候斜率最大,为0.25。
谢谢评论区指正,以前博客写的是最小值。
而且,从下面的 s i g m o i d sigmoid sigmoid函数图像可以发现,对于均方差MSE损失,输出越大,梯度越小。比如当真实标注为 0 0 0的时候, y = σ ( w h + b ) y=\sigma(wh+b) y=σ(wh+b)越大,sigmoid的值越大,但是sigmoid的梯度越小,这也就导致了 Δ cross-entropy \Delta_{\text{cross-entropy}} Δcross-entropy的梯度大(因为没sigmoid导数这一项),但是 Δ MSE \Delta_{\text{MSE}} ΔMSE的梯度小(因为乘以了sigmoid较远的非常小的梯度)。
本文已经同步到微信公众号中,公众号与本博客将持续同步更新运动捕捉、机器学习、深度学习、计算机视觉算法,敬请关注