多头部模型多分类任务MSE损失优于Categorical Crossentropy的原因?
多头部模型分类头交叉熵不收敛、MSE效果更优的可能原因
- 多任务损失量级不匹配:你是对所有头部损失加权求和后反向传播,交叉熵损失和回归头损失的量级大概率存在巨大差异。5分类任务的交叉熵初始化损失约为ln(5)≈1.6,而如果回归头的回归目标数值范围大,对应的MSE损失可能达到几十、数百的量级,权重配置不合理的情况下,分类头的梯度会完全被回归头的梯度覆盖,自然无法学习。替换为分类MSE后,5分类one-hot的初始MSE约为0.25,和回归头的MSE损失量级更接近,加权后梯度贡献平衡,就可以正常收敛。
- 交叉熵和激活函数的搭配错误:你提到分类头无激活时MSE效果最优,如果你使用交叉熵时没有正确配置参数,比如将无激活的原始输出直接传入默认的
CategoricalCrossentropy接口,框架会默认输入是概率分布,额外计算一次softmax,导致梯度计算完全错误,很容易出现梯度消失。而MSE对最后一层是否有激活没有强制要求,只要输出范围和0-1的one-hot标签匹配,梯度计算始终正常,不会出现该问题。 - 损失的特性匹配问题:交叉熵强制要求输出满足概率分布约束,需要模型输出极偏的数值来降低损失,如果你的输入特征本身区分度不足,交叉熵很容易让模型陷入局部最优或梯度震荡。而MSE不需要输出符合概率分布,只要求输出向量的数值尽可能接近one-hot标签,刚好契合你推理时取argmax判断类别的逻辑,容错性更高,更容易学到正确的类别映射。
- 梯度饱和问题:如果你使用交叉熵时搭配了softmax或sigmoid激活,当模型输出和标签差异较大时,激活函数会进入梯度饱和区,回传的梯度极小,加上多任务模型梯度本身被多个头分流,小梯度几乎无法传递到下层网络,模型自然学不动。而无激活加MSE的组合梯度是线性的,不存在饱和问题,无论输出和标签差距多大都有足够的梯度回传,收敛性更好。
- 损失选型不匹配任务:如果你用的是BCE损失,本身就不适用于你当前的单标签多分类场景,BCE默认所有类别相互独立,无法利用单标签分类的类别互斥特性,本身就很难收敛。而MSE是对整个one-hot向量计算整体误差,刚好契合单标签的互斥特性,反而能正常学习。
内容的提问来源于stack exchange,提问作者Pratik Kayal
相关产品推荐
相关产品推荐

