Loss Function view---关于损失函数的介绍

本文介绍了损失函数(Loss Function)的基本概念及其在机器学习中的应用。损失函数用于量化预测与实际值之间的偏差,是评估和优化模型性能的关键。文章详细探讨了几种常用的损失函数,包括Gold Standard、Hinge Loss、Log Loss、Square Loss和Boosting Loss,并对比了它们的效果。

一、Loss Function

什么是Loss Function?wiki上有一句解释我觉得很到位,引用一下:The loss function quantifies the amount by which the prediction deviates from the actual values。Loss Function中文损失函数,适用于用于统计,经济,机器学习等领域,虽外表形式不一,但其本质作用应是唯一的,即用于衡量最优的策略。本章只从机器学习(ML)领域来对其进行阐述,机器学习其实是个不停的模拟现实的过程,比如无人驾驶车,语音识别,流感预测,天气预报,经济周期行为等众多领域,是互联网发展过程中“科学家”(暂且这么称呼吧)对于人类文明进步的另一个贡献,其本质就是要建立一个数学模型用于模拟现实,越接近真实越好,那么转化为数学语言即LF越小越好,因为LF值代表着现实与学习预测的差距,这个不停的缩小LF值的过程就称为优化,如果理解这些的话,就不难理解优化问题对于ML来说的重要性了,如水之于鱼,魂之于人!


二、几种Loss Function概述

如上一节所述,LF的概念来源于机器学习,同时我们也知道机器学习的应用范围相当广泛,几乎可以涵盖整个社会领域,那么自然不同的领域多少会有不同的做法,这里介绍在一般的机器学习算法中常见的几种,具有概括性

2.1 一般形式

J(w)=iL(mi(w))+λR(w)

LF分为两部分:L+R,L表示loss term,其中mi(w)=y(i)wTxiy(i){1,1},w表示学习出来的权重,该公式的作用很明显了,用来收集现实与学习结果的差距,是LF的核心部分,LF的不同大部分也是指的loss term的不同;R表示范式,范式存在的意思是进行约束,以防止优化过偏。

2.2 一般的loss term有5种,分别用于5种常见的机器学习算法

Gold Standard(标准式)于理想sample,这种一般很少有实践场景,这个方法的作用更多的是用来衡量其他LF的效用;Hinge于soft-margin svm算法;log于LR算法(Logistric Regression);squared loss于线性回归(Liner Regression)和Boosting。

1)Gold Standard loss,一般我们称这个LF为L01,从公式中可以看出该公式的主要职责是在统计多少个错误的case,很明显现实数据不允许如此简单的统计方式


从公式我们可以很清楚的看出,当m<0的时候L=1,m<0说明预测失败,那么Loss则加1,这样将错误累加上去,就是Gold Standard loss的核心思想。

2)hinge loss,常用于“maximum-margin”的算法,公式如下

l(y)=max(0,1mi(w))

这个公式也很好理解,其中mi(w)在前面介绍过,表示样本i在模型下的预测值的样本i的类标记{-1,1}的乘积,这个乘积可以用来检验预测与真实结果是否一致来表示分类是否正确,当乘积大于0时表示分类正确,反之亦然。

3) log loss(一般又称为基于最大似然的负log loss)

likelihood=

l(y)=likelihood

其中 是log函数

最大似然思想指的是使得某种情况发生的概念最大的思想,根据LR的思想(参考这篇文章logistic回归深入篇(1)),我们知道g(w)对应的simod图,其将实域上的值映射到区间{0,1},因此我们可以把g(w)看作事件A发生的概率,那么1-g(w)可以看作事件A不发生的概率,那么公式likelihood表达的含义就很明显了,y也是一个概率值,可以看做是对事件A与A逆的分量配额,当然我们的期望是A发生的可能越大越好,A逆发生的可能越小越好!因此likelihood是一个max的过程,而loss是一个min的过程,因此log loss是负的likelihood。

4)square loss

这个loss很好理解,就是平方差,loss 一般也成为最小二乘法

5)boosting loss

这个loss主要是基于指数函数的loss function。

三、几种Loss Function的效果对比

上图是多LF的效果对比图,其中蓝色的是Gold loss,可以看作水平基线,其他的loss的效果可以基于与它的比较结果,首先,红色的是Hinge loss,黄色的是log loss,绿色的是boosting loss,黑色的是square loss,从上图可以看出以下结论: Hinge,log对于噪音函数不敏感,因为当m<0时,他们的反应不大,而黑线与绿线可能更爱憎分明,尤其是黑线,因此,在很多线性分类问题中,square loss也是很常见的LF之一。



在机器学习和深度学习中,细粒度损失函数(fine-grained loss function)通常用于解决细粒度分类问题,这类问题要求模型能够区分视觉上非常相似但类别不同的对象。例如,在细粒度图像分类任务中,模型需要区分不同种类的鸟类或车辆,这些类别在外观上可能非常接近,因此需要设计专门的损失函数来提升模型的判别能力。 ### 细粒度损失函数的设计目标 细粒度损失函数的设计旨在提升模型对细微差异的敏感性,通常通过引入额外的约束或结构来增强特征表示。例如,一些方法利用了类间层次结构信息,将粗类标签和细类标签结合使用,以提高分类的准确性。这种监督学习框架可以利用类层次结构中的语义关系,使得模型在学习过程中不仅关注细类之间的差异,也考虑粗类之间的宏观区别[^4]。 ### 常见的细粒度损失函数实现方法 #### 1. 分层损失函数(Hierarchical Loss Function) 在细粒度分类任务中,可以设计一种分层损失函数,同时优化粗类和细类的预测结果。假设每个样本都有一个细类标签 $ y_i \in Y $ 和一个粗类标签 $ z_i \in Z $,则损失函数可以定义为两部分的加权和: $$ \mathcal{L} = \alpha \cdot \mathcal{L}_{\text{fine}}(y_i, \hat{y}_i) + (1 - \alpha) \cdot \mathcal{L}_{\text{coarse}}(z_i, \hat{z}_i) $$ 其中: - $ \mathcal{L}_{\text{fine}} $ 是针对细类的交叉熵损失; - $ \mathcal{L}_{\text{coarse}} $ 是针对粗类的交叉熵损失; - $ \alpha \in [0, 1] $ 是一个超参数,用于平衡两者的权重。 这种损失函数的设计有助于模型在学习细类判别能力的同时,保持对粗类结构的理解。 #### 2. 对比损失(Contrastive Loss) 对比损失是一种常用于度量学习的损失函数,它鼓励属于同一类别的样本在特征空间中靠近,而不同类别的样本则被拉开。对于细粒度分类任务,可以通过对比损失来增强模型对细粒度差异的捕捉能力: $$ \mathcal{L}_{\text{contrastive}} = \frac{1}{2N} \sum_{i=1}^{N} \left[ y_i \cdot d_i^2 + (1 - y_i) \cdot \max(m - d_i, 0)^2 \right] $$ 其中: - $ d_i $ 是两个样本之间的欧氏距离; - $ y_i $ 是二值标签(1 表示同类,0 表示异类); - $ m $ 是一个预设的边界值(margin)。 这种方法可以用于细粒度图像检索或分类任务中,帮助模型学习更具判别力的特征表示。 #### 3. 三元组损失(Triplet Loss) 三元组损失是一种更高级的度量学习方法,它通过三元组(锚点、正样本、负样本)来优化特征空间中的相对距离。具体形式如下: $$ \mathcal{L}_{\text{triplet}} = \frac{1}{N} \sum_{i=1}^{N} \max(d(a_i, p_i) - d(a_i, n_i) + m, 0) $$ 其中: - $ a_i $ 是锚点样本; - $ p_i $ 是与锚点同属一类的正样本; - $ n_i $ 是与锚点不同类的负样本; - $ m $ 是一个预设的边界值。 三元组损失广泛应用于人脸识别、细粒度图像分类等任务中,能够有效提升模型的细粒度识别能力。 #### 4. 注意力机制结合损失函数 近年来,注意力机制在细粒度分类任务中表现出色。通过引入注意力模块(如SE Block、CBAM等),模型可以聚焦于图像中的关键区域,从而提升分类性能。结合注意力机制的损失函数通常仍然是交叉熵损失,但通过注意力机制增强了特征表示的判别能力。 ### 实现示例(PyTorch) 以下是一个简单的 PyTorch 实现示例,展示如何实现一个结合粗类和细类的分层损失函数: ```python import torch import torch.nn as nn # 假设我们有两个分类头:一个用于细类,一个用于粗类 class FineGrainedModel(nn.Module): def __init__(self, num_fine_classes, num_coarse_classes): super(FineGrainedModel, self).__init__() self.backbone = nn.Sequential( # 假设是一个简单的卷积网络 nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=2, stride=2), nn.Conv2d(64, 128, kernel_size=3, stride=1, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=2, stride=2) ) self.fine_head = nn.Linear(128 * 8 * 8, num_fine_classes) self.coarse_head = nn.Linear(128 * 8 * 8, num_coarse_classes) def forward(self, x): x = self.backbone(x) x = x.view(x.size(0), -1) fine_logits = self.fine_head(x) coarse_logits = self.coarse_head(x) return fine_logits, coarse_logits # 定义损失函数 class HierarchicalLoss(nn.Module): def __init__(self, alpha=0.5): super(HierarchicalLoss, self).__init__() self.alpha = alpha self.fine_loss = nn.CrossEntropyLoss() self.coarse_loss = nn.CrossEntropyLoss() def forward(self, fine_logits, coarse_logits, fine_labels, coarse_labels): fine = self.fine_loss(fine_logits, fine_labels) coarse = self.coarse_loss(coarse_logits, coarse_labels) total_loss = self.alpha * fine + (1 - self.alpha) * coarse return total_loss # 示例使用 model = FineGrainedModel(num_fine_classes=100, num_coarse_classes=10) criterion = HierarchicalLoss(alpha=0.7) input = torch.randn(32, 3, 32, 32) # 假设输入是 32x32 的图像 fine_labels = torch.randint(0, 100, (32,)) coarse_labels = torch.randint(0, 10, (32,)) fine_logits, coarse_logits = model(input) loss = criterion(fine_logits, coarse_logits, fine_labels, coarse_labels) loss.backward() ``` ### 总结 细粒度损失函数的设计是提升细粒度分类性能的关键之一。常见的方法包括分层损失函数、对比损失、三元组损失等,它们通过引入额外的约束或结构来增强模型对细粒度差异的敏感性。在实际应用中,可以根据任务需求选择合适的损失函数,并结合注意力机制等技术进一步提升性能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值