前言
一般说到多分类问题,我们很自然地会采用softmax交叉熵损失,而谈到回归问题,我们可能会选择MSE这样的损失。但有一天,我们也许想知道二者之间是否真的就泾渭分明,能否把交叉熵损失用于回归任务,或者把MSE损失用于分类任务呢。这么想不是没有道理的,毕竟我们可以把多分类问题,看做是离散的回归问题,或者把回归问题,看做是无穷多类别下的分类问题。
讨论1
模型输出的logits,经过softmax归一化后,是采用交叉熵损失好,还是MSE损失好,原因是什么。
两者直观上的区别是,交叉熵损失仅关注预测概率向量的target值,MSE会关注所有non-target值。我们隐隐感觉到,对于分类问题,只用关注target处的元素值,所以交叉熵损失好。下面我们尝试进行更细致的分析:
[ 以最简单的二分类为例分析 ]
记logits为
[
z
1
,
z
2
]
[z_1,z_2]
[z1,z2],经softmax归一化后为
[
a
1
,
a
2
]
[a_1,a_2]
[a1,a2],对应标签
[
y
1
,
y
2
]
[y_1,y_2]
[y1,y2](0,1取值),则:
L
m
s
e
=
(
a
1
−
y
1
)
2
+
(
a
2
−
y
2
)
2
L_{mse}=(a_1-y_1)^2+(a_2-y_2)^2
Lmse=(a1−y1)2+(a2−y2)2,
L
c
e
=
y
1
l
n
(
a
1
)
+
y
2
l
n
(
a
2
)
L_{ce}=y_1ln(a_1)+y_2ln(a_2)
Lce=y1ln(a1)+y2ln(a2),
∂
L
m
s
e
/
∂
a
1
=
2
(
a
1
−
y
1
)
\partial{L_{mse}}/\partial{a_1}=2(a_1-y_1)
∂Lmse/∂a1=2(a1−y1),
∂
L
c
e
/
∂
a
1
=
−
y
1
/
a
1
\partial{L_{ce}}/\partial{a_1}=-y_1/a_1
∂Lce/∂a1=−y1/a1,
可以看到,随着
a
1
a_1
a1趋近于
y
1
y_1
y1,
L
m
s
e
L_{mse}
Lmse对
z
1
z_1
z1的梯度会被
(
a
1
−
y
1
)
(a_1-y_1)
(a1−y1)这一项打折扣,而
L
c
e
L_{ce}
Lce的不会,因为
y
1
/
a
1
y_1/a_1
y1/a1最小为1。下面写出完整的梯度公式对比:
可以看到,交叉熵损失对应的梯度非常简洁。
举个实例,
[
a
1
,
a
2
]
=
[
0.8
,
0.2
]
[a_1,a_2]=[0.8, 0.2]
[a1,a2]=[0.8,0.2],
若
y
1
=
0
y_1=0
y1=0,式(1)=0.512,式(2)=0.8
若
y
1
=
1
y_1=1
y1=1,式(1)=-0.128,式(2)=-0.2
可以发现,交叉熵损失对应的梯度更利于快速收敛。
更新1
- 对于传统的机器学习任务,多直接求得闭式解,因此可以使用基于MSE的损失函数;对于梯度优化的方式,MSE损失可能存在局部最优导致收敛失败;
- 下图是基于MSE损失的一个示例图,对于一个给定的样本点,以softmax的前一线性层参数为横坐标(图中的x),得到的loss曲线如下图,可以看到,若参数初始值在右方的平坦区,且学习率较小,则损失无法收敛至左侧的global optimal。
更新2
若MSE/MAE也只关注target处的值,则有:
- CE相对更关注难例样本,MSE相对更关注简单样本,MAE则一视同仁
- MAE也和MSE一样,相比CE收敛速度和精度可能存在问题
以下截图来自腾讯优图Louis分享:
结论1
对于分类问题,交叉熵损失和MSE都可以用,只不过交叉熵损失优于MSE
讨论2
对于一个向量,能否用(非)softmax的方式,将其归一化(元素和为1),然后基于交叉熵损失做回归任务,原因是什么。
[ 以二维向量回归为例分析 ]
对于
[
G
1
,
G
2
]
[G_1, G_2]
[G1,G2]和
[
z
1
,
z
2
]
[z_1, z_2]
[z1,z2],分别softmax归一化得
[
y
1
,
y
2
]
[y_1, y_2]
[y1,y2]和
[
a
1
,
a
2
]
[a_1, a_2]
[a1,a2]。我们希望
[
z
1
,
z
2
]
[z_1, z_2]
[z1,z2]趋近
[
G
1
,
G
2
]
[G_1, G_2]
[G1,G2],一个自然的思路是基于回归,即
L
m
s
e
=
(
z
1
−
G
1
)
2
+
(
z
2
−
G
2
)
2
L_{mse}=(z_1-G_1)^2+(z_2-G_2)^2
Lmse=(z1−G1)2+(z2−G2)2,或者我们想试试能否基于交叉熵损失,此时转换为希望
[
a
1
,
a
2
]
[a_1, a_2]
[a1,a2]趋向
[
y
1
,
y
2
]
[y_1, y_2]
[y1,y2],
L
c
e
=
y
1
l
n
(
a
1
)
+
y
2
l
n
(
a
2
)
L_{ce}=y_1ln(a_1) + y_2ln(a_2)
Lce=y1ln(a1)+y2ln(a2)。对比两种思路:
- 看梯度,可以发现
∂
L
m
s
e
/
∂
z
1
\partial{L_{mse}}/\partial{z_1}
∂Lmse/∂z1的取值是实数范围,而
∂
L
c
e
/
∂
z
1
\partial{L_{ce}}/\partial{z_1}
∂Lce/∂z1取值范围是
[
−
1
,
1
]
[-1,1]
[−1,1],后者限制了
z
z
z的更新速度。注意这里交叉熵虽然是做分类,但我们的最终目标仍是
z
→
G
z→G
z→G。
∂ L m s e / ∂ z 1 = 2 ( z 1 − G 1 ) \partial{L_{mse}}/\partial{z_1}=2(z_1-G_1) ∂Lmse/∂z1=2(z1−G1)
∂ L c e / ∂ z 1 = a 1 − y 1 \partial{L_{ce}}/\partial{z_1}=a_1-y_1 ∂Lce/∂z1=a1−y1 - 看优化目标,不同的 [ G 1 , G 2 ] [G_1, G_2] [G1,G2]和 [ z 1 , z 2 ] [z_1, z_2] [z1,z2],softmax归一化操作后,可以存在 [ y 1 , y 2 ] = [ a 1 , a 2 ] [y_1, y_2]=[a_1, a_2] [y1,y2]=[a1,a2],即在 z z z和 G G G还存在误差时,交叉熵损失得到的梯度已然为0,此时交叉熵损失显然不适用了。举例, [ G 1 , G 2 ] = [ 1 , 2 ] [G_1, G_2]=[1, 2] [G1,G2]=[1,2], [ z 1 , z 2 ] = [ 2 , 3 ] [z_1, z_2]=[2, 3] [z1,z2]=[2,3],两者softmax归一化均为 [ 1 / ( 1 + e ) , e / ( 1 + e ) ] [1/(1+e), e/(1+e)] [1/(1+e),e/(1+e)]。
- 若采用非softmax的方式归一化,比如通过直接除以元素之和,或者比如向量元素先自行平方,再除以平方之和,均存在一些问题:a. 元素之和可能为0,需要近似处理;b.梯度中涉及对数ln()运算;c. 同样存在上述2中的优化目标不一致的问题,比如[1,2]和[2,4],通过除以元素之和归一化,均得到[1/3, 2/3]。
结论2
基于MSE的回归任务,不能转换为基于交叉熵损失的分类任务。