????????Hinge Loss(合页损失)通常用于支持向量机(Support Vector Machine,SVM)等模型中,特别是在二分类问题中。它的目标是使正确类别的分数与错误类别的最高分之间的差异达到一个固定的边界,从而促使模型学会产生更大的间隔。
criterion = nn.HingeEmbeddingLoss(margin=1.0, size_average=None, reduce=None)
margin(边界):
- 默认值:
margin = 1.0
- 此参数表示正确类别的分数与错误类别的最高分之间的边界。Hinge Loss 的损失函数是在分数小于
margin
时线性增加的,即只有当分数小于margin
时才会产生损失。size_average 和 reduce(大小平均和减小):
- 默认值:
size_average = None, reduce = None
size_average
和reduce
这两个参数用于控制损失的计算方式。如果size_average
设置为True
,则计算的是平均损失;如果设置为False
,则计算的是总损失。reduce
控制是否对每个样本的损失进行降维操作,可选的值包括'none'
、'mean'
和'sum'
。
其中,是样本数量,?是真实标签(+1 或 -1,二分类的情况), 是模型的预测分数(通常都是软结果,例如分数为0.58,而不是0,1这种)。
????????损失函数的含义是,如果预测正确类别的分数小于1,就会有一个损失,否则损失为零。?
? ? ? ? 当??,合页损失为?
? ? ? ? 当??,合页损失为 0
? ? ? ? 变种用法:
????????实际应用中,一方面很多时候我们的y的值域并不是[-1,1],比如我们可能更希望y更接近于一个概率,即其值域最好是[0,1]。另一方面,很多时候我们希望训练的是两个样本之间的相似关系,而非样本的整体分类,所以很多时候我们会用下面的公式:
其中,?是正样本的得分,?是负样本的得分,?是 margin(自定义)
????????即我们希望正样本分数越高越好,负样本分数越低越好,但二者得分之差最多到m就足够了,差距增大并不会有任何奖励。
? ? ? ? 上图是合页损失(Hinge Loss)的图像。在图中,橙色线表示真实标签??为 +1 的损失,绿色线表示真实标签 ?为 -1 的损失。当预测值与真实标签一致并且预测值的绝对值较大时,损失趋于零;否则,损失随着预测值与真实标签的差距增大而增大。这种损失函数鼓励模型不仅正确分类,而且对正确分类的信心足够大。 ?
可能看到这里,还有很多同学不理解合页损失如何使正确类别的分数与错误类别的最高分之间的差异达到一个固定的边界,或者为什么对正确分类的信心足够大,请看下面详细分析:
????????当真实标签??为 +1 正类时,观察上图的橙色线段,模型输出负值(横坐标代表Predicted value)会有较大的惩罚,当模型输出为正值且在(0,1)区间时还会有一个较小的惩罚。
? ? ? ? 观察上图,所以合页损失不仅惩罚预测错的,并且对于预测对了但是置信度不高的也会给一个惩罚,只有置信度高(Predicted value > 1)的才会有零损失。使用合页损失直觉上理解是要找到一个决策边界,使得所有数据点被这个边界正确地、高置信地被分类。
示例1:我们使用?Hinge Loss
作为损失函数:
import torch
import torch.nn as nn
import torch.optim as optim
# 示例数据
torch.manual_seed(42)
num_samples = 100
y_true = torch.randint(0, 2, (num_samples,)) * 2 - 1 # +1 或 -1 的标签
y_pred_scores = torch.randn(num_samples) # 未归一化的预测分数
# 定义 Hinge Loss 函数
criterion = nn.HingeEmbeddingLoss()
# 计算损失
loss = criterion(y_pred_scores, y_true.float())
print(f'Hinge Loss: {loss.item()}')
示例2:自定义 HingeEmbeddingLoss 参数
import torch
import torch.nn as nn
# 示例数据
y_true = torch.tensor([-1, 1, -1], dtype=torch.float32)
y_pred_scores = torch.tensor([0.8, -0.5, 2.0], dtype=torch.float32)
# 定义 Hinge Loss 函数,设置 margin 和 reduce 参数
criterion = nn.HingeEmbeddingLoss(margin=1.0, size_average=None, reduce=None)
# 计算损失
loss = criterion(y_pred_scores, y_true)
print(f'Hinge Loss: {loss.item()}')
在这个示例中,margin
被设置为默认值1.0,而 size_average
和 reduce
参数保持为默认值。?
Hinge Loss-合页损失函数 - 简书 (jianshu.com)?