Rethinking:分类&回归

前言

一般说到多分类问题,我们很自然地会采用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=(a1y1)2+(a2y2)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(a1y1)
∂ 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) (a1y1)这一项打折扣,而 L c e L_{ce} Lce的不会,因为 y 1 / a 1 y_1/a_1 y1/a1最小为1。下面写出完整的梯度公式对比:
grad
可以看到,交叉熵损失对应的梯度非常简洁。
举个实例, [ 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

  1. 对于传统的机器学习任务,多直接求得闭式解,因此可以使用基于MSE的损失函数;对于梯度优化的方式,MSE损失可能存在局部最优导致收敛失败;
  2. 下图是基于MSE损失的一个示例图,对于一个给定的样本点,以softmax的前一线性层参数为横坐标(图中的x),得到的loss曲线如下图,可以看到,若参数初始值在右方的平坦区,且学习率较小,则损失无法收敛至左侧的global optimal。
    MSE-based分类损失

更新2
若MSE/MAE也只关注target处的值,则有:

  1. CE相对更关注难例样本,MSE相对更关注简单样本,MAE则一视同仁
  2. MAE也和MSE一样,相比CE收敛速度和精度可能存在问题

以下截图来自腾讯优图Louis分享:
CE_vs_MAE_1CE_vs_MAE_2
GCE_loss

结论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=(z1G1)2+(z2G2)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)。对比两种思路:

  1. 看梯度,可以发现 ∂ 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 zG
    ∂ 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(z1G1)
    ∂ L c e / ∂ z 1 = a 1 − y 1 \partial{L_{ce}}/\partial{z_1}=a_1-y_1 Lce/z1=a1y1
  2. 看优化目标,不同的 [ 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)]
  3. 若采用非softmax的方式归一化,比如通过直接除以元素之和,或者比如向量元素先自行平方,再除以平方之和,均存在一些问题:a. 元素之和可能为0,需要近似处理;b.梯度中涉及对数ln()运算;c. 同样存在上述2中的优化目标不一致的问题,比如[1,2]和[2,4],通过除以元素之和归一化,均得到[1/3, 2/3]。
结论2

基于MSE的回归任务,不能转换为基于交叉熵损失的分类任务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值