机器学习 - 计算 Log-Sum-Exp

计算 Log-Sum-Exp

[原文-Computing Log-Sum-Exp]

本文的计算技巧是有效的,但在机器学习课程上没有明确提到.

假设 N 个 值的数据集 {xn}Nn=1,需要计算的值为:

z=logNn=1exp{xn}

当采用 softmax 对 multinomial 分布进行参数化时,比如,logistic 回归和有多于 2 个无序类别时,这种计算经常出现.

如果想要计算 log likehood,由于存在归一化常数,也会看到这种表达式.

直接进行计算,则是灾难性的,因为存在下溢(underflow) 和上溢(overflow), 取决于 xn 的尺度(scale).

假设一种简单的例子, 向量 [0,1,0] , 看着是很直接明了的,得到的结果 z=1.55 .

z=ln(exp(0)+exp(1)+exp(0))=ln(2+e)=1.55

当向量为 [1000,1001,1000] 时, z=ln(exp(1000)+exp(1001)+exp(1000))=inf .

当向量为 [1000,999,1000] 时, z=ln(exp(1000)+exp(999)+exp(1000))=inf .

中间发生了什么?

在 64-bit 系统中,因为下溢(underflow) 和上溢(overflow) 的存在, exp{1000}=inf , exp{1000}=0 .

即使 log 会以无限精度(infinite precision) 再次合理的缩放(scaled)数值, 但在实际的计算机上,是不可行的.

因此,解决方案是?

采取的技巧是:

logNn=1exp{xn}=a+logNn=1exp{xna}

a 为任意数.

上式意味着,我们可以任意的平移指数的中心值, 放大或缩小.

一种典型的是使,

a={max}nxn

这样保证了取指数时的最大值为0.

这种技巧使得绝对不会出现上溢(overflow),即使其余的下溢(underflow),也可以得到一个合理的值.

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值