机器学习常见模式LogSumExp解密

2018 年 10 月 30 日 论智
来源:feedly
编译:weakish

编者按:Feedly联合创始人、大数据与机器学习主管Kireet Reddy讲解了LogSumExp原理。

机器学习中有很多巧妙的窍门,可以加速训练,提升表现……今天我将讨论LogSumExp这一机器学习中常见的模式。首先给出定义:

我们什么时候会见到这样的式子?常见的一个地方是计算softmax函数的交叉熵损失。如果这听起来冗长难解,那么:1) 习惯一下,ML中太多东西有着疯狂的名字;2) 直接意识到这没什么复杂的。有必要的话可以看看斯坦福cs231n的出色讲解,或者,就本文而言,只需了解softmax是这样一个函数就可以:

其中,分子中的xj是分母中的一个值(其中一个xi)。所以softmax做的基本上是对一些值取幂,然后归一化,使得所有xj的可能值总和为1,以生成所需的概率分布。

所以,你可以把softmax函数看成一种接受任何数字并转换为概率分布的非线性方法。至于交叉熵,只需了解它是对函数取对数。这就涌现出了LogSumExp模式:

为什么这是一种生成概率分布的好方法,也许看起来有点神秘。目前而言,不妨把这当成是信条。

数值稳定性

我们还是接着谈谈LogSumExp吧。首先,从纯数学的角度来说,LogSumExp没什么特别的。但是,当我们讨论计算机上的数学时,LogSumExp就特别起来了。原因在于计算机表示数字的方式。计算机使用固定数目的位元表示数字。几乎所有时刻这都没什么问题,但是,因为不可能用固定数目的位元精确表示数字的无限集合,所以有时这会导致误差。

让我们举例演示这个问题,从xi中取样两个样本:{1000, 1000, 1000}和{-1000, -1000, -1000}。将这两个序列传入softmax函数会得到同一概率分布{1/3, 1/3, 1/3},然后1/3的对数是一个合理的负数。现在让我们尝试用Python算下求和中的一项:

  
  
    
  1. >>> import math

  2. >>> math.e**1000

  3. Traceback (most recent call last):

  4. File "", line 1, in

  5. OverflowError: (34, 'Result too large')

哎哟。也许-1000的运气要好些:

  
  
    
  1. >>> math.e**-1000

  2. 0.0

也不对劲。所以我们碰到了某种数值稳定性问题,即使看起来合理的输入值也会导致溢出。

迂回方案

幸运的是,人们找到了一个很好的缓解方法,根据幂的乘法法则:

以及对数的和差公式:

我们有:

上述变换的关键在于,我们引入了一个不牵涉log或exp函数的常数项c。现在我们只需为c选择一个在所有情形下有效的良好的值。结果发现,max(x1…xn)很不错。

由此我们可以构建对数softmax的新表达式:

现在我们用这个新表达式计算之前的两个样本。对{1000, 1000, 1000}而言,c = 1000,所以xi-c恒为零,代入上式,我们有:

log(3)是一个很合理的数字,计算机计算起来毫无问题。所以上面的样本没问题。同理,{-1000, -1000, -1000}也没问题。

关键点

思考一些例子后,我们可以得到以下结论:

  • 如果xi的值都不会造成稳定性问题,那么“朴素”版本的LogSumExp可以很好地工作。但“改良”版同样可以工作。

  • 如果至少有一个xi的值很大,那么朴素版本会溢出,改良版不会。其他类似的大数值xi同理,而并不大的那些xi基本上逼近零

  • 对于绝对值较大的负数,翻转下符号,道理是一样的。

所以,尽管并不完美,我们在大多数情况下能够得到相当合理的表现,而不会溢出。我创建了一个简单的python脚本,这样,你可以通过亲自试验验证这一点:git.io/fx5Vx

LogSumExp是一个巧妙的窍门,分解了它的机制后,实际上相当容易理解。一旦了解了LogSumExp和数值稳定性问题,你就不会感到一些库的文档和源代码难以理解了。

为了巩固记忆(同时操练下数学),我建议你过一段时间尝试自行推导下数学,并在脑海中设想各种例子,做下推理。接着运行我的代码(或者自己动手重写),以验证你的直觉。

原文地址:https://blog.feedly.com/tricks-of-the-trade-logsumexp/

登录查看更多
21

相关内容

Feedly是一个RSS聚合器应用程序,支持各种网页浏览器和运行iOS或Android的移动设备,也是一个基于云端的服务。 - 维基百科
最新《自动微分手册》77页pdf
专知会员服务
100+阅读 · 2020年6月6日
打怪升级!2020机器学习工程师技术路线图
专知会员服务
98+阅读 · 2020年6月3日
最新《机器学习理论初探》概述
专知会员服务
44+阅读 · 2020年5月19日
【图神经网络(GNN)结构化数据分析】
专知会员服务
115+阅读 · 2020年3月22日
机器学习速查手册,135页pdf
专知会员服务
338+阅读 · 2020年3月15日
Transformer文本分类代码
专知会员服务
116+阅读 · 2020年2月3日
模型压缩究竟在做什么?我们真的需要模型压缩么?
专知会员服务
27+阅读 · 2020年1月16日
【机器学习课程】Google机器学习速成课程
专知会员服务
164+阅读 · 2019年12月2日
激活函数还是有一点意思的!
计算机视觉战队
12+阅读 · 2019年6月28日
机器学习笔试题精选
人工智能头条
13+阅读 · 2018年7月22日
深度学习必须理解的25个概念
机器学习算法与Python学习
5+阅读 · 2018年6月7日
机器学习必知的8大神经网络架构
七月在线实验室
7+阅读 · 2018年4月26日
R语言之数据分析高级方法「时间序列」
R语言中文社区
17+阅读 · 2018年4月24日
图解机器学习的常见算法
机器学习算法与Python学习
5+阅读 · 2018年4月2日
【干货】深入理解变分自编码器
专知
21+阅读 · 2018年3月22日
机器学习面试题精讲(一)
七月在线实验室
4+阅读 · 2018年1月11日
深度学习和普通机器学习之间有何区别?
36大数据
7+阅读 · 2017年12月4日
Do RNN and LSTM have Long Memory?
Arxiv
19+阅读 · 2020年6月10日
Seeing What a GAN Cannot Generate
Arxiv
8+阅读 · 2019年10月24日
Adaptive Neural Trees
Arxiv
4+阅读 · 2018年12月10日
Arxiv
8+阅读 · 2018年1月25日
Arxiv
5+阅读 · 2015年9月14日
VIP会员
相关VIP内容
最新《自动微分手册》77页pdf
专知会员服务
100+阅读 · 2020年6月6日
打怪升级!2020机器学习工程师技术路线图
专知会员服务
98+阅读 · 2020年6月3日
最新《机器学习理论初探》概述
专知会员服务
44+阅读 · 2020年5月19日
【图神经网络(GNN)结构化数据分析】
专知会员服务
115+阅读 · 2020年3月22日
机器学习速查手册,135页pdf
专知会员服务
338+阅读 · 2020年3月15日
Transformer文本分类代码
专知会员服务
116+阅读 · 2020年2月3日
模型压缩究竟在做什么?我们真的需要模型压缩么?
专知会员服务
27+阅读 · 2020年1月16日
【机器学习课程】Google机器学习速成课程
专知会员服务
164+阅读 · 2019年12月2日
相关资讯
激活函数还是有一点意思的!
计算机视觉战队
12+阅读 · 2019年6月28日
机器学习笔试题精选
人工智能头条
13+阅读 · 2018年7月22日
深度学习必须理解的25个概念
机器学习算法与Python学习
5+阅读 · 2018年6月7日
机器学习必知的8大神经网络架构
七月在线实验室
7+阅读 · 2018年4月26日
R语言之数据分析高级方法「时间序列」
R语言中文社区
17+阅读 · 2018年4月24日
图解机器学习的常见算法
机器学习算法与Python学习
5+阅读 · 2018年4月2日
【干货】深入理解变分自编码器
专知
21+阅读 · 2018年3月22日
机器学习面试题精讲(一)
七月在线实验室
4+阅读 · 2018年1月11日
深度学习和普通机器学习之间有何区别?
36大数据
7+阅读 · 2017年12月4日
相关论文
Do RNN and LSTM have Long Memory?
Arxiv
19+阅读 · 2020年6月10日
Seeing What a GAN Cannot Generate
Arxiv
8+阅读 · 2019年10月24日
Adaptive Neural Trees
Arxiv
4+阅读 · 2018年12月10日
Arxiv
8+阅读 · 2018年1月25日
Arxiv
5+阅读 · 2015年9月14日
Top
微信扫码咨询专知VIP会员