损失函数(Loss Function)是深度学习中至关重要的组成部分,它衡量模型预测结果与真实标签之间的差异,是模型优化的目标。

1. 线性回归损失函数

线性回归问题通常使用MAE(平均绝对误差)和MSE(均方误差)作为损失函数。

1.1 MAE Loss (L1 Loss)

MAE(Mean Absolute Error)计算预测值与真实值之间绝对差值的平均值。

import torch
import torch.nn as nn

# MAE损失函数
mae_loss = nn.L1Loss()

MAE=\frac{1}{n}\sum_{i=1}^{n}\left | y_{i} -\hat{y_{i}}\right |

特点:对异常值不敏感;梯度恒定,不利于梯度下降优化。

1.2 MSE Loss(L2 Loss)

MSE(Mean Squared Error)计算预测值与真实值之间平方差值的平均值。

mse_loss = nn.MSELoss()

MAE=\frac{1}{n}\sum_{i=1}^{n}\left ( y^{_{i}} -\hat{y_{i}}\right )^{2}

特点:对异常值敏感;梯度随误差增大而增大,有利于梯度下降。

备注:对于需要进行特征筛选的任务选择L1正则,它会让权重变得稀疏,缺点是对异常值敏感,当需要保留所有特征减少过拟合时使用L2正则,它处处可导,梯度下降稳定,工程中可以同时使用这两种正则化ElasticNet(L1+L2)或直接试 L2 剪枝。

1.3 Huber Loss / Smooth L1( 更实用)

Huber Loss(也称为 Smooth L1 Loss)是一种在回归任务中常用的损失函数,它结合了MSE和MAE的优点,在误差较小时表现得像 MSE(平滑、可导),在误差较大时表现得像 MAE(对异常值更鲁棒)。

L\left ( \delta \right )=\left\{\begin{matrix} 0.5*x^{2}~~~~~~~~~~~~if~\left | x \right |\leq \delta \\ \delta *\left ( \left | x \right |-0.5\delta \right ),~otherwise \end{matrix}\right.

其中x为误差,δ为超参数,通常取1.0

处处可导(L1在0处不可导),且计算简单(无平方操作)。

2. 交叉熵损失(CrossEntropyLoss)

交叉熵损失是分类任务中最常用的损失函数,尤其适用于多分类问题。

交叉熵是信息熵与KL散度的组合:

ce_loss = nn.CrossEntropyLoss()

H\left ( P,Q \right )=H\left ( P \right )+D_{KL}\left ( P||Q \right )=-\sum_{i}^{}P\left ( x_{i} \right )\log Q\left ( x_{i} \right )

其中:

信息熵:信息熵是信息量的期望,衡量系统的不确定性。

H(P)=-\sum_{i}^{}P\left ( x_{i} \right )\log P\left ( x_{i} \right )

KL散度:KL散度衡量两个概率分布的差异。

D_{_{KL}}\left ( P,Q \right )=\sum_{i}^{}P\left ( x_{i} \right )\log \frac{P\left ( x_{i} \right )}{Q\left ( x_{i} \right )}

在分类任务中,P是真实分布(one-hot),Q是预测分布,因此最小化交叉熵等价于最小化KL散度。

3. 二元交叉熵损失(BCELoss)

BCELoss(Binary Cross Entropy Loss)用于二分类问题,每个样本只能属于正类或负类。

bce_loss = nn.BCELoss()

BCELoss=-\frac{1}{n}\sum_{i=1}^{n}\left [ y_{i} \log \left ( \hat{y_{i} }\right )+\left ( 1-y_{i} \right )\log \left ( 1-\hat{y_{i}} \right )\right ]

BCEWithLogitsLoss:

通常在实际使用中,我们更常用BCEWithLogitsLoss,它结合了Sigmoid激活和BCELoss,数值计算更稳定。

选择建议:

  1. 回归问题:

    • 数据中有异常值:优先考虑MAE

    • 数据质量较好:使用MSE

  2. 分类问题:

    • 二分类:使用BCEWithLogitsLoss

    • 多分类:使用CrossEntropyLoss

    • 类别不平衡:使用带权重的版本

  3. 特殊需求:

    • 需要更关注困难样本:考虑使用Focal Loss等变体

    • 多标签分类:可能需要组合多个BCELoss

参考文章:深度学习中的常见损失函数详解及PyTorch实现 - 技术栈

更多推荐