Katastrophaler Abbruch in der Logsumme

18

Ich versuche, die folgende Funktion in Gleitkommazahlen mit doppelter Genauigkeit und geringem relativen Fehler zu implementieren :

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

Dies wird in statistischen Anwendungen häufig verwendet, um Wahrscheinlichkeiten oder Wahrscheinlichkeitsdichten hinzuzufügen, die im Protokollbereich dargestellt werden. Natürlich könnte entweder oder leicht überlaufen oder unterlaufen, was schlecht wäre, da der Protokollspeicherplatz verwendet wird, um einen Unterlauf an erster Stelle zu vermeiden. Dies ist die typische Lösung:exp ( y )exp(x)exp(y)

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

Die Stornierung von erfolgt, wird jedoch durch gemildert . Bei weitem schlimmer ist es, wenn und nahe beieinander liegen. Hier ist eine relative Fehlerdarstellung:exp x l o g 1 p ( exp ( y - x ) )yxexpxlog1p(exp(yx))

Bildbeschreibung hier eingeben

Die Darstellung wird bei abgeschnitten , um die Form der Kurve , um die die Aufhebung auftritt. Ich habe Fehler bis zu und den Verdacht, dass es noch viel schlimmer wird. (FWIW, die "Ground Truth" -Funktion wird unter Verwendung von Gleitkommazahlen mit willkürlicher Genauigkeit und 128-Bit-Genauigkeit von MPFR implementiert.) l o g s u m ( x , y ) = 0 10 - 111014logsum(x,y)=01011

Ich habe andere Formulierungen ausprobiert, alle mit dem gleichen Ergebnis. Mit als äußerem Ausdruck tritt der gleiche Fehler auf, wenn ein Protokoll von 1 erstellt wird. Mit als äußerem Ausdruck wird der innere Ausdruck .l o g 1 ploglog1p

Der absolute Fehler ist sehr klein, daher hat einen sehr kleinen relativen Fehler (innerhalb eines Epsilons). Man könnte argumentieren, dass dieser schreckliche relative Fehler kein Problem ist , da ein Benutzer von wirklich an Wahrscheinlichkeiten (nicht Log-Wahrscheinlichkeiten) interessiert ist. Es ist wahrscheinlich, dass dies normalerweise nicht der Fall ist, aber ich schreibe eine Bibliotheksfunktion, und ich möchte, dass die Clients auf relative Fehler zählen können, die nicht viel schlimmer sind als Rundungsfehler.l o g s u mexp(logsum(x,y))logsum

Es scheint, ich brauche einen neuen Ansatz. Was könnte es sein?

Neil Toronto
quelle
Ich verstehe deinen letzten Absatz nicht. "Innerhalb eines Epsilons" bedeutet mir nichts. Meinst du eine Einheit an letzter Stelle ? Für Benutzer, die an Wahrscheinlichkeiten interessiert sind, führt ein kleiner Log-Wahrscheinlichkeitsfehler zu einem großen Wahrscheinlichkeitsfehler. Dies ist also nicht der Fall.
Aron Ahmadia
Haben Sie aus Neugier versucht, das "Beste aus" Ihrer beiden Methoden herauszuholen und den Fehler daraus zu machen? Dann ist alles, was Sie brauchen, die richtige Logik, um festzustellen, in welchem ​​Fall Sie sich befinden (hoffentlich sind Sie weniger kostspielig oder gehören sowieso zu den erforderlichen Kosten des Algorithmus), und dann zu der geeigneten Methode zu wechseln.
Aron Ahmadia
x exp ( x ) exp ( a ) - 1axexp(x)exp(a)1xexp(x)
aa>1

Antworten:

12

logsum(x,y)=max(x,y)+log1p(exp(abs(xy))
logiexi=ξ+logiexiξ,   ξ=maxixi

Wenn die Logsumme sehr nahe bei Null liegt und Sie eine hohe relative Genauigkeit wünschen, können Sie wahrscheinlich mit einer Genauigkeit verwenden (dh mehr als doppelte Genauigkeit) Implementierung von die für kleine nahezu linear ist .L e x p ( z ) : = log ( 1 + e - | z | ) z

logsum(x,y)=max(x,y)+lexp(xy)
lexp(z):=log(1+e|z|)
z
Arnold Neumaier
quelle
In absoluten Fehler ausgedrückt ist es. In Bezug auf den relativen Fehler ist es schrecklich, wenn die Ausgabe nahe Null ist.
Neil Toronto
@NeilToronto: Bitte gib ein Beispiel mit zwei expliziten Eingaben und , damit ich damit spielen kann. yxy
Arnold Neumaier
Für x = -0,775 und y = -0,6175 erhalte ich den Fehler 62271 ulps und den relativen Fehler 1.007e-11.
Neil Toronto
1
Berechnen Sie hochgenaue Datenpunkte im interessierenden Bereich - aufgrund des asymptotischen Verhaltens sind mindestens zwei verschiedene Bereiche erforderlich. Man kann den definierenden Ausdruck für z verwenden, der nicht nahe Null ist. Passen Sie für den außergewöhnlichen Bereich eine rationale Funktion mit einem ausreichend hohen Grad an, um die gewünschte Genauigkeit zu erzielen. Verwenden Sie für die numerische Stabilität Bernstein-Polynome oder Tchebychev-Polynome in Zähler und Nenner, angepasst an das Intervall von Interesse. Erweitern Sie am Ende zu einem fortgesetzten Bruch und finden Sie heraus, wie viel man die Koeffizienten kürzen kann, ohne die Genauigkeit zu beeinträchtigen.
Arnold Neumaier
1
Dies ergibt Um mache dasselbe, aber wende es auf die Funktion lexp (z) -l (z) an. ml=l(z)m
Arnold Neumaier