label smooth的pytorch实现以及其公式推导(虽然短但是细)

2023-11-07

标签平滑:label smooth

标签平滑是一种正则化手段,目的为了解决onehot编码的缺陷,减少过拟合问题。在各种竞赛中广泛使用,涨点神器。

假设:
预测的结果为 y p r e d y_{pred} ypred, 真实结果为 y t r u e y_{true} ytrue,类别数量为 ∗ ∗ N **N N,标签平滑因子为 ϵ , 即 e p s i l o n \epsilon,即epsilon ϵepsilon

标签平滑即在 y t r u e y_{true} ytrue的one-hot编码中进行处理。
y n e w t r u e = ( 1 − ϵ ) ∗ y t r u e + ϵ / N { 1 , 0 , 0 } = > { ϵ = 0.1 } = > { 0.933 , 0.033 , 0.033 } { 0 , 1 , 0 } = > { ϵ = 0.5 } = > { 0.16 , 0.66 , 0.16 } y_{new_true} = (1 - \epsilon) * y_{true} + \epsilon / N \\ \{1, 0 ,0\} => \{\epsilon = 0.1\} = > \{0.933,0.033,0.033\} \\ \{0, 1 ,0\} => \{\epsilon = 0.5\} = > \{0.16,0.66,0.16\} ynewtrue=(1ϵ)ytrue+ϵ/N{1,0,0}=>{ϵ=0.1}=>{0.933,0.033,0.033}{0,1,0}=>{ϵ=0.5}=>{0.16,0.66,0.16}
在多分类中,往往采用交叉熵作为损失函数,如何将标签平滑和交叉熵进行结合,下面我们进行推导:
L c r o s s _ e n t r o y = − ∑ y t r u e   l o g   y p r e d L c r o s s _ e n t r o y _ l a b e l s m o o t h = − ∑ ( ( 1 − ϵ ) ∗ y t r u e + ϵ / N )   l o g   y p r e d = − ∑ ( 1 − ϵ ) ∗ y t r u e   l o g   y p r e d − ∑ ϵ / N   l o g   y p r e d = − ( 1 − ϵ ) ∑ y t r u e   l o g   y p r e d − ϵ / N ∑   l o g   y p r e d = ( 1 − ϵ ) ∗ L c r o s s _ e n t r o y − ϵ / N ∑   l o g   y p r e d L_{cross\_entroy} = -\sum y_{true}~log~y_{pred} \\ L_{cross\_entroy\_labelsmooth} = -\sum ((1 - \epsilon) * y_{true} + \epsilon / N)~log~y_{pred} \\ = -\sum (1 - \epsilon) * y_{true}~log~y_{pred} - \sum \epsilon / N~log~y_{pred}\\ =-(1 - \epsilon) \sum y_{true}~log~y_{pred} - \epsilon / N\sum~log~y_{pred} \\ = (1 - \epsilon) * L_{cross\_entroy} - \epsilon / N\sum~log~y_{pred} Lcross_entroy=ytrue log ypredLcross_entroy_labelsmooth=((1ϵ)ytrue+ϵ/N) log ypred=(1ϵ)ytrue log ypredϵ/N log ypred=(1ϵ)ytrue log ypredϵ/N log ypred=(1ϵ)Lcross_entroyϵ/N log ypred
根据公式的最后一行,我们知道使用标签平滑的交叉熵损失,只需要在原来的损失函数上乘上一个因子 ( 1 − ϵ ) (1-\epsilon) (1ϵ),并减去因子 ( ϵ / N ) (\epsilon /N) (ϵ/N)和预测结果对数之和的乘积。

代码:https://github.com/lonePatient/label_smoothing_pytorch/blob/master/lsr.py(来自网上)

import torch.nn as nn
import torch.nn.functional as F

## eps 表示标签平滑因子
class LabelSmoothingCrossEntropy(nn.Module):
    def __init__(self, eps=0.1, reduction='mean'):
        super(LabelSmoothingCrossEntropy, self).__init__()
        self.eps = eps
        self.reduction = reduction

    def forward(self, output, target):
        c = output.size()[-1]
        log_preds = F.log_softmax(output, dim=-1)
        if self.reduction=='sum':
            loss = -log_preds.sum()
        else:
            loss = -log_preds.sum(dim=-1)
            if self.reduction=='mean':
                loss = loss.mean()
        return loss*self.eps/c + (1-self.eps) * F.nll_loss(log_preds, target, reduction=self.reduction)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

label smooth的pytorch实现以及其公式推导(虽然短但是细) 的相关文章

随机推荐

  • Vjava学习笔记之(VirtualMachine 内存(总容量和已使用))

    源代码 package com vmware client import com vmware util Session import com vmware vim25 HostListSummary import com vmware v
  • 11G RAC 中 OCR 及Voting Disk 相关操作

    一 启动oracle clusterware 先决条件 Oracle High Availability Services daemon OHASD 运行在所有集群节点上 1 启动整个Oracle Clusterware stack crs
  • windows下git

    下载gitGit for Windows Windows安装git图文教程 喵代王 香菜的博客 CSDN博客 windows安装git 创建文件夹 右键 git bash here 同mac使用
  • 基于Spring Boot的ERP仓储管理信息系统设计与实现毕业设计源码150958

    基于Spring Boot的ERP仓储管理信息系统设计与实现 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化 电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用 信息时代的到来已成为不可阻挡的时尚潮流 人类发展的
  • 如何实现一个IO口读取多个设备信息

    前言 1 今天遇到一个有意思的问题一个IO口如何读取多个电机的堵转问题 之后他就发了一张图片 2 看到这个问题 之前先说一个简单的 我们如何实现一个IO读取多个按键 了解了这个之后 对于多个电机堵转就很好理解了 如何实现一个IO对多个按键读
  • 直方图均衡化原理

    原文 http www cnblogs com tianyalu p 5687782 html 直方图均衡化原理 直方图均衡化的作用是图像增强 有两个问题比较难懂 一是为什么要选用累积分布函数 二是为什么使用累积分布函数处理后像素值会均匀分
  • 从零开始的Java开发 笔记目录(跑路了)

    写在前面 不全 学习资料来源于网络 已经跑路了 文章目录 阶段1 Java零基础入门 第1周 环境搭建与语法入门 第2周 Java语法之循环 数组与方法 第3周 面向对象之封装与继承 第4周 面向对象之单例模式与多态 第5周 常用工具类 上
  • linux c++遍历文件夹下所有文件,C++ 遍历目录下文件

    function 遍历目录下所有文件 返回文件总数 子文件夹总数 修改一下可以获得全部文件名等 include stdlib h include direct h include string h include io h include
  • 对OOD/OOP有较深的理解

    最近 经常有很多人在求职的时候遇到这样一个问题 对OOD OOP有较深的理解 那OOD OOP又是什么 那今天就来讲讲它们都是些什么 又如何去回答 1 OOA Object oriented analysis 面向对象分析 面向对象分析方法
  • 一款带ai基因的向导般生成ppt的神奇网站

    只要按要求填写每一页的内容 即可生成一套像模像样的ppt 无需排版 模板众多 以后ppt不需要人写了 哈哈 1 登录 https app slidebean com 2 注册 3 新建 4 模板选择 5 填写 以airbnb为例 6 结果
  • 【微信读书每日一答辅助小程序】使用python对每日一答问题进行识别,并将结果保存到剪贴板以便搜索。

    目录标题 1 环境准备 2 获取屏幕位置 3 指定区域屏幕截图 4 文字识别 5 按键识别并保存到剪贴板 在腾讯收购阅文之后 微信读书的无限卡已经不能免费看书了 这时白嫖微信读书每日一答的书币成了不错的选择 严重偏科又手速垃圾的我在等级升高
  • Win10 解决docker一直docker desktop starting进不去的问题

    这里写自定义目录标题 为什么出现这个问题 方法1 方法2 方法3 解决我的问题 后续计划 为什么出现这个问题 似乎是因为上次没有完全关闭 而是直接关闭电脑导致的 目前有三种方法 后续应该有更多 我这边方法1 2都没有解决我的问题 方法3解决
  • Rxjs 操作符实践指南

    操作符实战 1 工具方法型 count 统计总数 import range from rxjs import count from rxjs operators const numbers range 1 7 const result nu
  • python中16mod7_mod_python模块安装

    两 mod python 1 性能 使用mod python的主要优势在于比传统CGI更高的性能 一个測试 使用在Pentium 1 2GHz的机器上执行Red Hat Linux 7 3 使用4种类型的脚本 基于标准的CGI导入模块 以典
  • Android Glide加载图片圆角效果与ImageView的ScaleType冲突问题

    在imageVIew显示图片的时候一般是使用 android scaleType centerCrop 来让图片不被变形显示 但是如果现在用Glide来加载图片并给它转化出一个圆角 transform new GlideRoundTrans
  • 【导航】ESP32-C3 入门教程目录 【快速跳转】

    本文是 矜辰所致 的ESP32 C3 专栏的内容导航 结合自己的学习应用过程的总结记录 ESP32 C3入门教程 前言 一 环境篇 二 硬件篇 三 基础篇 四 Wi Fi篇 五 蓝牙篇 六 应用篇 前言 本系列教程以实际应用为目的 能够使得
  • 代码随想录 - Day37 - 贪心算法

    代码随想录 Day37 贪心算法 376 摆动序列 排除只有一个数的情况 把差值全部求出来放到dif里 在此过程中顺便去掉差值为0的情况 如果dif为空 说明里面所有差值为0 那么最长摆动序列只能是1 直接返回 如果dif不为空 把dif
  • OpenCV学习笔记——《基于OpenCV的数字图像处理》

    源码下载 下载资源包 bookln cn 常用函数库 英文 OpenCV OpenCV modules 中文 Welcome to opencv documentation OpenCV 2 3 2 documentation jetson
  • esp8266-01s介绍与使用

    esp826601s 是个比较常用的wifi模块 体积小 功能强大 说是可以用于工业 下面介绍esp826601s 可用引脚 以及可用功能 esp 01 ESP 01S 在ESP 01的基础上 优化了PCB天线 进行了一小步的升级 带来了一
  • label smooth的pytorch实现以及其公式推导(虽然短但是细)

    标签平滑 label smooth 标签平滑是一种正则化手段 目的为了解决onehot编码的缺陷 减少过拟合问题 在各种竞赛中广泛使用 涨点神器 假设 预测的结果为 y p r e d