深度学习的损失函数怎么选?
先看任务类型,再看标签长什么样,别在分类任务上死磕MSE。
损失函数干一件事:告诉模型“这次错在哪、错多少”。选错了,模型会认真地朝错误方向学。最典型的翻车是:多分类用了MSE,检测只盯box_loss不管cls_loss,分割用交叉熵却不处理类别极不平衡。loss降了,指标不动,多半是目标函数就设歪了。
怎么选?按任务对号入座。
分类:默认交叉熵,类别不平衡再换。 二分类用BCE,多分类用CrossEntropy。标签是one-hot或类别编号,输出是各类概率,这两口对得上。别用MSE去拟合类别编号——模型会把“猫”和“狗”当成两个邻近的数,距离没有语义。类别差一个数量级以上,先试加权交叉熵或Focal Loss,让模型多盯少数类。准确率虚高、少数类全漏,优先查损失,别先改网络。
回归:先MSE,有离群点再换。 预测分数、角度、温度这类连续值,MSE最省事。数据里有明显脏点(标成999、漏标成0),MSE会被极值拽歪,换成MAE或Huber更稳。归一化没做就上MSE,loss数字会大得吓人,不代表模型没学,先把目标缩到合理量级。
检测:不是选一个loss,是一组loss在打架。 YOLO这类模型至少有分类损失、框回归损失,新版本还有DFL。你要选的不是“用哪个神奇公式”,而是这几项的权重别乱拧。默认配方先跑通,某一项长期不降,再针对那一项查数据:cls不降看类别和标注;box不降看框是不是标飘了、小目标是不是太多。自己换CIoU、SIoU当创新点可以,但先保证和baseline同一套数据、同一套权重,否则表格没法看。
分割:像素级交叉熵能起步,前景太少必须加Dice/IoU。 病斑、裂缝、车道线往往只占几个百分点的像素,纯交叉熵会让模型学会“全预测成背景”。Dice或IoU损失盯的是重叠区域,和这类任务更贴。实操上常见组合是CE + Dice,比单换一个花哨名字更稳。
三个原则,比背公式有用。
原则一:损失必须和输出头匹配。 最后一层是Softmax,后面接CrossEntropy;是Sigmoid,后面接BCE。激活和损失绑错一对,梯度会很安静,看起来像没在学。
原则二:看验证指标,不看训练loss绝对值。 换了损失函数,量纲就变了,0.3和1.2没法横比。该比的是验证集上的acc、mAP、Dice。loss只负责回答“这条更新方向对不对”。
原则三:一次只换一种损失,并写进消融。 同时换损失、换增强、换注意力,涨了也不知道是谁的功劳。论文里写“改进损失函数”,至少要有baseline损失和你的损失两行对比。
给一套能直接抄的起点:
图像分类、类别还算均衡:CrossEntropy,完事。
图像分类、长尾数据:加权CE或Focal Loss,gamma从2试起。
数值回归:MSE;脏数据多就Huber。
YOLO检测:官方默认三项损失先别动,权重保持默认。
分割、前景很小:CE + Dice,权重1:1起步。
最后提醒一句:损失函数不是创新点批发市场。换一个听起来高级的名字,指标掉0.5个点,删掉就行。任务对、标签对、默认损失能把验证曲线拉下去,这个选择就已经合格。
任务定损失,标签检验损失,指标验收损失。按这个顺序选,比在论文里抄公式靠谱。