常用损失函数总结(L1 loss、L2 loss、Negative Log-Likelihood loss、Cross-Entropy loss、Hinge Embedding loss、Margi)

常用损失函数总结(L1 loss、L2 loss、Negative Log-Likelihood loss、Cross-Entropy loss、Hinge Embedding loss、Margi)

损失函数分类与应用场景

损失函数可以分为三类**:回归损失函数(Regression loss)、分类损失函数(Classification loss)和排序损失函数(Ranking loss)。**

应用场景:

  • 回归损失:用于预测连续的值。如预测房价、年龄等。
  • 分类损失:用于预测离散的值。如图像分类,语义分割等。
  • 排序损失:用于预测输入数据之间的相对距离。如行人重识别

L1 loss

也称Mean Absolute Error,简称MAE,计算实际值和预测值之间的绝对差之和的平均值。

表达式如下:

Loss( pred , y ) = | y - pred |

y表示标签,pred表示预测值。

应用场合:

  • 回归问题。

根据损失函数的表达式很容易了解它的特性:

  1. 当目标变量的分布具有异常值时,即与平均值相差很大的值,它被认为对异常值具有很好的鲁棒行。
input = torch.randn(3, 5, requires_grad=True)
target = torch.randn(3, 5)
mae_loss = torch.nn.L1Loss()
output = mae_loss(input, target)

L2 loss

也称为Mean Squared Error,简称MSE,计算实际值和预测值之间的平方差的平均值。

表达式如下:

在这里插入图片描述
应用场合:

  • 对大部分回归问题,pytorch默认使用L2,即MSE。

使用平方意味着当预测值离目标值更远时在平方后具有更大的惩罚,预测值离目标值更近时在平方后惩罚更小,因此,当异常值与样本平均值相差格外大时,模型会因为惩罚更大而开始偏离,相比之下,L1对异常值的鲁棒性更好。

使用代码

input = torch.randn(3, 5, requires_grad=True)
target = torch.randn(3, 5)
mse_loss = torch.nn.MSELoss()
output = mse_loss(input, target)

Negative Log-Likelihood

简称NLL。表达式如下:

loss( pred, y) = - (log pred)

应用场景:多分类问题。

注:NLL要求网络最后一层使用softmax作为激活函数。通过softmax将输出值映射为每个类别的概率值。

根据表达式,它的特性是惩罚预测准确而预测概率不高的情况。

NLL 使用负号,因为概率(或似然)在 0 和 1 之间变化,并且此范围内的值的对数为负。最后,损失值变为正值。

在 NLL 中,最小化损失函数有助于获得更好的输出。从近似最大似然估计 (MLE) 中检索负对数似然。这意味着尝试最大化模型的对数似然,从而最小化 NLL。

使用代码:

# size of input (N x C) is = 3 x 5
input = torch.randn(3, 5, requires_grad=True)
# every element in target should have 0 <= value < C
target = torch.tensor([1, 0, 4])

m = nn.LogSoftmax(dim=1)
nll_loss = torch.nn.NLLLoss()
output = nll_loss(m(input), target)

Cross-Entropy

此损失函数计算提供的一组出现次数或随机变量的两个概率分布之间的差异。它用于计算预测值与实际值之间的平均差异的分数。

表达式:
在这里插入图片描述
应用场景:

  • 二分类及多分类。

特性:

  1. 负对数似然损失不对预测置信度惩罚,与之不同的是,交叉熵惩罚不正确但可信的预测,以及正确但不太可信的预测。
  2. 交叉熵函数有很多种变体,其中最常见的类型是Binary Cross-Entropy (BCE)。BCE Loss
    主要用于二分类模型;也就是说,模型只有 2 个类。

使用代码

input = torch.randn(3, 5, requires_grad=True)
target = torch.empty(3, dtype=torch.long).random_(5)

cross_entropy_loss = torch.nn.CrossEntropyLoss()
output = cross_entropy_loss(input, target)

Hinge Embedding

表达式:

loss(pred, y) = max(0, 1 - y * pred )

其中y为1或-1。

应用场景:

  • 分类问题,特别是在确定两个输入是否不同或相似时。
  • 学习非线性嵌入或半监督学习任务。

使用示例:

input = torch.randn(3, 5, requires_grad=True)
target = torch.randn(3, 5)
hinge_loss = torch.nn.HingeEmbeddingLoss()
output = hinge_loss(input, target)

Margin Ranking Loss

Margin Ranking Loss 计算一个标准来预测输入之间的相对距离。这与其他损失函数(如 MSE 或交叉熵)不同,后者学习直接从给定的输入集进行预测。

表达式:

loss(pred, y) = max(0, -y*(pred1 - pred2) + margin)

标签张量 y(包含 1 或 -1)。

当 y == 1 时,第一个输入将被假定为更大的值。它将排名高于第二个输入。如果 y == -1,则第二个输入将排名更高。

应用场景:

  • 排名问题

使用示例:

input_one = torch.randn(3, requires_grad=True)
input_two = torch.randn(3, requires_grad=True)
target = torch.randn(3).sign()

ranking_loss = torch.nn.MarginRankingLoss()
output = ranking_loss(input_one, input_two, target)

Triplet Margin Loss

计算三元组的损失。

表达式:

Loss (a, p, n) = max{0, d(ai, pi) - d(ai, ni) + margin}

三元组由a (anchor),p (正样本) 和 n (负样本)组成.

应用场景:

  • 确定样本之间的相对相似性
  • 用于基于内容的检索问题

使用示例:

anchor = torch.randn(100, 128, requires_grad=True)
positive = torch.randn(100, 128, requires_grad=True)
negative = torch.randn(100, 128, requires_grad=True)

triplet_margin_loss = torch.nn.TripletMarginLoss(margin=1.0, p=2)
output = triplet_margin_loss(anchor, positive, negative)

KL Divergence Loss

计算两个概率分布之间的差异。

表达式:

loss (pred, y) = y*( log y - pred )

输出表示两个概率分布的接近程度。如果预测的概率分布与真实的概率分布相差很远,就会导致很大的损失。如果 KL Divergence 的值为零,则表示概率分布相同。

KL Divergence 与交叉熵损失的关键区别在于它们如何处理预测概率和实际概率。交叉熵根据预测的置信度惩罚模型,而 KL Divergence 则没有。KL Divergence 仅评估概率分布预测与ground truth分布的不同之处。

应用场景:

  • 逼近复杂函数
  • 多类分类任务
  • 确保预测的分布与训练数据的分布相似

代码示例:

input = torch.randn(2, 3, requires_grad=True)
target = torch.randn(2, 3)

kl_loss = torch.nn.KLDivLoss(reduction = 'batchmean')
output = kl_loss(input, target)
### 交叉熵损失函数的具体计算公式 交叉熵损失函数Cross-Entropy Loss)是一种广泛应用于分类问题中的损失函数,尤其在神经网络模型中用于衡量预测概率分布与真实标签之间的差异。其核心思想来源于信息论中的交叉熵概念。 对于二分类问题,假设样本的真实标签为 \( y \in \{0, 1\} \),而模型的预测值为 \( p(y=1|x) = \hat{y} \),则单个样本的交叉熵损失可以表示为: \[ L_{CE} = -[y \log(\hat{y}) + (1-y)\log(1-\hat{y})] \tag{1}[^1] \] 其中: - \( y \) 是真实的类别标签; - \( \hat{y} \) 是模型预测的概率值; - \( \log() \) 表示自然对数。 当扩展到多分类问题时,设共有 \( K \) 类,第 \( i \) 个样本属于类别的真实标签向量为 \( y_i \) (one-hot 编码形式),模型对该样本的预测概率分布为 \( \hat{y}_i \),那么该样本的交叉熵损失可定义为: \[ L_{CE}(y_i, \hat{y}_i) = -\sum_{k=1}^{K} y_{ik} \log (\hat{y}_{ik}) \tag{2} \] 这里: - \( y_{ik} \) 是 one-hot 向量中的元素,取值为 0 或 1- \( \hat{y}_{ik} \) 是模型预测的第 \( k \) 类的概率。 #### 推导过程 交叉熵损失函数可以从最大似然估计的角度推导而来。假设有训练数据集 \( D = \{(x_1, y_1), (x_2, y_2), ..., (x_n, y_n)\} \),目标是最小化负对数似然(Negative Log-Likelihood, NLL)。对于给定参数 \( \theta \),模型输出的概率分布记作 \( P_\theta(y | x) \),最大化似然函数等价于最小化如下表达式: \[ J(\theta) = -\frac{1}{N}\sum_{i=1}^N \log(P_\theta(y_i | x_i)) \tag{3}[^2] \] 如果采用 softmax 函数作为最后一层激活函数,则有: \[ P_\theta(y=k | x) = \frac{\exp(z_k)}{\sum_{j=1}^K \exp(z_j)} \tag{4}[^3] \] 其中 \( z_k \) 是未经过 softmax 转换前的原始得分(logits)。将上述公式代入并展开即可得到最终的交叉熵损失形式。 ```python import torch import torch.nn.functional as F # 假设 logits labels logits = torch.tensor([[2.0, 1.0, 0.1], [0.5, 2.5, 0.3]]) labels = torch.tensor([0, 1]) # 计算交叉熵损失 loss = F.cross_entropy(logits, labels) print(loss.item()) # 输出结果应接近理论值 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值