1 起源

在一些问题中,我们的目标函数是max(x1,x2,...xn) 或者min(x1,x2,....xn),但是max和min都不是可微函数,因而这些目标函数无法直接用到深度学习任务中

2 交叉熵与softmax

在神经网络中,假设我们最后一层使用的是softmax,来得到各个概率分布,softmax的形式为,其中

而在分类问题或者一些其他问题中,我们会使用到交叉熵,其中的每一项,我们都有形如

其中,减号后面的部分,就是这一个博客需要说明的log-sum-exp (LSE)

2.1 softmax的上下溢出

假设我们目前有两个例子:一个数据集为[10000,10000,10000](很大的数,exp(xi)之后会上溢出);另一个数据集为[-10000,-10000,-10000](很小的数,exp(xi)之后会下溢出)

这两组数据,如果我们用肉眼去看,肯定可以很轻松地得到它的概率分布为,但是,如果我们用python去计算这两个数据集的概率的时候:会是这样的情况:

import numpy as np
def softmax(lst):lst_exp=np.exp(lst)total=np.sum(lst_exp)return(lst_exp/total)softmax([10,10,10])
#array([0.33333333, 0.33333333, 0.33333333])
#数值不大的时候,可以得到正确的softmax结果softmax([10000,10000,10000])
'''
RuntimeWarning: overflow encountered in expThis is separate from the ipykernel package so we can avoid doing imports until
python\python37\lib\site-packages\ipykernel_launcher.py:5: RuntimeWarning: invalid value encountered in true_divide"""
array([nan, nan, nan])
'''softmax([-10000,-10000,-10000])'''RuntimeWarning: invalid value encountered in true_divide"""
array([nan, nan, nan])
'''

我们可以发现,数值不是很大/小的时候,是可以得到正确的softmax结果的,但是如果是我们给的这两组极大/小的数据集,那么会得到上/下溢出,得不到正确的softmax结果

在softmax的时候是针对指数进行操作的,值一定会很大。但是之后在计算cross-entropy的时候由于log的存在导致值又回到正常范围。

因此在实际操作中,考虑如何去重写,以得到正常范围内的值。也就是如何去近似log-sum-exp。

3 log-sum-exp trick

我们假设第j项是x中最大的:

而之前我们计算softmax项的时候,有:

所以我们现在有:

此时差分比绝对数值要小很多了,大的数据也就可以计算了

#这里的意义其实和前面的softmax函数有一点小小的出入,这里是前面softmax的结果再经过了log之后的内容np.log([1/3,1/3,1/3])
#array([-1.09861229, -1.09861229, -1.09861229])import numpy as np
def softmax_log(lst):max_val=np.max(lst)lst=lst-max_val#lst就相当于xk-xjlst_exp=np.exp(lst)total=np.sum(lst_exp)total=np.log(total)#最后一项return(lst-total)softmax_log([10000,10000,10000])
#array([-1.09861229, -1.09861229, -1.09861229])softmax_log([-10000,-10000,-10000])
#array([-1.09861229, -1.09861229, -1.09861229])softmax_log([100,100,100])
#array([-1.09861229, -1.09861229, -1.09861229])

4 max的平滑

根据泰勒分解,我们有:

于是我们这里令 上式的X为x+a,c为x,f(X)=log(X)

所以

也即 

而当xj是最大的一项时,我们第二项可以忽略不计(值比第一项要小很多)

所以

参考资料 关于LogSumExp - 知乎 (zhihu.com)

max函数的平滑(log-sum-exp trick)相关推荐

  1. CVX使用CVXQUAD替换CVX中的log、exp等函数

    CVX中涉及log.exp.熵的函数都是使用的连续逼近方法来近似原函数,这种逼近慢且精度不高,可能会导致结果出现failed.Inaccurate等情况,导致结果不准确,甚至出现Nan,CVX本身也会 ...

  2. mybatis-plus max函数,sum函数的使用

    最近在使用mybatis-plus,发现在对于一些简单函数的使用,官方文档上面没有说明,特此记录下自己的使用方式 max,min,sum函数的使用 QueryWrapper<MemberLeve ...

  3. MySQL max()函数

    转载自  MySQL max()函数 MySQL MAX函数介绍 MySQL MAX()函数返回一组值中的最大值.MAX()函数在许多查询中非常方便,例如查找最大数量,最昂贵的产品以及客户的最大付款. ...

  4. python key=lambda函数_使用’key’和lambda表达式的python max函数

    我来自OOP背景,尝试学习Python.我使用的是max函数,该函数使用lambda表达式返回Player类型的实例,其中players列表中的totalScore最大. def winner(): ...

  5. 成功解决ImportError: cannot import name ‘spline‘ from ‘scipy.interpolate‘—利用make_interp_spline函数绘制平滑的曲线

    成功解决ImportError: cannot import name 'spline' from 'scipy.interpolate'-利用make_interp_spline函数绘制平滑的曲线 ...

  6. Pytorch中tensor维度和torch.max()函数中dim参数的理解

    Pytorch中tensor维度和torch.max()函数中dim参数的理解 维度 参考了 https://blog.csdn.net/qq_41375609/article/details/106 ...

  7. Matlab的Max函数详解

    1.M = max(A) 描述:返回向量 A 中的最大值,如果 A 为矩阵,则返回每列的最大值组成的行向量. 参数:A 是待求最大值的向量或矩阵. 输出:M 是向量 A 中的最大值行向量,如果 A 为 ...

  8. MATLAB-索引超出矩阵维度下标索引必须为正整数类型或逻辑类型 max()函数,一种解决办法

    在使用matlab的max( )函数时,报错:下标索引必须为正整数类型或逻辑类型. 我检查了一遍数组Ldb,索引是没有问题的.matlab的索引是从1开始的,这一点没有用错. 再检查后发现程序里有这样 ...

  9. pandas使用max函数和min函数计算dataframe日期(时间)数据列中最大日期和最小日期对应的数据行(maximum and minimum date or time row)

    pandas使用max函数和min函数计算dataframe日期(时间)数据列中最大日期和最小日期对应的数据行(maximum and minimum date or time row in data ...

最新文章

  1. 白盒测试方法之语句覆盖测试
  2. 关于微信手机端IOS系统中input输入框无法输入的问题
  3. 斯坦福前校长John Hennessy、张亚勤等一众大佬云集,共探最前沿技术 | CNCC2020
  4. day12-mysql 事务与索引
  5. 三维重建 几何方法 深度学习_基于深度学习的视觉三维重建研究总结
  6. 14-Clothes衣服
  7. 一次性杯子机器人挂件手工制作_变废为宝 ———环保笔筒制作
  8. css 毛玻璃_CSS实现雨滴动画效果
  9. UITableView上的iOS UIRefreshControl
  10. 最近学习 variant configuration
  11. office for mac的字体设置
  12. MIUI9修改手机机型 修改王者荣耀版本
  13. 量化新手初识Campisi模型
  14. centos查询mysql端口被占用_centos查看端口占用情况
  15. php图片素描化,ps怎么把图片变成素描图片
  16. 苹果Mac mini装win 7系统
  17. 浅析漫谈EOS之存储
  18. linux下非root用户如何修改root权限的文件
  19. 极限中0除以常数_基本不等式中常用公式百度作业帮
  20. CSS基础(10)- 常规流

热门文章

  1. HTML5 元素选择流程图
  2. Java编程的逻辑 (29) - 剖析String
  3. js中继承的几种用法总结(apply,call,prototype)
  4. vs2013编译boost1.55.0 32/64位
  5. memcached服务器搭建(RedHat5)
  6. 使用Convirt 2.0.1管理虚拟机环境
  7. 内存的静态分配和动态分配的区别【转】 静态分配内存与动态分配内存的区别
  8. 得到例会听后感悟_20190507_重和远
  9. java 单字节_java文件读取。(单字节读取和按行读取读取)
  10. mysql停止主从_不停止mysql服务配置主从