常用损失函数小结

2023-10-30

一、摘要

本文主要总结一下常见的损失函数,包括:MSE均方误差损失函数、SVM合页损失函数、Cross Entropy交叉熵损失函数、目标检测中常用的Smooth L1损失函数。其中还会涉及到梯度消失、梯度爆炸等问题:ESM均方误差+Sigmoid激活函数会导致学习缓慢;Smooth L1损失是为了解决梯度爆炸问题。仅供参考。

二、均方误差损失

2.1 均方差损失函数的定义:

均方差损失函数常用在最小二乘法中。它的思想是使得各个训练点到最优拟合线的距离最小(平方和最小)。均方差损失函数也是我们最常见的损失函数了,相信大很熟悉了,我们以神经网络中激活函数的形式表达一下,定义如下:


其中, a=f(z)=f(w·x+b) :x是输入、w和b是网络的参数、 f(·) 是激活函数。

2.2 ESM均方误差+Sigmoid激活函数:输出层神经元学习率缓慢

2.2.1 Sigmoid激活函数:

这个激活函数再熟悉不过了,该函数能将负无穷到正无穷的数映射到0和1之间。先来看一下表达式以及函数图像:


Sigmoid的导数推导以及图像:



从sigmiod的导数图像中可以看到,除了中间比较小的区域,其他区域的十分值接近于0。

神经网络的反向传播是逐层对函数偏导相乘,因此当神经网络层数非常深的时候,最后一层产生的偏差(网络输出和标签之间的偏差)因为乘了很多的小于1的数而越来越小,最终就会变为0,从而导致层数比较浅的权重w没有更新,即梯度消失。可以看出,sigmoid函数作为激活函数本身就存在梯度消失的问题。
2.2.2 ESM均方误差+Sigmoid激活函数:输出层神经元学习率缓慢
我们以一个神经元,ESM均方误差损失 J=\frac{1}{2}(y-a)^{2} ,Sigmoid激活函数 a=\sigma (z) (其中 z=wx+b )为例,计算一下最后一层的反向传播过程,可得:
可以看到最后一层反向传播时,所求的梯度中都含有 \sigma^{′}(z) 。经过上面的分析,当神经元输出接近1时候,Sigmoid的导数 \sigma^{′}(z) 变很小,这样 \frac{\partial J}{\partial w}\frac{\partial J}{\partial b} 很小,这就导致了ESM均方误差+Sigmoid激活函数使得神经网络反向传播的起始位置——输出层神经元学习率缓慢。
想要解决这个问题,需要引入接下来介绍的交叉熵损失函数。这里先给出结论:交叉熵损失+Sigmoid激活函数可以解决输出层神经元学习率缓慢的问题,但是不能解决隐藏层神经元学习率缓慢的问题。具体的推导和总结在下面部分中介绍。
三、交叉熵损失

3.1 交叉损失的定义

交叉熵损失的计算分为两个部分。

3.1.1 soft max分类器

交叉熵损失是基于softmax计算来的,softmax将网络最后输出z通过指数转变成概率形式。首先看一下softmax计算公式: p_{i}=\frac{e^{z_{i}}}{\sum_{j=1}^{k}{e}^{z_{j}}}

其中, 分子e^{z_{i}} 是要计算的类别 i 的网络输出的指数;分母是所有类别网络输出的指数和,共k个类别。这样就得到了类别i的输出概率 p_{i}

→这里说点题外话,实际上,softmax是由逻辑斯的回归模型(用于二分类)推广得到的多项逻辑斯蒂回归模型(用于多分类)。具体可以参考李航大神的《统计学方法》第六章,这里给一个大致的过程。

逻辑回归的P(Y=y|x)表达式如下(为了将类别标签y统一为1和0,下面将表达式分开表示):

将它带入到上式,通过推导可以得到logistic的损失函数表达式,如下:


逻辑回归最后得到的目标式子如下:


3.1.2 交叉熵损失

公式定义如下: J=-\frac{1}{N}\sum_{1}^{N}{\sum_{i=1}^{k}{y_{i}·log(p_{i})}}

其中, y_{i} 是类别 i 的真实标签;p_{i}是上面softmax计算出的类别 i 的概率值;k是类别数,N是样本总数。

这里看一个计算交叉熵损失的小例子:

假设共有三个类别cat、dog、bird,那么一张cat的图片标签应该为 (1,0,0)^{T} 。并且训练过程中,这张cat的图片经过网络后得到三个类别网络的输出分别为3、1、-3。那么经过softmax可以得到对应的概率值,如下图:



3.2 交叉熵损失的两个图像

3.2.1 指数图像

softmax分类器将各个类别的“得分”(网络输出)转变成概率值。并取e指数使得“得分”高的类别对应的概率更大,使得损失函数对网络输出“更敏感”,更有利于分类。

3.2.2 对数图像

3.2.3 交叉熵损失+Sigmoid激活函数:

接着上一部分留下的问题,我们仍然以Sigmoid激活函数 a=\sigma (z) (其中 z=wx+b )为例。这次我们引入交叉熵损失,并以二分类为例,那么s损失函数公式为:


那么可以计算一下最后一层的反向传播过程,可得:


根据之前的推导已知 \sigma^{′}(z)=(1-\sigma(z))·\sigma(z) ,那么上式可以化简为:



可以看到sigmoid的导数被约掉,这样最后一层的梯度中就没有\sigma^{′}(z)。然而这只是输出层的推导,如果变成隐藏层的梯度sigmoid的导数不会被约掉,仍然存在\sigma^{′}(z)。所以交叉熵损失+Sigmoid激活函数可以解决输出层神经元学习率缓慢的问题,但是不能解决隐藏层神经元学习率缓慢的问题。

其实损失函数包含两个部分:①计算方法(均方差、交叉熵等)②激活函数。

而之前我们遇到的是均方差损失+sigmoid激活函数造成了输出层神经元学习率缓慢,其实我们破坏任意一个条件都有可能解决这个问题:

①均方误差损失→交叉熵损失;

②sigmoid函数→不会造成梯度消失的函数,例如ReLU函数,不仅能解决输出层学习率缓慢,还能解决隐藏层学习率缓慢问题。


这里也小结一下ReLU函数相对于tanh和sigmoid函数好在哪里:

第一,采用sigmoid等函数,算激活函数是(指数运算),计算量大;反向传播求误差梯度时,求导涉及除法,计算量相对大。而采用Relu激活函数,整个过程的计算量节省很多。

第二,对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0),这种情况会造成信息丢失,梯度消失在网络层数多的时候尤其明显,从而无法完成深层网络的训练。

第三,ReLU会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。

四、svm合页损失

4.1 定义

合页损失函数想让正确分类的“得分”比其他错误分类的“得分”高出至少一个边界值\Delta

如果正确分类的得分与错误分类的得分差值比边界值还要高,就会认为损失值是0;如果没有

就要计算损失了。看一下计算公式和示意图:


其中, z_{correct} 是正确分类的得分、 z_{other} 是其他错误分类的得分; \Delta 是指想要正确类别的分类得分比其他错误分类类别的得分要高且至少高出 \Delta 的边界值;k是类别数,N是样本总数。

示意图如下:


这里看一个计算合页损失的小例子:仍然假设共有三个类别cat、dog、bird,那么一张cat的图片标签应该为 (1,0,0)^{T} 。并且训练过程中,这张cat的图片经过网络后得到三个类别网络的输出分别为3、1、-3。我们取 \Delta=5 。此时: J=max(0,5-(3-1))+max(0,5-[3-(-3)])=3 。其实直观上也很好理解,分类正确的得分是3,其他错误类别得分是1和-3,而我们希望分类正确的得分比其他分类错误的得分高 \Delta=5 的边界值。显然错误分类得分为1的没有符合条件,则计算损失。

4.2 特点

合页损失函数其实就是线性支持向量机中,对于一些线性不可分的数据,引入了松弛变量 \xi 。这样,目标函数和约束条件就变成了:



其中前面的就是合页损失函数。后面的 \lambda||w||^{2} 是正则项。

线性支持向量机也是希望不仅仅可以求出分类超平面,同时也希望正确分类比其他错误分类多出一个边界值,即分类间隔,SVM目的也就是最大化分类间隔。而引入的 \xi 松弛因子其实就是计算的合页损失项。

尽管合页损失函数希望正确分类的得分比其他错误分类的得分高出至少一个边界值 \Delta ,但是
对于得分数字的细节是不关心的,看一个小例子:

如果两个分类器最后得分是[3,-10, -10]和[3,-2, -2],且 \Delta=5 ,那么对于合页损失来讲没什么不同,只要满足超过边界值5,那么损失值就都等于0。然而,显然第一个分类器比第二个分类器效果更好,因为高出边界更大,但是合页损失都是0,这就是合页损失对于得分数字的细节是不关心的造成的缺点。

想要解决这一问题,其实上面的交叉熵损失很好的解决这一问题,因为交叉熵将得分转变成概率,就不会造成上面说的情况;并且交叉熵损失也扩大了正确分类和错误分类得分的差距,对分数敏感,同样能得到较好的分类效果。

五、Smooth L1损失

Smooth L1损失是为了解决梯度爆炸问题的。在看Smooth L1损失之前,先看一下梯度爆炸。

1、梯度爆炸:

在深层神经网络或循环神经网络中,误差的梯度可在更新中累积相乘。如果网络层之间的梯度值大于 1.0,那么重复相乘会导致梯度呈指数级增长,梯度变的非常大,然后导致网络权重的大幅更新,并因此使网络变得不稳定。

梯度爆炸会伴随一些细微的信号,如:

①模型不稳定,导致更新过程中的损失出现显著变化;

②训练过程中,在极端情况下,权重的值变得非常大,以至于溢出,导致模型损失变成 NaN等等。

2、Smooth L1损失:

Smooth L1损失函数是在Fast R-CNN中被提出,主要目的是为了防止梯度爆炸。

对于目标检测中的回归问题,最初大多采用均方误差损失 ||y-f(z)||^{2} ,这样反向传播对w或者b求导时仍存在 y-f(z) 。那么当预测值和目标值相差很大时,就容易造成梯度爆炸。

所以我们将 ||y-f(z)||^{2} 这种均方误差形式,转变成 Smooth_{L1}(y-f(z)) 这种形式,其中:

通过上式可以看出:

①当 |y-f(z)|<1 时,即预测值和目标值相差小于1,不易造成梯度爆炸,此时还原成均方误差损失形式并给一个0.5的平滑系数,即 0.5||y-f(z)||^{2}

②当 |y-f(z)|\geq1 时,即预测值和目标值相差大于等于1,易造成梯度爆炸,此时降低损失次幂数,变成 |y-f(z)|-0.5 ,这时候反向传播求导时候就不存在 y-f(z) 这一项了,从而防止了梯度爆炸。

→这里最后再给出解决梯度爆炸的一些其他方法:

(1)减少学习率(个人理解梯度爆炸是模型训练发散的一种情况);

(2)使用ReLU函数,使得梯度稳定;

(3)使用正则化,即检查网络中权重的大小,对较大的权重进行惩罚,限制了梯度爆炸造成的权重变得很大的情况。












本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

常用损失函数小结 的相关文章

  • Weex加载数据缓冲旋转动画的实现

    Weex Ui已经上线了加载动画了点击这里跳转 手写的我眼泪都掉了下来 由于Weex手机端不支持gif图片 然而公司项目又要我加个加载动画 所以手写了一个动画加载组件 注意1 需要用到组件不会用组件的可以点击看看这篇文章 Weex Vue组
  • 操作系统考研复习——第四章(文件管理)

    操作系统考研复习 第四章 文件管理 4 文件管理 4 1 文件管理基础 4 1 1 文件的概念 1 数据项 记录和文件 2 文件属性 3 文件系统的接口 4 文件的基本操作 5 文件的打开与关闭 4 1 2 文件的逻辑结构 1 无结构文件
  • Java中的‘\’

    概述 斜杠 就士普通的字符 反斜杠 则在java中和不同的字符会组成不同的转义字符 斜杠 在Java中没有特别的意义 就代表一个 字符 反斜杠 则不然 它和紧跟它的字符构成转义字符 如 n 代表换行 例如 要写一个字符串 String s
  • Linux下搭建Hadoop环境---JDK安装

    这里安装JDK8 安装JDK8的方式有多中 在windows下下载压缩包 通过xftp上传到linux服务器 去官网下载Java Downloads Oracle 完了以后使用Xftp上传到linux服务器指定目录下 使用wget在本地下载
  • ES(Elasticsearch)中文检索使用笔记(一)

    1 什么是Elasticsearch 根据官网介绍 https www elastic co cn elasticsearch Elasticsearch 以下简称为ES 主要是一种基于JSON的分布式 高扩展 高实时的搜索与数据分析引擎

随机推荐

  • Qt之页面布局

    QTlayout概述 Qt的布局管理系统提供了强大的机制来自动排列窗口中的所有部件 确保它们有效地使用空间 Qt包含了一组布局管理类 从而在应用程序的用户界面中对部件进行布局 比如QLayout的几个子类 这里将它们称作布局管理器 所有QW
  • 基于SSM+JSP的学生信息管理系统

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SSM 前端 采用JSP技术开发 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Eclipse 是否Mave
  • 34-鼠标拖拽文件功能

    鼠标拖拽文件功能 直接拖动部分文件或者文件夹到tkinter窗口 实现快速添加文件功能 需要安装windnd库 demo如下 import tkinter as tk import windnd from tkinter messagebo
  • 数据库中系统数据库服务器,sql中什么是系统数据库服务器

    sql中什么是系统数据库服务器 内容精选 换一换 数据复制服务 Data Replication Service 简称DRS 是一种易用 稳定 高效 用于数据库实时迁移和数据库实时同步的云服务 数据复制服务围绕云数据库 降低了数据库之间数据
  • 【C语言】一篇博客带你弄懂最大公约数和最小公倍数

    目录 前言 什么是最大公约数和最小公倍数 最大公约数与最小公倍数的公式 求最大公约数方法 方法一 暴力穷举法 方法二 辗转相除法 方法三 更相减损术 求最小公倍数的方法 方法一 公式法 方法二 暴力穷举法 方法三 叠乘法 最后总结 前言 我
  • go语言基础-----23-----文件解析器goconfig

    1 文件解析器goconfig go的ini配置文件非常简单 看下面代码即可 运行之前需要go get go get github com Unknwon goconfig package main import fmt log githu
  • 基于Unittest框架写的自动化脚本右键运行出现 run “py.test for ...“的解决办法

    一 看图 python脚本都是 unittest 写的 但是 运行的时候没注意是 py test 就运行了 二 网上找了解决办法 说是要修改默认运行方式 进入 File Settings Tools Python Integrated To
  • Git:更改远程仓库指向(五)

    修改已有git仓库的远程仓库指向 git remote set url origin 仓库地址 git remote set url origin git github com test thinkphp git Tips 小程序云开发 中
  • SpringBoot项目部署

    Springboot项目部署有两种方式 分别为 打包为jar war jar包和war包到部署服务器的区别和优缺点 1 部署war包 1 将war包解压 将里面的内容放到服务器项目的目录下 2 重启服务器 启动tomcat的时间会有些长 约
  • QNX系统BSP开发研发与应用,QNX技术解答-项目开发-软件开发

    如果你认为本系列文章对你有所帮助 请大家有钱的捧个钱场 点击此处赞助 赞助额0 1元起步 多少随意 声明 本文只用于个人学习交流 若不慎造成侵权 请及时联系我 立即予以改正 锋影 email 174176320 qq com 目前总结了一些
  • [LeetCode-27]-Remove Element (删除指定元素)

    文章目录 题目相关 Solution 题目相关 题目解读 使用In place 原地算法 从数组中删除指定值的所有元素 并返回删除后的数组长度 原题描述 原题链接 Given an array nums and a value val re
  • python函数式编程——迭代器(2)

    文章目录 前言 一 迭代器 前言 python学习笔记 仅供学习使用 一 迭代器 迭代是访问集合元素的 种 式 迭代器是 个可以记住遍历的位置的对象 迭代器对象从集合的第 个元素开始 访问 直到所有的元素被访问完结束 迭代器只能往前不会后退
  • java 静态变量 静态代码初始化块 构造函数的顺序

    静态变量或静态代码块 先后与代码书写顺序有关 初始化代码块或普通变量 顺序与代码书写顺序有关 构造函数 几大原则 一 静态成员变量 Static 1 静态成员变量为类变量 所有对象共享同一内存空间 2 静态成员变量的声明和定义仅在首次加载类
  • 视频无损放大软件:Topaz Video Enhance AI Mac版(支持m1)

    Topaz Video Enhance AI for Mac是一款专业的AI视频无损放大软件 topaz video enhance ai mac版使用时间信息有效提高视频质量和细节 从而达到最好的视频放大 去隔行 降噪和还原效果 另外to
  • gitlab目录功能结构

    默认安装的gitlab 主要有四个目录 opt gitlab 主目录 etc gitlab 放置配置文件 var opt gitlab 各个组件 var log gitlab 放置日志文件 功能操作 检查gitlab各组件状态 gitlab
  • 浅议代码安全检测

    2017年6月1日 中华人民共和国网络安全法 正式实施 等级保护工作正式入法 等级保护制度已成为新时期国家网络安全的基本国策和基本制度 2019年12月1日 网络安全等级保护条例 正式实施 等保2 0是从 信息安全等级保护制度 到 网络安全
  • 卸载vs2010亲测的一个方法

    最近想把vs2010卸载掉 把方法记录下 供需要的人参考 采用的方法是vs自带的卸载的方法 步骤如下 1 打开 控制面板 点击 卸载程序 在弹出的窗口里面找到vs2010的主程序 如图 2 双击打开后 或是右键弹出 卸载 更改 菜单 进入维
  • windows10环境下用anaconda和VScode配置

    文件下载 最新的Anaconda3 5 1 0 Windows x 64 exe版本中在安装的时候已经打包好了vscode 就是在anaconda3安装完成之后 会提示你是否要安装vscode 然后勾选就可以完成vscode的安装 Anac
  • vue实现消息提示框

    我们常常看到很多vue生态下的ui框架的消息提示框 在页面切换的时候依然停留在页面 我们知道vue这种单页面渐进式框架 所有的操作和元素都是挂载在一个节点上的 当路由变化是整个节点下的dom元素也在重新渲染 若要实现ui框架中的类似的消息提
  • 常用损失函数小结

    一 摘要 本文主要总结一下常见的损失函数 包括 MSE均方误差损失函数 SVM合页损失函数 Cross Entropy交叉熵损失函数 目标检测中常用的Smooth L1损失函数 其中还会涉及到梯度消失 梯度爆炸等问题 ESM均方误差 Sig