【损失函数】Hinge Loss 合页损失

1、介绍

        Hinge Loss(合页损失)通常用于支持向量机(Support Vector Machine,SVM)等模型中,特别是在二分类问题中。它的目标是使正确类别的分数与错误类别的最高分之间的差异达到一个固定的边界,从而促使模型学会产生更大的间隔。

criterion = nn.HingeEmbeddingLoss(margin=1.0, size_average=None, reduce=None)

2、参数 

  1. margin(边界):

    • 默认值:margin = 1.0
    • 此参数表示正确类别的分数与错误类别的最高分之间的边界。Hinge Loss 的损失函数是在分数小于 margin 时线性增加的,即只有当分数小于 margin 时才会产生损失。
  2. size_average 和 reduce(大小平均和减小):

    • 默认值:size_average = None, reduce = None
    • size_averagereduce 这两个参数用于控制损失的计算方式。如果 size_average 设置为 True,则计算的是平均损失;如果设置为 False,则计算的是总损失。reduce 控制是否对每个样本的损失进行降维操作,可选的值包括 'none''mean''sum'

3、公式

$Hinge Loss =\frac{1}{N} \sum_{i=1}^N \max \left(0,1-y_i \cdot \hat{y}_i\right)$

其中,{N}是样本数量,y_i 是真实标签(+1 或 -1,二分类的情况),\hat{y}_i 是模型的预测分数(通常都是软结果,例如分数为0.58,而不是0,1这种)。

        损失函数的含义是,如果预测正确类别的分数小于1,就会有一个损失,否则损失为零。 

        当 y_i \cdot \hat{y}_i < 1 ,合页损失为 1-y_i \cdot \hat{y}_i

        当 y_i \cdot \hat{y}_i \geq 1 ,合页损失为 0

        变种用法:

        实际应用中,一方面很多时候我们的y的值域并不是[-1,1],比如我们可能更希望y更接近于一个概率,即其值域最好是[0,1]。另一方面,很多时候我们希望训练的是两个样本之间的相似关系,而非样本的整体分类,所以很多时候我们会用下面的公式:

$Hinge Loss =\frac{1}{N} \sum_{i=1}^N \max \left(0,m-y_i + \hat{y}_i\right)$

其中,y_i 是正样本的得分,\hat{y}_i 是负样本的得分,{m} 是 margin(自定义)

        即我们希望正样本分数越高越好,负样本分数越低越好,但二者得分之差最多到m就足够了,差距增大并不会有任何奖励。

4、图像

        上图是合页损失(Hinge Loss)的图像。在图中,橙色线表示真实标签 y_i 为 +1 的损失,绿色线表示真实标签 y_i 为 -1 的损失。当预测值与真实标签一致并且预测值的绝对值较大时,损失趋于零;否则,损失随着预测值与真实标签的差距增大而增大。这种损失函数鼓励模型不仅正确分类,而且对正确分类的信心足够大。 ​

可能看到这里,还有很多同学不理解合页损失如何使正确类别的分数与错误类别的最高分之间的差异达到一个固定的边界,或者为什么对正确分类的信心足够大,请看下面详细分析:

        观察上图的橙色线段,代表真实标签 y_i 为 +1 正类时,模型输出负值(即横坐标Predicted value < 0)会有较大的惩罚,当模型输出为正值(即横坐标Predicted value > 0)且在(0,1)区间时还会有一个较小的惩罚。

        观察上图,所以合页损失不仅惩罚预测错的,并且对于预测对了但是置信度不高的也会给一个惩罚,只有置信度高(Predicted value > 1)的才会有零损失。使用合页损失直觉上理解是要找到一个决策边界,使得所有数据点被这个边界正确地、高置信地被分类。

5、实例

示例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_averagereduce 参数保持为默认值。 

6、参考

Hinge Loss-合页损失函数 - 简书 (jianshu.com)

机器学习 [合页损失函数 Hinge Loss]_合页loss-CSDN博客

深度学习常用损失函数总览:基本形式、原理、特点 (qq.com)

  • 19
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值