Multiclass SVM Loss的理解

本文基于cs231n assignment1 Q2的作业。

 


 

首先介绍一下导数、偏导数、方向导数、梯度的概念,下面的内容转载自

https://blog.youkuaiyun.com/walilk/article/details/50978864

 

前言


 机器学习中的大部分问题都是优化问题,而绝大部分优化问题都可以使用梯度下降法处理,那么搞懂什么是梯度,什么是梯度下降法就非常重要!这是基础中的基础,也是必须掌握的概念! 
 提到梯度,就必须从导数(derivative)、偏导数(partial derivative)和方向导数(directional derivative)讲起,弄清楚这些概念,才能够正确理解为什么在优化问题中使用梯度下降法来优化目标函数,并熟练掌握梯度下降法(Gradient Descent)。

 本文主要记录我在学习机器学习过程中对梯度概念复习的笔记,主要参考《高等数学》《简明微积分》以及维基百科上的资料为主,文章小节安排如下: 
 1)导数 
 2)导数和偏导数 
 3)导数与方向导数 
 4)导数与梯度 
 5)梯度下降法 
 6)参考资料 
 7)结语 

导数

 一张图读懂导数与微分

                                          

这是高数中的一张经典图,如果忘记了导数微分的概念,基本看着这张图就能全部想起来。 
导数定义如下:

反映的是函数y=f(x)在某一点处沿x轴正方向的变化率。再强调一遍,是函数f(x)在x轴上某一点处沿着x轴正方向的变化率/变化趋势。直观地看,也就是在x轴上某一点处,如果f’(x)>0,说明f(x)的函数值在x点沿x轴正方向是趋于增加的;如果f’(x)<0,说明f(x)的函数值在x点沿x轴正方向是趋于减少的。

 这里补充上图中的Δy、dy等符号的意义及关系如下: 
 Δx:x的变化量; 
 dx:x的变化量Δx趋于0时,则记作微元dx; 
 Δy:Δy=f(x0+Δx)-f(x0),是函数的增量; 
 dy:dy=f’(x0)dx,是切线的增量; 
 当Δx→0时,dy与Δy都是无穷小,dy是Δy的主部,即Δy=dy+o(Δx). 
 

导数和偏导数

 偏导数的定义如下:

可以看到,导数与偏导数本质是一致的,都是当自变量的变化量趋于0时,函数值的变化量与自变量变化量比值的极限。直观地说,偏导数也就是函数在某一点上沿坐标轴正方向的的变化率。 
 区别在于: 
 导数,指的是一元函数中,函数y=f(x)在某一点处沿x轴正方向的变化率; 
 偏导数,指的是多元函数中,函数y=f(x1,x2,…,xn)在某一点处沿某一坐标轴(x1,x2,…,xn)正方向的变化率。
 

导数与方向导数:

 方向导数的定义如下:

在前面导数和偏导数的定义中,均是沿坐标轴正方向讨论函数的变化率。那么当我们讨论函数沿任意方向的变化率时,也就引出了方向导数的定义,即:某一点在某一趋近方向上的导数值。 
 通俗的解释是: 
 我们不仅要知道函数在坐标轴正方向上的变化率(即偏导数),而且还要设法求得函数在其他特定方向上的变化率。而方向导数就是函数在其他特定方向上的变化率。通过改变每个Δ的大小可以改变所指的方向。

 

导数与梯度

 梯度的定义如下:

 梯度的提出只为回答一个问题: 
 函数在变量空间的某一点处,沿着哪一个方向有最大的变化率? 
 梯度定义如下: 
 函数在某一点的梯度是这样一个向量,它的方向与取得最大方向导数的方向一致,而它的模为方向导数的最大值。 
 这里注意三点:
 1)梯度是一个向量,即有方向有大小; 
 2)梯度的方向是最大方向导数的方向; 
 3)梯度的值是最大方向导数的值。

 

导数与向量


 提问:导数与偏导数与方向导数是向量么? 
 向量的定义是有方向(direction)有大小(magnitude)的量。 
 从前面的定义可以这样看出,偏导数和方向导数表达的是函数在某一点沿某一方向的变化率,也是具有方向和大小的。因此从这个角度来理解,我们也可以把偏导数和方向导数看作是一个向量,向量的方向就是变化率的方向,向量的模,就是变化率的大小。 
 那么沿着这样一种思路,就可以如下理解梯度: 
 梯度即函数在某一点最大的方向导数,函数沿梯度方向函数有最大的变化率。
 

梯度下降法

 既然在变量空间的某一点处,函数沿梯度方向具有最大的变化率,那么在优化目标函数的时候,自然是沿着负梯度方向去减小函数值,以此达到我们的优化目标。 
 如何沿着负梯度方向减小函数值呢?
既然梯度是偏导数的集合,如下:

 同时梯度和偏导数都是向量,那么参考向量运算法则,我们在每个变量轴上减小对应变量值即可,梯度下降法可以描述如下:

 通俗来说就是在每个沿轴方向上都下降最快则整体一定下降最快。以上就是梯度下降法的由来,大部分的机器学习任务,都可以利用Gradient Descent来进行优化。 

 

参考资料


参考书: 
《高等数学》 
《简明微积分》 
参考链接: 
梯度 
https://zh.wikipedia.org/zh-cn/%E5%81%8F%E5%AF%BC%E6%95%B0 
方向导数和梯度 

http://blog.youkuaiyun.com/wolenski/article/details/8030654

附: 
维基百科的可用Hosts文件 
http://www.williamlong.info/archives/4456.html

 


 

回到cs231n的作业

梯度矩阵dW由各样本i\in [1, N]在矩阵W的各个分类方向c\in [1, C]上的损失函数的梯度构成,指明了各样本在各个类别上的优化方向。矩阵W的每一列代表了cifar-10中每一类的分类器。比如矩阵W的第一列只会在这张图片属于第一类时计算出一个高分,如果这张图片不属于第一类,则计算出很低的分数。

损失函数Multiclass SVM Loss为

L_{i}=\sum_{j\neq y_{i}}[max(0, \omega _{j}^{T}x_{i}-\omega _{y_{i}}^{T}x_{i}+\Delta )]

而参数\omega _{0},\omega _{1}...\omega _{9}的梯度计算方法为

\bigtriangledown _{\omega }L_{i,j}=\frac{\partial }{\partial \omega}L_{i,j}=\left\{\begin{matrix} \frac{\partial }{\partial \omega _{j}}L_{i}(j\neq y_{i}))\\ \frac{\partial }{\partial \omega _{y_{i}}}L_{i}(j= y_{i})) \end{matrix}\right.

由此可得

\begin{matrix} \bigtriangledown _{\omega _{0}}L_{i}=x_{i}\\ \bigtriangledown _{\omega _{1}}L_{i}=x_{i}\\ ...\\ \bigtriangledown _{\omega _{y_{i}}}L_{i}=-9x_{i}\\ ...\\ \bigtriangledown _{\omega _{9}}L_{i}=x_{i} \end{matrix}

对应代码如下

    for i in range(num_train):
        scores = X[i].dot(W)
        correct_class_score = scores[y[i]]
        for j in range(num_classes):
            if j == y[i]:
                continue
            margin = scores[j] - correct_class_score + 1 # note delta = 1
            if margin > 0:
                loss += margin
                dW[:, j] += X[i]
                dW[:, y[i]] += -X[i]

    # Right now the loss is a sum over all training examples, but we want it
    # to be an average instead so we divide by num_train.
    loss /= num_train
    dW /= num_train 

    # Add regularization to the loss.
    loss += reg * np.sum(W * W)
    dW += reg * W

---end---

<think>好的,我需要回答用户关于多分类场景下的Dice Loss函数实现及其应用的问题。首先,我需要回忆Dice Loss的基本概念和它在二分类中的应用。Dice Loss源于Dice系数,用于衡量两个集合的相似度,常用于图像分割任务中,特别是在处理类别不平衡问题时表现出色。 接下来,用户提到的是多分类情况,所以需要将二分类的Dice Loss扩展到多分类。通常,多分类问题可以通过两种方式处理:一种是逐类别计算Dice Loss然后取平均,另一种是使用宏观或微观平均。我需要确定哪种方法更常用,并给出具体的公式。 然后是实现的步骤。用户可能需要PyTorch或TensorFlow的代码示例。我需要考虑如何将数学公式转化为代码,注意张量操作和维度处理。例如,在PyTorch中,需要处理预测值和真实值的形状,应用softmax或one-hot编码,然后计算交集和并集的部分。 还需要注意数值稳定性问题,比如添加平滑项epsilon防止除以零的情况。同时,要解释每个步骤的作用,确保用户理解代码的逻辑。 关于应用场景,Dice Loss在医学图像分割中应用广泛,尤其是在类别不平衡的情况下,比如肿瘤分割,其中正样本可能远少于负样本。需要引用提供的参考文献,比如引用[2]和[3]中提到Focal Loss和Dice Loss在处理类别不平衡中的有效性,说明Dice Loss的适用场景。 最后,生成相关问题时要考虑用户可能进一步的问题,比如与其他损失函数的比较,参数调整,或者在具体框架中的实现细节。确保问题相关且有助于用户深入理解。 总结步骤: 1. 解释Dice Loss的原理和多分类扩展方法。 2. 提供PyTorch实现代码,并解释关键步骤。 3. 讨论应用场景,引用相关文献。 4. 提出相关问题,引导用户深入学习。</think>### 多分类Dice Loss实现与应用 #### 1. Dice Loss原理 Dice Loss基于Dice系数(相似性度量),定义为: $$ \text{Dice} = \frac{2|A \cap B|}{|A| + |B|} $$ 其中$A$为预测结果,$B$为真实标签。Dice Loss则表示为$1 - \text{Dice}$,用于最小化预测与标签的差异。 多分类场景下,通常采用**逐类别计算+平均**的方式,具体分为两种模式: - **宏观平均(Macro)**:独立计算每个类别的Dice Loss后取平均,适用于类别重要性均衡的场景。 - **微观平均(Micro)**:合并所有类别的交集和并集统一计算,适用于关注整体像素精度的场景。 #### 2. PyTorch实现代码(宏观平均) ```python import torch import torch.nn as nn class MulticlassDiceLoss(nn.Module): def __init__(self, epsilon=1e-7): super().__init__() self.epsilon = epsilon # 防止除以零 def forward(self, y_pred, y_true): # y_pred: [B, C, H, W], 未归一化的logits # y_true: [B, H, W], 值为0~C-1的整数标签 y_pred = torch.softmax(y_pred, dim=1) # 转换为概率 num_classes = y_pred.shape[1] y_true_onehot = torch.nn.functional.one_hot(y_true, num_classes).permute(0,3,1,2) # 转为one-hot [B,C,H,W] intersection = (y_pred * y_true_onehot).sum(dim=(2,3)) # 各类别交集 [B,C] union = y_pred.sum(dim=(2,3)) + y_true_onehot.sum(dim=(2,3)) # 各类别并集 [B,C] dice_coeff = (2. * intersection + self.epsilon) / (union + self.epsilon) # 添加平滑项 dice_loss = 1 - dice_coeff return dice_loss.mean() # 先对batch取平均,再对类别取平均 ``` #### 3. 关键解释 - **输入要求**:预测值需为未归一化的logits,真实标签为整数形式。 - **one-hot编码**:将真实标签转换为与预测值相同的形状以便逐元素计算。 - **数值稳定**:添加$\epsilon$避免分母为零,通常设置为$1e^{-7}$。 - **灵活扩展**:可通过调整`dim`参数适配不同数据维度(如3D医学图像)。 #### 4. 应用场景 Dice Loss特别适用于**类别高度不平衡的分割任务**,例如: - **医学图像分割**:肿瘤区域占比极小(正负样本比例悬殊)[^2] - **多器官分割**:不同器官大小差异显著,需平衡各类别贡献[^3] - **边缘敏感任务**:Dice系数更关注区域重叠而非像素级精度 #### 5. 与其他损失函数对比 | 损失函数 | 优点 | 缺点 | |---------|------|------| | Cross-Entropy | 梯度稳定,通用性强 | 对类别不平衡敏感 | | Focal Loss | 抑制易分类样本的权重 | 需调整超参数$\gamma$ | | Dice Loss | 直接优化重叠区域,抗不平衡 | 可能训练不稳定 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值