浅谈LabelSmooth两种实现及推导

2021 年 12 月 12 日 极市平台
↑ 点击 蓝字  关注极市平台

作者丨FlyEgle
来源丨GiantPandaCV
编辑丨极市平台

极市导读

 

本文作者在跑VIT的实验时,在mixup的实现里发现labelsmooth的实现是按照最基本的方法来的,与很多pytorch的实现略有不同,因此对其简单做了一个推导。 >>加入极市CV技术交流群,走在计算机视觉的最前沿

前言

因为最近跑VIT的实验,所以有用到timm的一些配置,在mixup的实现里面发现labelsmooth的实现是按照最基本的方法来的,与很多pytorch的实现略有不同,所以简单做了一个推导。

一、交叉熵损失(CrossEntropyLoss)

先简单讲一下交叉熵损失,也是我们做分类任务里面最常用的一种损失,公式如下:

这里的 表示的是模型输出的logits后经过softmax的结果,shape为 表示的是对应的label,经常用onehot来表示,pytorch版本可以使用scalar表示,shape为 ,这里 表示为batchsize, 表示为向量长度。

可以简单拆解为如下:

  • log_softmax

这个很简单,就是做softmax后取对数,公式如下:

  • NLLloss

这个玩意的全程叫做negative log-likelihood(负对数似然损失), 简单解释下,假设需要求解一个分布 , 由于未知其表达式,所以先定义一个分布 ,通过 来使得 靠近 的分布。这里采用最大似然估计来进行求解, ,不断的更新参数 使得 来自 的样本 中的概率越来越高。但是有个问题,连乘对于求导不友好,计算也过于复杂,所以可以对其取对数,有

最大化对数似然函数就等效于最小化负对数似然函数,所以加个负号,公式如下:

由于求loss的时候,采用的是onehot形式,除去当前类别为1其余都为0,所以有:

这个形式就和交叉熵形式一致,所以NLLLoss也叫CrossEntropyLoss。

二、LabelSmooth

由于Softmax会存在一个问题,就是Over Confidence,会使得模型对于弱项的照顾很少。LabelSmooth的作用就是为了降低Softmax所带来的的高Confidence的影响,让模型略微关注到低概率分布的权重。这样做也会有点影响,最终预测的时候,模型输出的置信度会稍微低一些,需要比较细致的阈值过滤。

假设 ,表示对标签进行平滑的数值,那么就有

这里 表示类别数量, 表示当前的类别,带有labelsmooth的CELoss就变成了:

相比原始的CELoss,LabelSmoothCELoss则是每一项都会参与到loss计算。

三、公式推导

# labelsmooth 
import torch 
import torch.nn as nn 
import torch.nn.functional as F 


class LabelSmoothingCrossEntropy(nn.Module):
    """
    NLL loss with label smoothing.
    """

    def __init__(self, smoothing=0.1):
        """
        Constructor for the LabelSmoothing module.
        :param smoothing: label smoothing factor
        """

        super(LabelSmoothingCrossEntropy, self).__init__()
        assert smoothing < 1.0
        self.smoothing = smoothing
        self.confidence = 1. - smoothing

    def forward(self, x, target):
        logprobs = F.log_softmax(x, dim=-1)
        nll_loss = -logprobs.gather(dim=-1, index=target.unsqueeze(1))
        nll_loss = nll_loss.squeeze(1)
        smooth_loss = -logprobs.mean(dim=-1)
        loss = self.confidence * nll_loss + self.smoothing * smooth_loss
        return loss.mean()

可以看到这个code的实现和公式有点出入,第一部分是self.confidence * nll_loss, 第二部分是self.smoothing * smooth_loss。我们将其展开为:

假设 为target,那么对于onehot来说除了 以外均为0,所以有:

进一步有组合 项:

最后可以写成矩阵点乘的形式:

我们表示 为LabelSmooth后的标签 ,和第二节中的设定对齐,所以得到的Loss就是原本的表达式:

与之对应的timm中的mixup部分的LabelSmoothCELoss代码如下:

def one_hot(x, num_classes, on_value=1., off_value=0., device='cuda'):
    x = x.long().view(-1, 1)
    return torch.full((x.size()[0], num_classes), off_value, device=device).scatter_(1, x, on_value)


def mixup_target(target, num_classes, lam=1., smoothing=0.0, device='cuda'):
    off_value = smoothing / num_classes
    on_value = 1. - smoothing + off_value
    y1 = one_hot(target, num_classes, on_value=on_value, off_value=off_value, device=device)
    y2 = one_hot(target.flip(0), num_classes, on_value=on_value, off_value=off_value, device=device)
    return y1 * lam + y2 * (1. - lam)

四、总结

LabelSmooth可以用来标签平滑,从公示推导方面来讲,也可以充当正则的作用,尤其是针对难分类别的情况下,效果会表现更好一些。

往期文章回顾:

https://zhuanlan.zhihu.com/p/406882110

https://zhuanlan.zhihu.com/p/409920002

https://zhuanlan.zhihu.com/p/430844447

如果觉得有用,就请分享到朋友圈吧!

△点击卡片关注极市平台,获取 最新CV干货

公众号后台回复“transformer”获取最新Transformer综述论文下载~


极市干货
课程/比赛: 珠港澳人工智能算法大赛 保姆级零基础人工智能教程
算法trick 目标检测比赛中的tricks集锦 从39个kaggle竞赛中总结出来的图像分割的Tips和Tricks
技术综述: 一文弄懂各种loss function 工业图像异常检测最新研究总结(2019-2020)


CV技术社群邀请函 #

△长按添加极市小助手
添加极市小助手微信(ID : cvmart4)

备注:姓名-学校/公司-研究方向-城市(如:小极-北大-目标检测-深圳)


即可申请加入极市目标检测/图像分割/工业检测/人脸/医学影像/3D/SLAM/自动驾驶/超分辨率/姿态估计/ReID/GAN/图像增强/OCR/视频理解等技术交流群


每月大咖直播分享、真实项目需求对接、求职内推、算法竞赛、干货资讯汇总、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企视觉开发者互动交流~



觉得有用麻烦给个在看啦~   
登录查看更多
0

相关内容

机器学习损失函数概述,Loss Functions in Machine Learning
专知会员服务
82+阅读 · 2022年3月19日
【干货书】优化与学习的随机梯度技术,238页pdf
专知会员服务
52+阅读 · 2021年11月22日
专知会员服务
18+阅读 · 2021年8月15日
专知会员服务
16+阅读 · 2021年8月6日
专知会员服务
16+阅读 · 2021年7月13日
专知会员服务
27+阅读 · 2021年3月17日
卷积神经网络(CNN)反向传播算法推导
极市平台
2+阅读 · 2021年12月15日
Softmax 函数和它的误解
极市平台
0+阅读 · 2021年10月15日
从三角不等式到Margin Softmax
PaperWeekly
0+阅读 · 2021年10月7日
一文理解Ranking Loss/Margin Loss/Triplet Loss
极市平台
16+阅读 · 2020年8月10日
度量学习中的pair-based loss
极市平台
65+阅读 · 2019年7月17日
人脸识别损失函数综述(附开源实现)
极市平台
29+阅读 · 2019年3月12日
从最优化的角度看待 Softmax 损失函数
极市平台
31+阅读 · 2019年2月21日
一文道尽softmax loss及其变种
极市平台
14+阅读 · 2019年2月19日
详解常见的损失函数
七月在线实验室
20+阅读 · 2018年7月12日
CNN 反向传播算法推导
统计学习与视觉计算组
30+阅读 · 2017年12月29日
国家自然科学基金
0+阅读 · 2015年12月31日
国家自然科学基金
1+阅读 · 2014年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
1+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
Arxiv
0+阅读 · 2022年4月18日
Max-Margin Contrastive Learning
Arxiv
17+阅读 · 2021年12月21日
Arxiv
11+阅读 · 2021年2月17日
Disentangled Information Bottleneck
Arxiv
12+阅读 · 2020年12月22日
Arxiv
11+阅读 · 2018年1月18日
VIP会员
相关资讯
卷积神经网络(CNN)反向传播算法推导
极市平台
2+阅读 · 2021年12月15日
Softmax 函数和它的误解
极市平台
0+阅读 · 2021年10月15日
从三角不等式到Margin Softmax
PaperWeekly
0+阅读 · 2021年10月7日
一文理解Ranking Loss/Margin Loss/Triplet Loss
极市平台
16+阅读 · 2020年8月10日
度量学习中的pair-based loss
极市平台
65+阅读 · 2019年7月17日
人脸识别损失函数综述(附开源实现)
极市平台
29+阅读 · 2019年3月12日
从最优化的角度看待 Softmax 损失函数
极市平台
31+阅读 · 2019年2月21日
一文道尽softmax loss及其变种
极市平台
14+阅读 · 2019年2月19日
详解常见的损失函数
七月在线实验室
20+阅读 · 2018年7月12日
CNN 反向传播算法推导
统计学习与视觉计算组
30+阅读 · 2017年12月29日
相关基金
国家自然科学基金
0+阅读 · 2015年12月31日
国家自然科学基金
1+阅读 · 2014年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
1+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2013年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
国家自然科学基金
0+阅读 · 2012年12月31日
Top
微信扫码咨询专知VIP会员