分类模型中的损失为什么使用cross entropy 而不是classification error或者squared error?
我们用一个的实际模型来看 classification error 的弊端。
使用 3 组训练数据,computed 一栏是预测结果,targets 是预期结果。二者的数字,都可以理解为概率。correct 一栏表示预测是否正确。
模型 1
computed | targets | correct?
0.3 0.3 0.4 | 0 0 1 (democrat) | yes
0.3 0.4 0.3 | 0 1 0 (republican) | yes
0.1 0.2 0.7 | 1 0 0 (other) | no
item 1 和 2 以非常微弱的优势判断正确,item 3 则彻底错误。classification error= 1/3 = 0.33
模型 2
computed | targets | correct?
0.1 0.2 0.7 | 0 0 1 (democrat) | yes
0.1 0.7 0.2 | 0 1 0 (republican) | yes
0.3 0.4 0.3 | 1 0 0 (other) | no
item 1 和 2 的判断非常精准,item 3 判错,但比较轻。classification error = 1/3 = 0.33
结论
2 个模型的 classification error 相等,但模型 2 要明显优于模型 1.classification error 很难精确描述模型与理想模型之间的距离。
cross-entropy
cross-entropy的计算公式:
第一个模型是cross-entropy:
−
(
I
n
(
0.4
)
+
I
n
(
0.4
)
+
I
n
(
0.1
)
)
/
3
=
1.38
-(In(0.4) + In(0.4) + In(0.1))/3 = 1.38
−(In(0.4)+In(0.4)+In(0.1))/3=1.38
第二个模型的ACE是:
−
(
I
n
(
0.7
)
+
I
n
(
0.7
)
+
I
n
(
0.3
)
)
/
3
=
0.64
-(In(0.7) + In(0.7) + In(0.3))/3 = 0.64
−(In(0.7)+In(0.7)+In(0.3))/3=0.64
结论:
ACE结果准确的体现了模型2优于模型1.cross-entropy 更清晰的描述了模型与理想模型的距离。
为什么不用均方误差呢?
分类问题,最后必须是 one hot 形式算出各 label 的概率,然后通过 argmax 选出最终的分类。在计算各个 label 概率的时候,用的是 softmax 函数。
如果用 MSE 计算 loss,输出的曲线是波动的,有很多局部的极值点。即,非凸优化问题 (non-convex)。cross entropy 计算 loss,则依旧是一个凸优化问题,用梯度下降求解时,凸优化问题有很好的收敛特性。
在训练神经网时,应该使用哪一个呢?
如果是回归问题,用均方误差(MSE).如果是分类问题,一般用交叉熵损失(CE).
因为MSE容易发生梯度消失问题,而CE则不会.
以分类问题为例,假设我们的类别数量为T,最后一层使用softmax.对一条样本(x,c)而言,其label为c.在神经网络softmax之前的那一层,共有T个神经元:
不管是用MSE还是CE,我们都是希望
y
c
y_c
yc越大越好,其他与其并列的神经元越小输出值越好.
如果是MSE,则这条样本的误差为:
(
e
y
c
∑
i
=
1
T
e
y
i
−
1
)
2
+
∑
j
=
1
,
j
≠
c
T
(
e
y
c
∑
i
=
1
T
e
y
i
−
1
)
2
(\frac{e^{y_c}}{\sum^T_{i=1}e^{y^i}}-1)^2 + \sum^T_{j=1,j\neq c}(\frac{e^{y_c}}{\sum^T_{i=1}e^{y^i}}-1)^2
(∑i=1Teyieyc−1)2+j=1,j̸=c∑T(∑i=1Teyieyc−1)2
我们来分析这个误差对于参数w的梯度。上式中一共有T项,我们不妨先取出其中一项,比如第一项来分析:
∂
(
e
y
c
∑
i
=
1
T
e
y
i
−
1
)
2
∂
w
=
2
(
e
y
c
∑
i
=
1
T
e
y
i
−
1
)
⋅
e
y
c
∑
i
=
1
T
e
y
i
⋅
(
1
−
e
y
c
∑
i
=
1
T
e
y
i
)
⋅
∂
y
c
∂
w
\frac{\partial (\frac{e^{y_c}}{\sum^T_{i=1}e^{y^i}}-1)^2}{\partial w}=2(\frac{e^{y_c}}{\sum^T_{i=1}e^{y^i}}-1) \cdot \frac{e^{y_c}}{\sum^T_{i=1}e^{y^i}} \cdot (1-\frac{e^{y_c}}{\sum^T_{i=1}e^{y^i}}) \cdot \frac{\partial y_c}{\partial w}
∂w∂(∑i=1Teyieyc−1)2=2(∑i=1Teyieyc−1)⋅∑i=1Teyieyc⋅(1−∑i=1Teyieyc)⋅∂w∂yc
我们的目标是想通过梯度下降调整w来增大
e
y
c
∑
i
=
1
T
e
y
i
\frac{e^{y_c}}{\sum^T_{i=1}e^{y^i}}
∑i=1Teyieyc,是其尽可能的接近于1.但是当
e
y
c
∑
i
=
1
T
e
y
i
\frac{e^{y_c}}{\sum^T_{i=1}e^{y^i}}
∑i=1Teyieyc接近于0时,梯度也就接近于0.但是我们期望的是想通过梯度下降使其往1的方向走.但是此时梯度接近于0,无法通过梯度下降使其接近于1.这就是梯度消失。
而使用CE时,就不会出现这个问题,其损失为:
−
l
o
g
e
y
c
∑
i
=
1
T
e
y
i
-log\frac{e^{y_c}}{\sum^T_{i=1}e^{y^i}}
−log∑i=1Teyieyc
同样我们求该损失对w的梯度:
∂
(
−
l
o
g
e
y
c
∑
i
=
1
T
e
y
i
)
∂
w
=
(
e
y
c
∑
i
=
1
T
e
y
i
−
1
)
∂
y
c
∂
w
\frac{\partial (-log\frac{e^{y_c}}{\sum^T_{i=1}e^{y^i}})}{\partial w}=(\frac{e^{y_c}}{\sum^T_{i=1}e^{y^i}}-1) \frac{\partial y_c}{\partial w}
∂w∂(−log∑i=1Teyieyc)=(∑i=1Teyieyc−1)∂w∂yc
此时,我们发现,该梯度就不会发生gradient vanishing了,因为消去了导致梯度错误消失的因子。
CE梯度趋近于0仅发生在目标几乎达成的时候,因此没问题。但是MSE在梯度更新的过程可能存在梯度趋近于0,也就是可能随时停在了某个极值点,无法继续更新参数.