ログサムの壊滅的なキャンセル


18

相対誤差の少ない倍精度浮動小数点で次の関数を実装しようとしています。

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

これは統計アプリケーションで広く使用され、ログスペースで表される確率または確率密度を追加します。もちろん、またはは簡単にオーバーフローまたはアンダーフローする可能性がありますが、そもそもログスペースがアンダーフローを回避するために使用されるため、これは悪いことです。これが典型的な解決策です。exp(x)exp(y)

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

からのキャンセルは発生しますが、によって軽減されます。さらに悪いのは、とが近い場合です。相対誤差プロットは次のとおりです。yxexpxlog1p(exp(yx))

ここに画像の説明を入力してください

プロットはれ、キャンセルが発生する曲線の形状を強調します。最大までのエラーが表示されましたが、さらに悪化すると思われます。(FWIW、「グラウンドトゥルース」関数は、128ビット精度のMPFRの任意精度の浮動小数点を使用して実装されます。) l o g s u mx y = 0 10 111014logsum(x,y)=01011

私は他の改革を試みましたが、すべて同じ結果になりました。外側の式と、同じエラーがで1近く何かのログを取ることによって発生外側の表現として、キャンセルは、内側の式で行わ。l o g 1 ploglog1p

現在、絶対誤差は非常に小さいため、相対誤差は非常に小さくなっています(イプシロン内)。ユーザーは(ログ確率ではなく)確率に本当に関心があるので、このひどい相対誤差は問題ではないと主張するかもしれません。通常はそうではない可能性がありますが、私はライブラリ関数を書いています。そのクライアントは、丸め誤差よりもそれほど悪くない相対誤差を期待できるようにしたいと思います。l o g s u mexp(logsum(x,y))logsum

新しいアプローチが必要なようです。何だろう?


あなたの最後の段落がわかりません。「イプシロン内」は私には何の意味もありません。最後の場所のユニットを意味しますか?確率に関心があるユーザーに関しては、小さな対数確率誤差は大きな確率誤差になりますので、そうではありません。
アロンアーマディア

好奇心から、あなたの2つの方法の「ベスト」を取り、そのエラーをプロットしようとしましたか?必要なのは、あなたがどのケースにいるのかを検出する適切なロジック(低コストであるか、アルゴリズムの必要なコストの一部であることが望ましい)で、適切な方法に切り替えます。
アロンアーマディア

@AronAhmadia:「イプシロン内」とは、約2.22e-16の倍精度浮動小数点イプシロンより小さい相対誤差を意味します。通常の(非正規ではない)フロートの場合、約ulpに対応します。また、がの絶対誤差である場合の相対誤差はであり、ほぼゼロに近い恒等関数です。IOW、小さな絶対誤差は、小さな相対誤差を意味します。axexp(x)exp(a)1xexp(x)
ニールトロント

補遺:絶対誤差がゼロに近い場合。とき、例えば、あなたは正しい:相対爆発。aa>1
ニールトロント

回答:


12

式 は数値的に安定している必要があります。安定した計算

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

ログサムがゼロに非常に近く、高い相対精度が必要な場合は、おそらく を使用できます。 (つまり、倍精度以上)実装 。 小さなほぼ線形です。l e x pz = log 1 + e | z |z

logsum(x,y)=max(x,y)+lexp(xy)
lexp(z):=log(1+e|z|)
z

絶対誤差に関しては、そうです。相対誤差に関しては、出力がゼロに近い場合はひどいです。
ニールトロント

@NeilToronto:2つの明示的な入力と例を挙げてください。yxy
アーノルドノイマイアー

x = -0.775およびy = -0.6175の場合、62271 ulpsエラーと1.007e-11相対エラーが発生します。
ニールトロント

1
対象範囲内の非常に正確なデータポイントを計算します-漸近的挙動のため、少なくとも2つの異なる範囲が必要です。ゼロに近くないzの定義式を使用できます。例外的な範囲については、十分な程度の合理的な関数をそれに適合させて、所望の精度を得ます。数値の安定性を得るには、分子と分母に対象の区間に適応したbernstein多項式またはTchebychev多項式を使用します。最後に、連続分数に展開し、精度を損なうことなく係数を切り捨てられる量を見つけます。
アーノルドノイマイアー

1
これにより、得られますを取得するには、関数lexp(z)-l(z)に適用します。ml=l(z)m
アーノルドノイマイアー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.