A trick in Log-Sum-Exp

March 15, 2018

在计算

z=logn=1Nexp{xn}z=\log\sum_{n=1}^{N}\exp\{x_{n}\}

时,可能会遇到溢出问题:

  1. exp{1000}=inf, log(inf)=inf, 向上溢出
  2. exp{-1000}=0, log(0)无法计算

为了避免这种情况,能够正常计算,将上式转化为:

logn=1Nexp{xn}=a+logn=1Nexp{xna}\log\sum_{n=1}^{N}\exp\{x_{n}\}=a+\log\sum_{n=1}^{N}\exp\{x_{n}-a\}

其中对任意的 a 都成立,这个推导非常简单,这里就不写了。

最简单的做法是把 a 取为 {xn}\{x_{n}\} 中的最大值,即

a=maxnxna=\max_{n} x_{n}

这时 x-a 一定小于等于 0,exp{x-a} 就会在 0 到 1 之间,不会发生上溢出;而当 x=a 时,exp(x-a) = 1,也就是 log 的真数一定大于等于 1,因此也不会发生下溢出。

Reference

Computing Log-Sum-Exp


Profile picture

Written by Armin Li , a venture capitalist. [Weibo] [Subscribe]