max函数的平滑(log-sum-exp trick)
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)相关推荐
- CVX使用CVXQUAD替换CVX中的log、exp等函数
CVX中涉及log.exp.熵的函数都是使用的连续逼近方法来近似原函数,这种逼近慢且精度不高,可能会导致结果出现failed.Inaccurate等情况,导致结果不准确,甚至出现Nan,CVX本身也会 ...
- mybatis-plus max函数,sum函数的使用
最近在使用mybatis-plus,发现在对于一些简单函数的使用,官方文档上面没有说明,特此记录下自己的使用方式 max,min,sum函数的使用 QueryWrapper<MemberLeve ...
- MySQL max()函数
转载自 MySQL max()函数 MySQL MAX函数介绍 MySQL MAX()函数返回一组值中的最大值.MAX()函数在许多查询中非常方便,例如查找最大数量,最昂贵的产品以及客户的最大付款. ...
- python key=lambda函数_使用’key’和lambda表达式的python max函数
我来自OOP背景,尝试学习Python.我使用的是max函数,该函数使用lambda表达式返回Player类型的实例,其中players列表中的totalScore最大. def winner(): ...
- 成功解决ImportError: cannot import name ‘spline‘ from ‘scipy.interpolate‘—利用make_interp_spline函数绘制平滑的曲线
成功解决ImportError: cannot import name 'spline' from 'scipy.interpolate'-利用make_interp_spline函数绘制平滑的曲线 ...
- Pytorch中tensor维度和torch.max()函数中dim参数的理解
Pytorch中tensor维度和torch.max()函数中dim参数的理解 维度 参考了 https://blog.csdn.net/qq_41375609/article/details/106 ...
- Matlab的Max函数详解
1.M = max(A) 描述:返回向量 A 中的最大值,如果 A 为矩阵,则返回每列的最大值组成的行向量. 参数:A 是待求最大值的向量或矩阵. 输出:M 是向量 A 中的最大值行向量,如果 A 为 ...
- MATLAB-索引超出矩阵维度下标索引必须为正整数类型或逻辑类型 max()函数,一种解决办法
在使用matlab的max( )函数时,报错:下标索引必须为正整数类型或逻辑类型. 我检查了一遍数组Ldb,索引是没有问题的.matlab的索引是从1开始的,这一点没有用错. 再检查后发现程序里有这样 ...
- pandas使用max函数和min函数计算dataframe日期(时间)数据列中最大日期和最小日期对应的数据行(maximum and minimum date or time row)
pandas使用max函数和min函数计算dataframe日期(时间)数据列中最大日期和最小日期对应的数据行(maximum and minimum date or time row in data ...
最新文章
- 白盒测试方法之语句覆盖测试
- 关于微信手机端IOS系统中input输入框无法输入的问题
- 斯坦福前校长John Hennessy、张亚勤等一众大佬云集,共探最前沿技术 | CNCC2020
- day12-mysql 事务与索引
- 三维重建 几何方法 深度学习_基于深度学习的视觉三维重建研究总结
- 14-Clothes衣服
- 一次性杯子机器人挂件手工制作_变废为宝 ———环保笔筒制作
- css 毛玻璃_CSS实现雨滴动画效果
- UITableView上的iOS UIRefreshControl
- 最近学习 variant configuration
- office for mac的字体设置
- MIUI9修改手机机型 修改王者荣耀版本
- 量化新手初识Campisi模型
- centos查询mysql端口被占用_centos查看端口占用情况
- php图片素描化,ps怎么把图片变成素描图片
- 苹果Mac mini装win 7系统
- 浅析漫谈EOS之存储
- linux下非root用户如何修改root权限的文件
- 极限中0除以常数_基本不等式中常用公式百度作业帮
- CSS基础(10)- 常规流
热门文章
- HTML5 元素选择流程图
- Java编程的逻辑 (29) - 剖析String
- js中继承的几种用法总结(apply,call,prototype)
- vs2013编译boost1.55.0 32/64位
- memcached服务器搭建(RedHat5)
- 使用Convirt 2.0.1管理虚拟机环境
- 内存的静态分配和动态分配的区别【转】 静态分配内存与动态分配内存的区别
- 得到例会听后感悟_20190507_重和远
- java 单字节_java文件读取。(单字节读取和按行读取读取)
- mysql停止主从_不停止mysql服务配置主从