损失函数

基于距离度量的损失函数

平均绝对误差(MAE)/ L1 损失函数

$ MAE = \frac{1}{n}\sum_{i=1}^n|Y_i - f(x_i)| $

均方误差(MSE)

$ L(Y|f(x)) = \frac{1}{n} \sum_{i=1}^n(Y_i - f(x_i))^2 $

L2 损失函数

$ L(Y|f(x)) = \sqrt{\frac{1}{n} \sum_{i=1}^n(Y_i - f(x_i))^2} $

huber损失函数

huber损失是平方损失和绝对损失的综合,它克服了平方损失和绝对损失的缺点,不仅使损失函数具有连续的导数,而且利用MSE梯度随误差减小的特性,可取得更精确的最小值。尽管huber损失对异常点具有更好的鲁棒性,但是,它不仅引入了额外的参数,而且选择合适的参数比较困难,这也增加了训练和调试的工作量。

$ L(Y \mid f(x)) = \begin{cases} \frac{1}{2}(Y - f(x))^2 & \text{if } \lvert Y - f(x) \rvert \leq \delta, \ \delta \lvert Y - f(x) \rvert - \frac{1}{2} \delta^2 & \text{if } \lvert Y - f(x) \rvert > \delta. \end{cases} $

基于概率分布度量的损失函数

KL 散度

$ L(Y \mid f(x)) = \sum_{i=1}^n Y_i \times \log\left(\frac{Y_i}{f(x_i)}\right) $

是一种非对称度量方法,常用于度量两个概率分布之间的距离。KL散度也可以衡量两个随机分布之间的距离,两个随机分布的相似度越高的,它们的KL散度越小,当两个随机分布的差别增大时,它们的KL散度也会增大,因此KL散度可以用于比较文本标签或图像的相似性。

KL散度非负性证明

交叉熵

$ L(Y \mid f(x)) = -\sum_{i=1}^N Y_i \log f(x_i) $

交叉熵损失函数刻画了实际输出概率与期望输出概率之间的相似度,也就是交叉熵的值越小,两个概率分布就越接近,特别是在正负样本不均衡的分类问题中,常用交叉熵作为损失函数。目前,交叉熵损失函数是卷积神经网络中最常使用的分类损失函数,它可以有效避免梯度消散。在二分类情况下也叫做对数损失函数。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
def CrossEntropy_loss(y_true:list,y_pred:list):
    """
    y_true,y_pred,分别是两个概率分布
    比如:px=[0.1,0.2,0.8]
          py=[0.3,0.3,0.4]
    """
    assert len(y_true)==len(y_pred)
    loss=0
    for y,fx in zip(y_true,y_pred):
        loss+=-y * np.log(fx)
    return loss
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import torch
import torch.nn as nn

# 创建损失函数对象
loss_fn = nn.CrossEntropyLoss()

# 预测值(模型输出)
predictions = torch.tensor([[0.5, 0.2, 0.3], [0.1, 0.8, 0.1]])
# 真实标签
labels = torch.tensor([0, 2])

# 计算交叉熵损失
loss = loss_fn(predictions, labels)

# 打印交叉熵损失
print(loss.item())

Focal Loss

$ FE = \begin{cases} -\alpha (1-p)^\gamma \log(p) & y = 1 \ -(1-\alpha) p^\gamma \log(1-p) & y = 0 \end{cases} $

focal loss的引入主要是为了解决难易样本不均衡的问题。通过 alpha ([0, 1]) 可以抑制正负样本的数量失衡,gama ([0, 5])可以控制简单/难区分样本数量失衡。gama 为 0 时则退化为最初的交叉熵

p 越接近 y,说明预测的难度越低,指数运算后降低其损失大小

损失函数(Loss Function)