符号标记

$$ \begin{aligned} \mathcal{L}(h(x), y) &= [\mathcal{L}_1, \mathcal{L}_2, \dots, \mathcal{L}_n]^T \\ \end{aligned} $$

其中 $x$、$y$ 分别为模型的特征(feature)与标签(label),$f$ 为分类模型,$h$ 为模型参数,$h(x)$ 为模型的预测结果(shape 为 $[n, c]$),$c$ 为类别数量,$n$ 为 batch size。

损失函数

L1 Loss

L1 Loss 也被称为 平均绝对误差(Mean Absolute Error,MAE),定义为差值的绝对值: $$ \begin{aligned} \operatorname{MAE}(h(x), y) &= \frac{1}{n} \sum_{i=1}^n \mathcal{L}_i \\ \mathcal{L}_i &= |h(x_i) - y_i| \end{aligned} $$

  • (o) 与 MSE 相比,对离群点更加不敏感,适用于离群点较多的情况(例如数据标注质量较差)。
  • (-) 导数不连续,不利于优化过程的稳定和准确(因为导数可能「骤变」)。
  • (-) 当差值较小时,梯度仍然较大(与 MSE 相比),更加容易过拟合。

L2 Loss

L2 Loss 也被称为 均方误差(Mean Square Error,MSE)、二次损失(Quadratic Loss),定义为差值的平方: $$ \begin{aligned} \operatorname{MSE}(h(x), y) &= \frac{1}{n} \sum_{i=1}^n \mathcal{L}_i \\ \mathcal{L}_i &= (h(x_i) - y_i)^2 \end{aligned} $$

  • (o) 与 MAE 相比,对离群点更加敏感,适用于离群点较少的情况(例如数据标准质量较高)。

RMSE

根均方误差(Root Mean Square Error,RMSE)定义为 L2 Loss 的算术平方根(为了使结果的数值范围与 MAE 相同):

$$ \begin{aligned} \operatorname{RMSE}(h(x), y) &= \sqrt{\frac{1}{n} \sum_{i=1}^n \mathcal{L}_i} \\ \mathcal{L}_i &= (h(x_i) - y_i)^2 \end{aligned} $$

Huber Loss

Huber Loss 也被称为 Smoo L1 Loss,是对 L1 LossL2 Loss 的改进。上面提到 L1 Loss 在 0 点处导数不连续且梯度较大的缺点,而 Huber 损失提出:

  • 在 0 附近的区间 $[-\delta, \delta]$ 使用 L2 Loss,此时导数连续且越接近 0 越小。
  • 在该区间以外使用 L2 Loss,此时导数为常数 $2 \delta$。

具体公式如下:

$$ \begin{aligned} \operatorname{Huber}^{(\delta)}(h(x), y) &= \frac{1}{n} \sum_{i=1}^n \mathcal{L}_i^{(\delta)} \\ \mathcal{L}_i^{(\delta)} &= \begin{cases} \frac{1}{2} (h(x_i) - y_i)^2 &\text{if } |h(x_i)-y_i| < \delta \\ \delta |h(x_i) - y_i| - \frac{1}{2}\delta^2 &\text{otherwise} \\ \end{cases} \\ \mathcal{L}_i^{(1)} &= \begin{cases} \frac{1}{2} (h(x_i) - y_i)^2 &\text{if } |h(x_i)-y_i| < 1 \\ |h(x_i) - y_i| - \frac{1}{2} &\text{otherwise} \\ \end{cases} \\ \end{aligned} $$

$\delta$ 的选择非常重要,因为它决定了 什么数据是离群点。大于 $\delta$ 的用 L1 Loss(对较大的离群点较不敏感),而小于 $\delta$ 的则可以用 L2 Loss。当 $\delta \sim 0$ 时,Huber 损失接近 L2 Loss,当 $\delta \sim \infty$ 时,Huber 损失接近 L1 Loss

交叉熵损失

交叉熵损失(Cross Entropy Loss)的本质是用一个 非真实分布(即我们的预测概率)对 真实分布(即 ground truth 标签)进行编码时,平均标记一个事件需要的平均比特数(因此引入了对数),它很好地衡量了两个分布之间的差异。其公式如下: $$ \begin{aligned} \operatorname{CE}(h(x), y) &= \frac{1}{n} \sum_{i=1}^n \mathcal{L}_i \\ \mathcal{L}_i &= - (y_i \cdot \log{h(x_i)} + (1 - y_i) \cdot \log{(1 - h(x_i))}) \\ \end{aligned} $$

交叉熵损失的特点:

  • (+) 求导简单,易于计算。

注意在 PyTorch 中除了交叉熵损失(见 torch.nn.CrossEntropyLoss)之外还有一个负对数似然损失(negative log likelihood,NLL,见 torch.nn.NLLLoss),他们的输出 shape 都是 $(n, c)$,区别在于

  • CrossEntropyLoss 的输入是 经过了 softmax 的预测结果,相当于 LogSoftmax 后面接着一个 NLLLoss
  • NLLLoss 的输入是 未经过 softmax 的预测结果。

参考