Logum中的灾难性取消


18

我正在尝试在相对精度较低的双精度浮点中实现以下功能:

logsum(x,y)=log(exp(x)+exp(y))

这在统计应用程序中被广泛使用以添加在对数空间中表示的概率或概率密度。当然,或都很容易溢出或下溢,这很不好,因为日志空间最初是用来避免下溢的。这是典型的解决方案:exp(x)exp(y)

logsum(x,y)=x+log1p(exp(yx))

Cancellation from yx does happen, but is mitigated by exp. Worse by far is when x and log1p(exp(yx)) are close. Here's a relative error plot:

enter image description here

The plot is cut off at 1014 to emphasize the shape of the curve logsum(x,y)=0, about which the cancellation occurs. I've seen error up to 1011 and suspect that it gets much worse. (FWIW, the "ground truth" function is implemented using MPFR's arbitrary-precision floats with 128-bit precision.)

I've tried other reformulations, all with the same result. With log as the outer expression, the same error occurs by taking a log of something near 1. With log1p as the outer expression, cancellation happens in the inner expression.

Now, the absolute error is very small, so exp(logsum(x,y)) has very small relative error (within an epsilon). One might argue that, because a user of logsum is really interested in probabilities (not log probabilities), this terrible relative error isn't a problem. It's likely that it usually isn't, but I'm writing a library function, and I'd like its clients to be able to count on relative error not much worse than rounding error.

It seems I need a new approach. What might it be?


I don't understand your last paragraph. "within an epsilon" doesn't mean anything to me. Do you mean a Unit in the Last Place? As for users being interested in probabilities, a small log probability error will result in a large probability error, so this is not the case.
Aron Ahmadia

Out of curiosity, have you tried taking the "best of" of your two methods and plotting the error of that? Then all you need is the right logic to detect which case you're in (hopefully being less costly or part of the required cost of the algorithm anyway), then switching to the appropriate method.
Aron Ahmadia

@AronAhmadia: "Within an epsilon" means relative error less than a double-precision floating-point epsilon, which is about 2.22e-16. For normal (i.e. not subnormal) floats, it corresponds to about an ulp. Also, if a is the absolute error of x, then the relative error of exp(x) is exp(a)1, which is nearly the identity function near zero. IOW, small absolute error for x implies small relative error for exp(x).
Neil Toronto

Addendum: When absolute error a is near zero. When a>1, for example, you're right: the relative explodes.
Neil Toronto

Answers:


12

The formula

logsum(x,y)=max(x,y)+log1p(exp(abs(xy))
should be numerically stable. It generalizes to a numerically stable computation of
logiexi=ξ+logiexiξ,   ξ=maxixi

In case the logsum is very close to zero and you want high relative accuracy, you can probably use

logsum(x,y)=max(x,y)+lexp(xy)
using an accurate (i.e., more than double precision) implementation of
lexp(z):=log(1+e|z|)
which is nearly linear for small z.

In terms of absolute error, it is. In terms of relative error, it's awful when the output is near zero.
Neil Toronto

@NeilToronto: Please give an example with two explicit inputs x and y, so that I can play with it.
Arnold Neumaier

For x = -0.775 and y = -0.6175, I get 62271 ulps error and 1.007e-11 relative error.
Neil Toronto

1
Calculate highly accurate data points in the range of interest - at least ttwo different ranges are needed because of the asymptotic behavior. One can use the defining expression for z not close to zero. For the exceptional range fit a rational function of sufficiently high degree to it to get the desired accuracy. For numerical stability, use bernstein polynomials or Tchebychev polynomials in numerator and denominator, adapted to the interval of interest. At the end, expand into a continued fraction and find out how much one can truncate the coefficients without imapiring the accuracy.
Arnold Neumaier

1
This gives l=l(z) To get m do the same but applied to the function lexp(z)-l(z).
Arnold Neumaier
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.