转载出处:https://www.codelast.com/

《Deep Learning》(Ian Goodfellow & Yoshua Bengio & Aaron Courville)第四章「数值计算」中,谈到了上溢出(overflow)和下溢出(underflow)对数值计算的影响,并以softmax函数和log softmax函数为例进行了讲解。这里我再详细地把它总结一下。

『1』什么是下溢出(underflow)和上溢出(overflow)

实数在计算机内用二进制表示,所以不是一个精确值,当数值过小的时候,被四舍五入为0,这就是下溢出。此时如果对这个数再做某些运算(例如除以它)就会出问题。
反之,当数值过大的时候,情况就变成了上溢出。

『2』softmax函数是什么

softmax函数如下:

从公式上看含义不是特别清晰,所以借用知乎上的一幅图来说明(感谢原作者):

这幅图极其清晰地表明了softmax函数是什么,一图胜千言。

『2』计算softmax函数值的问题

通常情况下,计算softmax函数值不会出现什么问题,例如,当softmax函数表达式里的所有 xi 都是一个“一般大小”的数值 c 时——也就是上图中时,那么,计算出来的函数值

但是,当某些情况发生时,计算函数值就出问题了:

  • c 极其大,导致分子计算时上溢出

  • c 为负数,且很大,此时分母是一个极小的正数,有可能四舍五入为0,导致下溢出

『3』如何解决

所以怎样规避这些问题呢?我们可以用同一个方法一口气解决俩:

即 M 为所有中最大的值,那么我们只需要把计算保持一致。

举个实例:还是以前面的图为例,本来我们计算是用“常规”方法来算的:

现在我们改成:

其中,M=3是中的最大值。

可见计算结果并未改变。

这是怎么做到的呢?通过简单的代数运算就可以参透其中的“秘密”:

通过这样的变换,对任何一个减去M之后,e 的指数的最大值为0,所以不会发生上溢出;同时,分母中也至少会包含一个值为1的项,所以分母也不会下溢出(四舍五入为0)。
所以这个技巧没什么高级的技术含量。

『4』延伸问题

看似已经结案了,但仍然有一个问题:如果softmax函数中的分子发生下溢出,也就是前面所说的 c 为负数,且很大,此时分母是一个极小的正数,有可能四舍五入为0的情况,此时,如果我们把softmax函数的计算结果再拿去计算 log,即 log softmax,其实就相当于计算log(0),所以会得到,但这实际上是错误的,因为它是由舍入误差造成的计算错误。
所以,有没有一个方法,可以把这个问题也解决掉呢?
答案还是采用和前面类似的策略来计算 log softmax 函数值

大家看到,在最后的表达式中,会产生下溢出的因素已经被消除掉了——求和项中,至少有一项的值为1,这使得log后面的值不会下溢出,也就不会发生计算 log(0) 的悲剧。

在很多数值计算的library中,都采用了此类方法来保持数值稳定。

推荐阅读:

【干货】神经网络SRU

基于attention的seq2seq机器翻译实践详解

【干货】基于注意力机制的seq2seq网络

【干货】GRU神经网络


欢迎关注深度学习自然语言处理公众号,我会在这里记录自己在路上的一点一滴!再小的人也有自己的品牌!期待和你一起进步!

如何防止softmax函数上溢出(overflow)和下溢出(underflow)相关推荐

  1. softmax函数上溢出和下溢出(转载+自己理解)

    <Deep Learning>(Ian Goodfellow & Yoshua Bengio & Aaron Courville)第四章「数值计算」中,谈到了上溢出(ove ...

  2. 浅谈上溢overflow和下溢underflow

    目录 一.为什么会出现overflow和underflow? 二.解决方法 一.为什么会出现overflow和underflow? 计算机只能使用有限的bit来描述数字,因此当被描述的数字需要超多的b ...

  3. 深度学习入门(六)——softmax函数的改良

    输出层的设计 机器学习的问题大致可以分为分类问题和回归问题.分类问题是数据属于哪一个类别的问题.比如,区分图像中的人是男性还是女性的问题就是分类问题.而回归问题是根据某个输入预测一个(连续的)数值的问 ...

  4. Softmax 函数解决上溢出(overflow)和下溢出(underflow)问题

    什么是上溢出和下溢出 在计算softmax值的时候,会做e的指数,这可能会数值过大导致导致上溢出,或者数值过小而取0(下溢出) 解决办法 https://blog.csdn.net/csuzhaoqi ...

  5. 矩阵的乘法、乘积(点积)和softmax函数的溢出

    矩阵的乘法比较简单,对应元素分别相乘即可,比如: a1=np.array([1,2]) a2=np.array([3,5]) a3=np.array([[1,2],[3,4]]) [[1,2], [3 ...

  6. 如何防止softmax函数overflow和underflow?

    上溢出:c极其大的时候,计算 e c e^c ec 下溢出:当c趋于负无穷的时候,分母是一个极小的数,导致下溢出 解决方法 令 M = max ⁡ x i , i = 1 , 2 , ⋯ , n M= ...

  7. 【Machine Learning】18.Softmax函数

    Softmax函数 1.导入 2.Softmax函数 2.1 算法简介 2.2 损失函数 3.Tensorflow 3.1 The *Obvious* organization 3.2 preferr ...

  8. Softmax函数与交叉熵

    Softmax函数 背景与定义 导数 softmax的计算与数值稳定性 Loss function 对数似然函数 交叉熵 Loss function求导 TensorFlow 方法1手动实现不建议使用 ...

  9. 关于SoftMax函数的一些介绍

    前言 SoftMax函数是在机器学习中经常出现的,时常出现在输出层中.对于这个函数,大部分blog作者对于它介绍已经很完善了,包括如何玄学设计,如何使用等等,这里只是从数学来源上讨论下这个函数名字的来 ...

  10. softmax函数_反向传播之一:softmax函数

    最好的学习方法就是把内容给其他人讲明白. 如果你看了我的文章感觉一头雾水,那是因为我还没学透. 我目前的理解是:反向传播是神经网络的精要,没搞明白反向传播,神经网络就还没入门. 我的学习计划是: (1 ...

最新文章

  1. python简述题_python的一些基本概念知识和面试题
  2. 入门系列之使用Sysdig监视您的Ubuntu 16.04系统 1
  3. 理解ROS服务和参数---ROS学习第6篇
  4. A. A Prank
  5. 协同过滤:基于用户的协同过滤itemCF
  6. QT的QScriptEngine类的使用
  7. 跨界会对电商行业造成什么影响
  8. 从零开始编写自己的C#框架(14)——T4模板在逻辑层中的应用(三)
  9. itextdef将动态html转为pdf,[C#]使用第三方开源库iText7.pdfHtml,将Html转换成Pdf,以及如何以Html作为打印模板...
  10. 像孙正义为了练英语坚决不说日语一样。我也应该有坚决不看中文文档的心!...
  11. [转载] Java 中的binarySearch方法
  12. zabbix详解(一)——zabbix基本概念
  13. C#基础-获得当前程序的 空间名.类名.方法名
  14. (1)初识云计算-《云计算核心技术剖析》学习笔记
  15. 方正台式计算机初始bios密码,方正电脑刷BIOS的方法
  16. Spring官网下载最新jar包
  17. 前端coursor设置为pointer在移动端点击会出现蓝色背景解决
  18. uniapp 微信分享
  19. 中国零售科技创新企业榜TOP50:有TalkingData也有拼多多...
  20. 一帘心事碎碎念,一眸雪舞剪剪风

热门文章

  1. 织梦(Dedecms) V5.6 plus/carbuyaction.php 本地文件包含漏洞
  2. CS安装卸载测试总结
  3. TensorFlow相关的一些技巧
  4. 企业中该如何防止僵尸网络的入侵?
  5. 信息安全政策(隔离与监控)
  6. css各种居中解决方法
  7. MyEclipse使用过程中的问题及对应设置的总结
  8. 内存记号(Memory Trail)[自定义的名字] --调试方法
  9. java.toString(),(String),String.valueOf的区别
  10. Skyfire-在移动设备上体验silverlight的效果