目录
详解pytorch中各种Loss functions
mse_loss
用途
用法
使用技巧
注意事项
参数
数学理论公式
代码演示
margin_ranking_loss
用途
用法
使用技巧
注意事项
参数
数学理论公式
代码演示
multilabel_margin_loss
用途
用法
使用技巧
注意事项
参数
数学理论公式
代码演示
multilabel_soft_margin_loss
用途
用法
使用技巧
注意事项
参数
数学理论公式
代码演示
multi_margin_loss
用途
用法
使用技巧
注意事项
参数
数学理论公式
代码演示
nll_loss
用途
用法
使用技巧
注意事项
参数
示例代码
huber_loss
用途
用法
使用技巧
注意事项
参数
数学理论公式
示例代码
smooth_l1_loss
用途
用法
使用技巧
注意事项
参数
数学理论公式
示例代码
soft_margin_loss
用途
用法
使用技巧
注意事项
参数
数学理论公式
示例代码
triplet_margin_loss
用途
用法
使用技巧
注意事项
参数
数学理论公式
示例代码
triplet_margin_with_distance_loss
用途
用法
使用技巧
注意事项
参数
示例代码
总结
torch.nn.functional.mse_loss
是 PyTorch 深度学习框架中的一个函数,用于计算均方误差(Mean Squared Error, MSE)。这是一个常用于回归问题的损失函数,它测量预测值和目标值之间的平均平方差异。
mse_loss
能有效地计算预测值与真实值之间的误差。torch.nn.functional.mse_loss(input, target, size_average=None, reduce=None, reduction='mean')
input
:模型预测的输出。target
:真实的目标值。size_average
, reduce
:已废弃的参数,不推荐使用。reduction
:指定损失的计算方式。可选值为 'none', 'mean'(默认), 'sum'。input
和 target
的数据规模相似,以避免数值不稳定。reduction
:根据需要选择 'mean'(计算平均损失)或 'sum'(计算总损失)。input
和 target
的形状相同。input
(Tensor):预测值。target
(Tensor):真实值。reduction
(str):指定损失的计算方式。MSE 计算公式为:
其中:
import torch
import torch.nn.functional as F
# 预测值和真实值
input = torch.randn(3, requires_grad=True)
target = torch.randn(3)
# 计算 MSE 损失
loss = F.mse_loss(input, target)
print(loss)
## 输出结果是一个 Tensor,代表计算出的 MSE 值。由于涉及随机数,每次运行结果可能不同。例如 tensor(1.2345, grad_fn=)
在 PyTorch 中,torch.nn.functional.margin_ranking_loss
函数用于计算边际排序损失(Margin Ranking Loss),这在处理排序和比较任务时特别有用,例如在推荐系统或相似性学习中。
torch.nn.functional.margin_ranking_loss(input1, input2, target, margin=0, reduction='mean')
input1
、input2
:需要比较的两组数据。target
:标签,通常是 +1 或 -1,表示期望的排序关系。margin
:边际值,设定数据对之间的最小差异。reduction
:指定损失计算的方式,可选 'mean'(平均,默认)或 'sum'(求和)。margin
值,以达到最佳效果。target
正确表示数据对的期望排序关系。input1
和 input2
形状相同。target
的取值应为 +1 或 -1。input1
, input2
(Tensor):比较的两组数据。target
(Tensor):表示数据对关系的标签。margin
(float):边际值。reduction
(str):损失计算方式。边际排序损失的计算公式:
loss(x, y, t) = max(0, -t ⋅ (x - y) + margin)
其中:
x
, y
分别是 input1
和 input2
。t
是 target
,表示期望的排序关系。margin
是边际值。import torch
import torch.nn.functional as F
# 输入数据
input1 = torch.tensor([1, 2, 3], dtype=torch.float32)
input2 = torch.tensor([2, 2, 1], dtype=torch.float32)
# 目标数据
target = torch.tensor([1, 1, -1], dtype=torch.float32)
# 计算 Margin Ranking Loss
loss = F.margin_ranking_loss(input1, input2, target, margin=0.1)
print(loss) # 例如:tensor(0.5667)
输出的结果是一个 Tensor 类型,代表计算出的 Margin Ranking Loss 值。数值如 tensor(0.5667)
是示例,实际输出会根据 input1
, input2
, target
的具体值而有所不同。
torch.nn.functional.multilabel_margin_loss
是 PyTorch 中的一个函数,专门用于处理多标签分类问题。在多标签分类中,每个实例可以同时属于多个类别。这种损失函数对于处理那些每个实例可以有多个正确标签的情况特别有用,例如在一个图像中同时标识多个对象。
torch.nn.functional.multilabel_margin_loss(input, target, reduction='mean')
input
:模型的预测输出,通常是未经 softmax 或 sigmoid 归一化的原始分数。target
:每个实例的真实标签索引,每个索引之后的标签被视为负标签。reduction
:指定损失计算的方式。可选 'mean'(默认,计算平均损失),'sum'(求和损失)或 'none'。target
使用正确的格式,即包含每个样本的标签索引。input
应为模型的原始输出,无需经过 softmax 或 sigmoid 函数。input
和 target
的维度匹配。target
中的索引应该是非负的,并且小于 input
的大小。input
(Tensor):模型预测的原始输出。target
(Tensor):实例的真实标签索引。reduction
(str):损失的计算方式。loss(input, target) = sum(max(0, 1 - (input[y] - input[x]))) / x.size(0)
其中:
input
是模型的原始输出。target
包含每个样本的正标签索引。x
和 y
是 target
中的标签索引。import torch
import torch.nn.functional as F
# 输入和目标数据
input = torch.randn(3, 5, requires_grad=True) # 3个样本,每个样本5个类别
target = torch.tensor([[3, 0, -1, -1, -1],
[1, 2, -1, -1, -1],
[1, -1, -1, -1, -1]]) # 真实标签索引
# 计算多标签边缘损失
loss = F.multilabel_margin_loss(input, target)
print(loss) # 例如:tensor(1.2345, grad_fn=)
输出结果是一个 Tensor 类型,代表计算出的多标签边缘损失值。例如 tensor(1.2345)
,具体数值将根据 input
和 target
的值而变化。
torch.nn.functional.multilabel_soft_margin_loss
是 PyTorch 框架中用于多标签分类问题的一个损失函数。这个函数特别适用于处理那些一个样本可能属于多个类别的情况,比如在一个图像中识别多个对象。
torch.nn.functional.multilabel_soft_margin_loss(input, target, weight=None, reduction='mean')
input
:模型的原始输出,通常是每个类别的分数。target
:真实标签,通常是二进制形式,1 表示标签存在,0 表示不存在。weight
:各类别的权重,用于处理类别不平衡问题。reduction
:指定损失计算的方式。可选 'mean'(默认,计算平均损失),'sum'(求和损失)或 'none'。target
使用的是二进制形式。weight
参数来调整这些类别的重要性。input
和 target
的维度相匹配。input
中的值不需要经过 sigmoid 函数转换,函数内部会处理。input
(Tensor):模型预测的原始输出。target
(Tensor):真实标签,二进制形式。weight
(Tensor,可选):类别的权重。reduction
(str):损失的计算方式。loss(input, target) = -sum(target * log(sigmoid(input)) + (1 - target) * log(1 - sigmoid(input))) / input.nelement()
其中:
input
是模型的原始输出。target
是二进制形式的真实标签。sigmoid
是激活函数,将输入映射到 (0, 1)。import torch
import torch.nn.functional as F
# 输入和目标数据
input = torch.randn(3, 5, requires_grad=True) # 3个样本,每个样本5个类别
target = torch.tensor([[1, 0, 1, 0, 1],
[0, 1, 0, 1, 0],
[1, 1, 1, 0, 0]], dtype=torch.float32) # 二进制形式的真实标签
# 计算多标签软边际损失
loss = F.multilabel_soft_margin_loss(input, target)
print(loss) # 例如:tensor(0.7890, grad_fn=)
输出结果是一个 Tensor 类型,代表计算出的多标签软边际损失值。例如 tensor(0.7890)
,具体数值将根据 input
和 target
的值而变化。
torch.nn.functional.multi_margin_loss
是 PyTorch 中用于分类任务的一个损失函数,特别适用于具有多个类别的情况。这个函数实现了多类别的边缘损失(multi-class margin-based loss),常用于处理分类问题中的类别间隔优化。
torch.nn.functional.multi_margin_loss(input, target, p=1, margin=1, weight=None, reduction='mean')
input
:模型的预测输出,通常是类别的原始分数。target
:包含每个样本的类别索引的真实标签。p
:用于计算损失的范数指数,默认为 1。margin
:边际值,指定类别间的间隔,默认为 1。weight
:各类别的权重,用于处理类别不平衡问题。reduction
:指定损失计算的方式。可选 'mean'(默认,计算平均损失),'sum'(求和损失)或 'none'。p
和 margin
:根据任务需求调整这些参数,以达到最佳效果。weight
参数调整它们的重要性。input
和 target
的维度匹配。target
的值应为类别索引,且在 0 到 C-1
的范围内,其中 C
是类别总数。input
(Tensor):模型预测的原始输出。target
(Tensor):真实的类别索引。p
(int):范数指数。margin
(float):边际值。weight
(Tensor,可选):类别的权重。reduction
(str):损失的计算方式。loss(x, y) = sum(max(0, margin - x[y] + x[j]))^p / x.size(0)
其中:
x
是模型的原始输出。y
是真实的类别索引。x[j]
是除了正确类别之外的其他类别的分数。p
是范数指数。margin
是边际值。import torch
import torch.nn.functional as F
# 输入和目标数据
input = torch.randn(3, 5, requires_grad=True) # 3个样本,每个样本5个类别
target = torch.tensor([1, 0, 4], dtype=torch.int64) # 类别索引
# 计算多边缘损失
loss = F.multi_margin_loss(input, target, p=1, margin=1)
print(loss) # 例如:tensor(0.8765, grad_fn=)
输出结果是一个 Tensor 类型,代表计算出的多边缘损失值。例如 tensor(0.8765)
,具体数值将根据 input
和 target
的值而变化。
torch.nn.functional.nll_loss
函数是 PyTorch 中用于计算负对数似然损失(Negative Log Likelihood Loss)的函数,常用于多分类问题,特别是与 log_softmax
函数结合使用时。
nll_loss
是一个常用的损失函数,尤其是与 softmax 激活函数结合使用。torch.nn.functional.nll_loss(input, target, weight=None, ignore_index=-100, reduction='mean')
input
:经过 log-softmax 处理的预测输出。target
:包含每个样本类别索引的真实标签。weight
:各类别的权重,可用于处理类别不平衡。ignore_index
:指定一个目标值,该值将被忽略并且不会对输入梯度产生贡献。reduction
:指定损失计算的方式,可选 'none'(无),'mean'(默认,平均),'sum'(求和)。input
是经过 log-softmax 函数的输出。weight
参数。input
和 target
的维度匹配。target
的每个值应在 0 到 C-1
范围内,其中 C
是类别总数。input
(Tensor):模型预测的对数概率。target
(Tensor):真实的类别索引。weight
(Tensor,可选):类别的权重。ignore_index
(int,可选):被忽略的目标值。reduction
(str,可选):损失的计算方式。import torch
import torch.nn.functional as F
# 输入和目标数据
input = torch.randn(3, 5, requires_grad=True) # N x C = 3 x 5
target = torch.tensor([1, 0, 4]) # 每个元素的值应在 0 到 C-1 的范围内
# 应用 log-softmax 和 NLL Loss
output = F.nll_loss(F.log_softmax(input, dim=1), target)
output.backward()
# 输出结果,例如:tensor(1.2345, grad_fn=)
print(output)
输出结果是一个 Tensor 类型,代表计算出的负对数似然损失值。具体数值将根据 input
和 target
的值而变化。例如,输出可能是 tensor(1.2345)
。
torch.nn.functional.huber_loss
,也称为 Huber Loss 或 Smooth L1 Loss,是 PyTorch 中用于回归任务的损失函数。这个函数结合了均方误差(MSE)和绝对误差(MAE),在处理异常值时比 MSE 更鲁棒。
torch.nn.functional.huber_loss(input, target, reduction='mean', delta=1.0)
input
:模型的预测输出。target
:真实的目标值。reduction
:指定损失计算的方式。可选 'mean'(默认,计算平均损失),'sum'(求和损失)或 'none'。delta
:决定误差使用平方项还是线性项的阈值。delta
值:根据任务需求调整 delta
,以决定对小误差和大误差的敏感程度。input
和 target
的维度匹配。input
(Tensor):模型预测的输出。target
(Tensor):真实的目标值。reduction
(str):损失的计算方式。delta
(float):误差阈值。HuberLoss(x, y) = {
0.5 * (x - y)^2, if |x - y| < delta
delta * (|x - y| - 0.5 * delta), otherwise
}
其中:
x
是模型的预测值。y
是真实值。delta
是阈值。import torch
import torch.nn.functional as F
# 输入和目标数据
input = torch.tensor([1.5, 2.5, 3.5], requires_grad=True)
target = torch.tensor([1.0, 2.0, 3.0])
# 计算 Huber Loss
loss = F.huber_loss(input, target, reduction='mean', delta=1.0)
print(loss) # 输出示例:tensor(0.1250, grad_fn=)
输出结果是一个 Tensor 类型,代表计算出的 Huber Loss 值。例如 tensor(0.1250)
,具体数值将根据 input
和 target
的值而变化。
torch.nn.functional.smooth_l1_loss
,在 PyTorch 中也被称为 Smooth L1 Loss,是一种结合了 L1 损失(绝对误差)和 L2 损失(均方误差)的损失函数。这种损失函数在机器学习和深度学习的回归任务中广泛使用,特别是在计算机视觉领域,如对象检测。
torch.nn.functional.smooth_l1_loss(input, target, reduction='mean', beta=1.0)
input
:模型的预测输出。target
:真实的目标值。reduction
:指定损失计算的方式。可选 'mean'(默认,计算平均损失),'sum'(求和损失)或 'none'。beta
:决定误差使用平方项还是线性项的阈值。beta
值:根据特定任务调整 beta
,以平衡 L1 和 L2 损失之间的权重。input
和 target
的维度匹配。input
(Tensor):模型预测的输出。target
(Tensor):真实的目标值。reduction
(str):损失的计算方式。beta
(float):误差阈值。SmoothL1Loss(x, y) = {
0.5 * (x - y)^2 / beta, if |x - y| < beta
|x - y| - 0.5 * beta, otherwise
}
其中:
x
是模型的预测值。y
是真实值。beta
是阈值。import torch
import torch.nn.functional as F
# 输入和目标数据
input = torch.tensor([1.5, 2.5, 3.5], requires_grad=True)
target = torch.tensor([1.0, 2.0, 3.0])
# 计算 Smooth L1 Loss
loss = F.smooth_l1_loss(input, target, reduction='mean', beta=1.0)
print(loss) # 输出示例:tensor(0.0833, grad_fn=)
输出结果是一个 Tensor 类型,代表计算出的 Smooth L1 Loss 值。例如 tensor(0.0833)
,具体数值将根据 input
和 target
的值而变化。
torch.nn.functional.soft_margin_loss
是 PyTorch 中的一个函数,用于计算软边际损失(Soft Margin Loss)。这个损失函数是一种用于二分类任务的损失函数,特别适用于处理带有标签 +1 或 -1 的数据。
torch.nn.functional.soft_margin_loss(input, target, reduction='mean')
input
:模型的原始输出,不需要经过 sigmoid 或 softmax 函数。target
:真实标签,其值应为 +1 或 -1。reduction
:指定损失计算的方式。可选 'mean'(默认,计算平均损失),'sum'(求和损失)或 'none'。target
使用正确的格式,即包含值 +1 或 -1。input
应为模型的原始输出,无需经过额外的激活函数处理。input
和 target
的维度匹配。input
(Tensor):模型预测的原始输出。target
(Tensor):真实的目标标签。reduction
(str):损失的计算方式。SoftMarginLoss(x, y) = sum(log(1 + exp(-y * x))) / x.nelement()
其中:
x
是模型的原始输出。y
是真实标签,取值为 +1 或 -1。import torch
import torch.nn.functional as F
# 输入和目标数据
input = torch.randn(3, requires_grad=True) # 3个样本
target = torch.tensor([1, -1, 1], dtype=torch.float32) # 真实标签为 +1 或 -1
# 计算软边际损失
loss = F.soft_margin_loss(input, target, reduction='mean')
print(loss) # 输出示例:tensor(0.8765, grad_fn=)
输出结果是一个 Tensor 类型,代表计算出的软边际损失值。例如 tensor(0.8765)
,具体数值将根据 input
和 target
的值而变化。
torch.nn.functional.triplet_margin_loss
是 PyTorch 中用于计算三元组边际损失(Triplet Margin Loss)的函数。这种损失函数广泛用于训练基于距离的模型,特别是在面部识别、图像检索和类似任务中,它通过比较一个锚点(anchor)与正样本(positive)和负样本(negative)之间的相似度来工作。
torch.nn.functional.triplet_margin_loss(anchor, positive, negative, margin=1.0, p=2, eps=1e-06, swap=False, reduction='mean')
anchor
:参考样本。positive
:与 anchor
相似的样本。negative
:与 anchor
不相似的样本。margin
:正负样本之间的目标边际。p
:用于计算距离的范数指数。eps
:为了数值稳定性加入的小常数。swap
:如果设置为 True
,会在损失计算中使用双边距离。reduction
:指定损失计算的方式。可选 'mean'(默认,计算平均损失),'sum'(求和损失)或 'none'。margin
:调整 margin
值以控制正负样本之间的距离。swap
选项:在某些情况下,使用 swap
选项可以改善模型的性能。anchor
、positive
和 negative
的维度匹配。anchor
(Tensor):参考样本。positive
(Tensor):相似样本。negative
(Tensor):不相似样本。margin
(float):边际值。p
(int):范数指数。eps
(float):数值稳定性常数。swap
(bool):是否使用双边距离。reduction
(str):损失的计算方式。TripletMarginLoss = max(d(anchor, positive) - d(anchor, negative) + margin, 0)
其中 d(x, y)
是 x
和 y
之间的距离,可以是 L2 范数或其他范数。
import torch
import torch.nn.functional as F
# 输入数据
anchor = torch.randn(100, 128, requires_grad=True)
positive = torch.randn(100, 128)
negative = torch.randn(100, 128)
# 计算三元组边际损失
loss = F.triplet_margin_loss(anchor, positive, negative, margin=1.0)
print(loss) # 输出示例:tensor(0.1234)
torch.nn.functional.triplet_margin_with_distance_loss
是 PyTorch 中用于计算三元组边际损失的一个变体,允许用户自定义距离函数。这个函数在训练基于距离的模型时非常有用,特别是在需要度量特定类型相似性的场景,如面部识别、图像检索等。
torch.nn.functional.triplet_margin_with_distance_loss(anchor, positive, negative, distance_function=None, margin=1.0, swap=False, reduction='mean')
anchor
:参考样本。positive
:与 anchor
相似的样本。negative
:与 anchor
不相似的样本。distance_function
:自定义的距离函数。margin
:正负样本之间的目标边际。swap
:如果设置为 True
,会在损失计算中使用双边距离。reduction
:指定损失计算的方式。可选 'mean'(默认,计算平均损失),'sum'(求和损失)或 'none'。margin
:根据任务需求调整 margin
,以控制正负样本之间的距离。anchor
、positive
和 negative
的维度匹配。distance_function
时,确保其接受两个输入并返回一个距离值。anchor
(Tensor):参考样本。positive
(Tensor):相似样本。negative
(Tensor):不相似样本。distance_function
(函数,可选):自定义的距离函数。margin
(float):边际值。swap
(bool):是否使用双边距离。reduction
(str):损失的计算方式。import torch
import torch.nn.functional as F
# 输入数据
anchor = torch.randn(100, 128, requires_grad=True)
positive = torch.randn(100, 128)
negative = torch.randn(100, 128)
# 自定义距离函数
def distance_function(x, y):
return torch.norm(x - y, p=2)
# 计算三元组边际损失
loss = F.triplet_margin_with_distance_loss(anchor, positive, negative, distance_function=distance_function, margin=1.0)
print(loss) # 输出示例:tensor(0.5678, grad_fn=)
输出结果是一个 Tensor 类型,代表计算出的三元组边际损失值。例如 tensor(0.5678)
,具体数值将根据 anchor
、positive
和 negative
的值及所用距离函数而变化。
本文提供了对 PyTorch 中多种损失函数(Loss functions)的详细解析,包括其用途、使用方法、重要注意事项和数学理论公式。这些损失函数涵盖了从回归问题(如 mse_loss
和 huber_loss
),多标签分类(如 multilabel_margin_loss
和 multilabel_soft_margin_loss
),到复杂的相似度学习(如 triplet_margin_loss
和 triplet_margin_with_distance_loss
)等多种机器学习任务。每种损失函数都有其特定的应用场景和优化目标,例如 mse_loss
用于计算预测值和真实值之间的均方误差,适合于回归任务;而 triplet_margin_loss
则用于学习数据点之间的相似度,常用于特征嵌入和相似度学习。了解这些损失函数的细节,有助于在实际应用中选择合适的函数以优化模型性能,并处理特定的数据分布和任务要求。