Pembatalan bencana dalam logsum

18

Saya mencoba menerapkan fungsi berikut dalam floating point presisi ganda dengan kesalahan relatif rendah :

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

Ini digunakan secara luas dalam aplikasi statistik untuk menambahkan probabilitas atau kepadatan probabilitas yang diwakili dalam ruang log. Tentu saja, baik atau dapat dengan mudah overflow atau underflow, yang akan menjadi buruk karena ruang log digunakan untuk menghindari underflow. Ini adalah solusi khas:exp(x)exp(y)

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

Pembatalan dari memang terjadi, tetapi dikurangi dengan . Lebih buruk lagi adalah ketika dan dekat. Berikut ini plot kesalahan relatif:yxexpxlog1p(exp(yx))

masukkan deskripsi gambar di sini

Plot dipotong pada untuk menekankan bentuk kurva , tentang pembatalan yang terjadi. Saya telah melihat kesalahan hingga dan menduga bahwa itu menjadi jauh lebih buruk. (FWIW, fungsi "kebenaran dasar" diimplementasikan menggunakan float presisi arbitrer MPFR dengan presisi 128-bit.) l o g s u m ( x , y ) = 0 10 - 111014logsum(x,y)=01011

Saya sudah mencoba reformulasi lain, semuanya dengan hasil yang sama. Dengan sebagai ekspresi luar, kesalahan yang sama terjadi dengan mengambil log sesuatu di dekat 1. Dengan sebagai ekspresi luar, pembatalan terjadi di ekspresi dalam.l o g 1 ploglog1p

Sekarang, kesalahan absolut sangat kecil, jadi memiliki kesalahan relatif sangat kecil (dalam epsilon). Orang mungkin berpendapat bahwa, karena pengguna benar-benar tertarik pada probabilitas (bukan probabilitas log), kesalahan relatif yang mengerikan ini bukan masalah. Mungkin biasanya tidak, tapi saya sedang menulis fungsi perpustakaan, dan saya ingin kliennya dapat mengandalkan kesalahan relatif tidak lebih buruk daripada kesalahan pembulatan.l o g s u mexp(logsum(x,y))logsum

Sepertinya saya perlu pendekatan baru. Apa itu?

Neil Toronto
sumber
Saya tidak mengerti paragraf terakhir Anda. "dalam epsilon" tidak berarti apa-apa bagiku. Apakah yang Anda maksud adalah Unit di Tempat Terakhir ? Adapun pengguna yang tertarik pada probabilitas, kesalahan log probabilitas kecil akan menghasilkan kesalahan probabilitas besar, jadi ini bukan masalahnya.
Aron Ahmadia
Karena penasaran, apakah Anda mencoba mengambil yang terbaik dari dua metode Anda dan merencanakan kesalahan itu? Maka yang Anda butuhkan adalah logika yang tepat untuk mendeteksi kasus Anda (mudah-mudahan menjadi lebih murah atau bagian dari biaya yang diperlukan dari algoritma), kemudian beralih ke metode yang sesuai.
Aron Ahmadia
@AronAhmadia: "Within an epsilon" berarti kesalahan relatif kurang dari epsilon floating-point presisi ganda, yaitu sekitar 2.22e-16. Untuk mengapung normal (yaitu bukan subnormal), itu sesuai dengan sekitar ulp. Juga, jika adalah kesalahan absolut , maka kesalahan relatif dari adalah , yang hampir merupakan fungsi identitas mendekati nol. TKI, kesalahan absolut kecil untuk menyiratkan kesalahan relatif kecil untuk . x exp ( x ) exp ( a ) - 1 x exp ( x )axexp(x)exp(a)1xexp(x)
Neil Toronto
Tambahan: Ketika kesalahan absolut mendekati nol. Ketika , misalnya, Anda benar: relatif akan meledak. a > 1aa>1
Neil Toronto

Jawaban:

12

log i e x i = ξ + log i e x i - ξ , ξ = maks i x i

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

Jika logsum sangat dekat dengan nol dan Anda menginginkan akurasi relatif tinggi, Anda mungkin dapat menggunakan menggunakan akurasi (yaitu, lebih dari presisi ganda) implementasi yang hampir linier untuk kecil .l e x p ( z ) : = log ( 1 + e - | z | )

logsum(x,y)=max(x,y)+lexp(xy)
lexp(z):=log(1+e|z|)
z
Arnold Neumaier
sumber
Dalam hal kesalahan absolut, itu. Dalam hal kesalahan relatif, itu mengerikan ketika output mendekati nol.
Neil Toronto
@ NeilToronto: Tolong beri contoh dengan dua input eksplisit dan , sehingga saya bisa bermain dengannya. yxy
Arnold Neumaier
Untuk x = -0,775 dan y = -0,6175, saya mendapatkan 62271 ulps kesalahan dan 1,007e-11 relatif kesalahan.
Neil Toronto
1
Hitung titik data yang sangat akurat dalam rentang minat - setidaknya diperlukan dua rentang berbeda karena perilaku asimptotik. Seseorang dapat menggunakan ekspresi yang didefinisikan untuk z tidak mendekati nol. Untuk rentang yang luar biasa cocok dengan fungsi rasional yang cukup tinggi untuk mendapatkan akurasi yang diinginkan. Untuk stabilitas numerik, gunakan polinomial bernstein atau polinomial Tchebychev dalam pembilang dan penyebut, yang disesuaikan dengan interval waktu. Pada akhirnya, perluas fraksi lanjutan dan cari tahu berapa banyak yang bisa memotong koefisien tanpa meningkatkan akurasi.
Arnold Neumaier
1
Ini memberikan Untuk mendapatkan melakukan hal yang sama tetapi diterapkan pada fungsi lexp (z) -l (z). ml=l(z)m
Arnold Neumaier