损失函数梯度对比-均方差和交叉熵

前言

我们都知道在机器学习中,希望算法或者网络收敛更快,有些是对数据预处理,尤其是Batch Normalization,有些是采用不同的激活函数,尤其是Relu激活函数取得了巨大的成功,还有一种加速收敛方法是更换损失函数。本博客就是针对均方差损失(MSE)和交叉熵损失的收敛速度做一个推导,当然少不了参考他人博客啦,但是参考归参考,重在自己推导一遍。

国际惯例,来一波地址

人工神经网络——【BP】反向传播算法证明

Kullback–Leibler divergence(相对熵,KL距离,KL散度)

交叉熵代价函数(作用及公式推导)

交叉熵代价函数

两种损失函数对比

前提条件

在三层BP神经网络(输入->隐层->输出)中,设yyy为模型输出,ooo为真实标注,激活函数为sigmoidsigmoidsigmoid(用σ\sigmaσ表示),输出层偏置为b,隐层单元值为h,隐层到输出层权重为www,这样就能得到y=σ(wh+b)y=\sigma(wh+b)y=σ(wh+b)

为了简便起见,只对比隐层中的一个单元与输出层之间的连接权重对于一个样本输入的更新梯度。提前关注sigmoidsigmoidsigmoid函数
σ(x)=11+e−x\sigma(x)=\frac{1}{1+e^{-x}} σ(x)=1+ex1
以及sigmoidsigmoidsigmoid函数的导数
σ′(x)=∂σ(x)x=σ(x)(1−σ(x))\sigma'(x)=\frac{\partial \sigma(x)}{x}=\sigma(x)(1-\sigma(x)) σ(x)=xσ(x)=σ(x)(1σ(x))
还有yyy对权重的导数
y′=∂y∂w=y(1−y)hy'=\frac{\partial y}{\partial w}=y(1-y)h y=wy=y(1y)h

均方差损失

函数表达为:
LMSE=12∣∣(o−y)∣∣22=12(o−y)2L_{\text{MSE}}=\frac{1}{2}||(o-y)||_2^2=\frac{1}{2}(o-y)^2 LMSE=21(oy)22=21(oy)2
权重梯度更新,更详细的推导看我前面的博客
∂LMSE∂w=(o−y)σ′(wh+b)h\frac{\partial L_{\text{MSE}}}{\partial w}=(o-y)\sigma'(wh+b)h wLMSE=(oy)σ(wh+b)h

交叉熵损失

函数表达为:
Lcross−entropy(o,y)=−([olog⁡y]+(1−o)log⁡(1−y))L_{cross-entropy}(o,y)=-([o\log y]+(1-o)\log(1-y)) Lcrossentropy(o,y)=([ology]+(1o)log(1y))
【题外话】为什么不能将交叉熵内的y,oy,oy,o互换位置呢?因为ooo是真实标注,可能取到0值,但是yyysigmoidsigmoidsigmoid激活的值,只能无限逼近0,而不会等于0。这样log⁡\loglog才有意义嘛。

权重更新梯度,利用到前提条件中yyy对权重的导数
∂Lcross-entropy∂w=−(oy⋅y′−1−o1−y⋅y′)=−[o−yy(1−y)⋅y′]=(y−o)h\begin{aligned} \frac{\partial L_{\text{cross-entropy}}}{\partial w}&=-(\frac{o}{y}\cdot y'-\frac{1-o}{1-y}\cdot y')\\ &=-\left[\frac{o-y}{y(1-y)}\cdot y'\right]\\ &=(y-o)h \end{aligned} wLcross-entropy=(yoy1y1oy)=[y(1y)oyy]=(yo)h

对比

因为是查看的是梯度更新的步长,所以不用关心正负,对比均方差和交叉熵两种损失函数更新梯度的绝对值即可
ΔMSE=∣o−y∣⋅∣σ′(wh+b)∣⋅∣h∣Δcross-entropy=∣y−0∣⋅∣h∣\Delta_{\text{MSE}}=|o-y|\cdot|\sigma'(wh+b)|\cdot|h|\\ \Delta_{\text{cross-entropy}}=|y-0|\cdot|h| ΔMSE=oyσ(wh+b)hΔcross-entropy=y0h
可以发现
ΔMSEΔcross-entropy=∣σ′(wh+b)∣≤0.25\frac{\Delta_{\text{MSE}}}{\Delta_{\text{cross-entropy}}}=|\sigma'(wh+b)|\leq0.25 Δcross-entropyΔMSE=σ(wh+b)0.25
【注】这个最大值0.25,就是斜率y′y'y的最大值,直接对y′=y(1−y)=y−y2y'=y(1-y)=y-y^2y=y(1y)=yy2求导等于0,就可以发现y=12y=\frac{1}{2}y=21的时候斜率最大,为0.25。
谢谢评论区指正,以前博客写的是最小值。

而且,从下面的sigmoidsigmoidsigmoid函数图像可以发现,对于均方差MSE损失,输出越大,梯度越小。比如当真实标注为000的时候,y=σ(wh+b)y=\sigma(wh+b)y=σ(wh+b)越大,sigmoid的值越大,但是sigmoid的梯度越小,这也就导致了Δcross-entropy\Delta_{\text{cross-entropy}}Δcross-entropy的梯度大(因为没sigmoid导数这一项),但是ΔMSE\Delta_{\text{MSE}}ΔMSE的梯度小(因为乘以了sigmoid较远的非常小的梯度)。

这里写图片描述
本文已经同步到微信公众号中,公众号与本博客将持续同步更新运动捕捉、机器学习、深度学习、计算机视觉算法,敬请关注
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246649.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何选择深度学习优化器

前言 转载地址:如何选择深度学习优化器 作者:不会停的蜗牛 CSDN AI专栏作家 在很多机器学习和深度学习的应用中,我们发现用的最多的优化器是 Adam,为什么呢? 下面是 TensorFlow 中的优化器, https://w…

【caffe-Windows】以mnist为例的hdf5单标签处理——matlab实现

前言 主要是想尝试看一下多标签的caffe是如何进行输入输出的,但是目前还未找到基于原始caffe做多标签输入的代码,大部分都是基于源码做了一部分修改实现多标签分类,caffe官网倒是有一个多标签的Python程序,这个我慢慢研究研究&am…

【caffe-Windows】基于Python多标签方法——VOC2012数据集

前言 按照上一篇博客所遗留的话题:多标签分类,进行初步探索,此篇博客针对caffe官网的多分类进行配置,只不过是Python接口的,不过官网在开头说明可以使用HDF5或者LMDB进行操作,只不过Python更加方便罢了 国…

【theano-windows】学习笔记一——theano中的变量

前言 因为目前需要搭建一些关于RBM或者其他之类的模型,感觉不太会折腾caffe,然而我发现了几个有趣网址,使用theano实现了各种各样的模型,所以,尝试学一下theano。主要以官方教程为主,所以博客会以译文的方…

【theano-windows】学习笔记二——theano中的函数和共享参数

前言 上一篇博客中学到了theano中的变量类型,也就是dscalar、dvector之类的, 然后还有一个theano.function和eval函数, 将我们所定义的操作转换成theano可执行的函数,类似于def, 还有就是简单的线性代数运算操作。 在神经网络(NN)中, 我们声明了权重、…

【theano-windows】学习笔记三——theano中的导数

前言 就一个NN而言,包含梯度、偏置、参数更新,而前面第一篇博客学习了theano中符号变量的定义, 第二篇博客学习了变量的随机初始化, 变量之间的互相操作(类似于sigmoid(w∗xb)), 但是参数更新还应涉及到损失函数的偏导计算,这一章节就是看看…

【theano-windows】学习笔记四——theano中的条件语句

前言 按照官网教程,学习条件语句Switch和ifelse的使用 参考地址: conditions 性能对比 ifElse是将布尔变量和两个变量当做输入 Switch是将张量和两个变量当做输入. 因为Switch是元素级操作,所以比ifElse更具一般性 Switch需要对所有输出变量进行评…

【theano-windows】学习笔记五——theano中张量部分函数

前言 至此感觉应该可以写出一个logistic回归程序了,但是为了达到对theano中张量的更灵活的使用, 还是先看一下thenao.tensor对变量都提供了哪些操作,最全的文档戳这里或者这里, 这里就稍微摘取一点自我感觉以后可能用得多的函数 基本张量函数 创建张量…

【theano-windows】学习笔记六——theano中的循环函数scan

前言 Scan是Theano中最基础的循环函数, 官方教程主要是通过大量的例子来说明用法. 不过在学习的时候我比较习惯先看看用途, 然后是参数说明, 最后再是研究实例. 国际惯例, 参考网址 官网关于Scan的11个例子 官网更全面的介绍 简介 用途 递归的一般形式, 可以被用于循环s…

多标签分类、多任务分类、多输出回归概念

前言 虽然不是搞分类的,但是还是看看多标签和多分类的区别。为了避免自己的错误理解, 当然是选择原谅他啊…….找正规文档看哇. 以下翻译分别来自scikit-learn.org和 维基 喂鸡百科 国际惯例,贴上来源: Multiclass and multilabel algorithms Multi-…

【theano-windows】学习笔记七——logistic回归

前言 前面只是学了最基本的theano操作,但是theano中还有很多其他的东西,比如图结构,自定义函数等,这些暂时没有用到就先不看了,后续学啥用啥,没必要一口气吃个胖子,免得消化不良还把前面吃的东…

【theano-windows】学习笔记八——预备知识

前言 按照上一个博客所说的,直接按照深度学习0.1文档进行学习,当然在此之前我们需要了解这一系列教程所需要的数据集,以及一些概念性的东西 国际惯例,参考博客网址: 深度学习0.1文档 深度学习0.1文档-中文翻译 基…

【theano-windows】学习笔记九——softmax手写数字分类

前言 上一篇博客折腾了数据集的预备知识, 接下来按照官方的Deep learning 0.1 documentation一步步走, 先折腾softmax, 关于softmax和logistic回归分类的联系, 我在之前写过一个小博客 国际惯例, 参考博客走一波: Classifying MNIST digits using Logistic Regression soft…

【theano-windows】学习笔记十——多层感知机手写数字分类

前言 上一篇学习了softmax, 然后更进一步就是学习一下基本的多层感知机(MLP)了. 其实多层感知机同时就是w*xb用某个激活函数激活一下, 得到的结果作为下一层神经元的输入x, 类似于 output⋯f3(f2(f1(x∗w1b2)∗w2b2)∗w3b3)⋯output=\cdots f^3(f^2(f^1(x*w^1+b^2)*w^2+b^2)*…

【theano-windows】学习笔记十一——theano中与神经网络相关函数

前言 经过softmax和MLP的学习, 我们发现thenao.tensor中除了之前的博客【theano-windows】学习笔记五——theano中张量部分函数提到的张量的定义和基本运算外, 还有一个方法称为nnet, 如果自己实现过前面两篇博客中的代码就会发现用到了theano.tensor.nnet.sigmoid和thenao.te…

【caffe-windows】全卷积网络特征图分析

前言 突然就想分析一下全卷积网络的转置卷积部分了, 就是这么猝不及防的想法, 而且这个网络对图片的输入大小无要求,这么神奇的网络是时候分析一波了,我个人的学习方法调试代码,然后对照论文看理论 本次分析主要针对每层的权重大小和特征图…

【theano-windows】学习笔记十二——卷积神经网络

前言 按照进度, 学习theano中的卷积操作 国际惯例, 来一波参考网址 Convolutional Neural Networks (LeNet) 卷积神经网络如何应用在彩色图像上? 卷积小知识 三大特性:局部感知(稀疏连接), 权值共享, 池化 上图很重要, 描述的是前一个隐层m-1具有四…

【theano-windows】学习笔记十三——去噪自编码器

前言 上一章节学习了卷积的写法,主要注意的是其实现在theano.tensor.nnet和theano.sandbox.cuda.dnn中都有对应函数实现, 这一节就进入到无监督或者称为半监督的网络构建中. 首先是自编码器(Autoencoders)和降噪自编码器(denoising Autoencoders) 国际惯例, 参考网址: Denoi…

梯度优化算法Adam

前言 最近读一个代码发现用了一个梯度更新方法, 刚开始还以为是什么奇奇怪怪的梯度下降法, 最后分析一下是用一阶梯度及其二次幂做的梯度更新。网上搜了一下, 果然就是称为Adam的梯度更新算法, 全称是:自适应矩估计(adaptive moment estimation) 国际惯例, 参考博文: 一文看…

读写bin

前言 工程中经常将参数文件存储为bin格式, 但是实际中为了分析其参数, 也不好用C去读取调试它, 所以可以用matlab或者python去读取它, 但是还是蛮坑的 Matlab中的读取和写入 写入文件 比较坑的是, 一定要注意自己的文件存储的类型, 比如数值是float还是double之类的, 不然很…