Mengapa menambahkan probabilitas log lebih cepat daripada mengalikan probabilitas?

21

Untuk membingkai pertanyaan, dalam ilmu komputer sering kita ingin menghitung produk dari beberapa probabilitas:

P(A,B,C) = P(A) * P(B) * P(C)

Pendekatan paling sederhana adalah melipatgandakan angka-angka ini, dan itulah yang akan saya lakukan. Namun, bos saya mengatakan lebih baik menambahkan log probabilitas:

log(P(A,B,C)) = log(P(A)) + log(P(B)) + log(P(C))

Ini memberikan probabilitas log, tetapi kita bisa mendapatkan probabilitas setelahnya jika perlu:

P(A,B,C) = e^log(P(A,B,C))

Penambahan log dianggap lebih baik karena dua alasan:

  1. Ini mencegah "underflow" di mana produk probabilitas sangat kecil sehingga dibulatkan menjadi nol. Ini sering bisa menjadi risiko karena probabilitas seringkali sangat kecil.
  2. Itu lebih cepat karena banyak arsitektur komputer dapat melakukan penambahan lebih cepat daripada perkalian.

Pertanyaan saya adalah tentang poin kedua. Ini adalah bagaimana saya melihatnya dijelaskan, tetapi tidak memperhitungkan biaya tambahan untuk mendapatkan log! Kita harus membandingkan "biaya log + biaya penambahan" ke "biaya penggandaan". Apakah masih lebih kecil setelah memperhitungkannya?

Juga, halaman Wikipedia ( Kemungkinan log ) membingungkan dalam hal ini, yang menyatakan "Konversi ke formulir log mahal, tetapi hanya dilakukan sekali." Saya tidak mengerti ini, karena saya pikir Anda perlu mengambil log dari setiap istilah secara independen sebelum menambahkan. Apa yang saya lewatkan?

Akhirnya, pembenaran bahwa "komputer melakukan penambahan lebih cepat daripada multiplikasi" agak kabur. Apakah itu spesifik untuk set instruksi x86, atau itu beberapa sifat yang lebih mendasar dari arsitektur prosesor?

Stephen
sumber
18
Manfaat pertama (menghindari underflow) seringkali jauh lebih penting daripada keuntungan kinerja, jadi bahkan jika itu tidak lebih cepat kita masih akan menggunakan probabilitas log.
DW
Untuk memperluas apa yang dikatakan @DW, ada "trik log-sum-exp" yang serupa yang digunakan secara khusus untuk mengatasi underflow, tanpa memperhatikan kinerja apa pun. Bahkan, ini adalah pertama kalinya saya melihat seseorang menganggap mengambil logaritma sebagai teknik peningkatan kinerja!
Mehrdad

Jawaban:

14

Juga, halaman Wikipedia ( https://en.wikipedia.org/wiki/Log_probability ) membingungkan dalam hal ini, menyatakan "Konversi ke bentuk log mahal, tetapi hanya dilakukan sekali." Saya tidak mengerti ini, karena saya pikir Anda perlu mengambil log dari setiap istilah secara independen sebelum menambahkan. Apa yang saya lewatkan?

Jika Anda hanya ingin menghitung satu kali, maka Anda benar. Anda harus menghitung n logaritma dan penambahan n - 1 , sedangkan metode naif membutuhkan perkalian n - 1 .P(A1)P(An)nn1n1

Namun, sangat umum bahwa Anda ingin menjawab pertanyaan dari formulir:

Hitung untuk beberapa subset I dari { 1 , n } .iIP(Ai)I{1,n}

Dalam hal ini, Anda dapat memproses data Anda untuk menghitung semua hanya sekali, dan menjawab setiap permintaan dengan melakukan | Aku | tambahan.logP(Ai)|I|

Akhirnya, pembenaran bahwa "komputer melakukan penambahan lebih cepat daripada multiplikasi" agak kabur. Apakah itu spesifik untuk set instruksi x86, atau itu beberapa sifat yang lebih mendasar dari arsitektur prosesor?

Ini pertanyaan yang lebih luas. Secara umum (mungkin?) Lebih sulit untuk menghitung perkalian daripada penambahan. Komputasi adalah linier dalam ukuran a dan b (menggunakan algoritma trivial), sedangkan kita saat ini tidak tahu bagaimana menghitung a × b dengan kompleksitas waktu yang sama (periksa algoritma terbaik di sini ).a+baba×b

Tentu saja tidak ada jawaban pasti: misalnya jika Anda hanya berurusan dengan bilangan bulat dan Anda mengalikannya dengan angka , maka Anda harus membandingkan shift dengan operasi tambah.2

Namun demikian ini adalah pernyataan yang masuk akal pada semua arsitektur komputer umum: perkalian pada angka floating-point akan lebih lambat daripada penambahan.

md5
sumber
1
Bukankah Anda juga perlu memperhitungkan kompleksitas waktu yang diperlukan untuk menghitung logaritma untuk semua probabilitas ? P(Ai)
David C
Bagaimana dengan exp akhir ()? Bukankah itu lambat?
Mehrdad
@ DavidC: Saya tidak mencoba menghitung kompleksitas waktu keseluruhan. Saya hanya menjawab pertanyaan "apakah perkalian lebih cepat daripada penambahan". Tetapi dalam komputasi umum logaritma angka floating-point pada skala perangkat lunak dapat mengambil mana M ( n ) adalah kompleksitas dari algoritma multiplikasi. Sehingga akan memberikan Θ ( n M ( n ) log n + n Σ q Q | I q | ) kompleksitas (di mana QΘ(M(n)logn)M(n)Θ(nM(n)logn+nqQ|Iq|)Qadalah himpunan pertanyaan).
md5
2
@Mehrdad: Sama sulitnya dengan menghitung logaritma. Namun saya tidak yakin Anda harus melakukan itu. Misalnya, jika Anda hanya membandingkan probabilitas, Anda lebih suka tidak menghitung akhir . Perkalian n angka dalam ( 0 , 1 ) dapat dengan cepat menjadi sangat kecil, jadi untuk alasan yang sama kami mencoba menghindari underflow dengan menggunakan probabilitas log, kita harus tetap dalam bentuk logaritmik pada akhirnya (misalnya dengan menghitung log di basis 10 , sehingga lebih "terbaca oleh manusia"). expn(0,1)log10
md5
1
Apakah penambahan masih lebih cepat daripada perkalian jika Anda menggunakan IEEE float - yang tentunya Anda akan lakukan dalam kasus ini? CPU modern cukup baik dalam mengalikan angka sedangkan penambahan float memiliki beberapa langkah yang tidak dapat dieksekusi secara bersamaan - menyelaraskan mantra (bergeser ke kiri berdasarkan hasil pengurangan), kemudian menambahkannya, kemudian menormalkan (yang dapat memicu baik underflow dan meluap, yay). Dalam rangkaian itu cukup banyak mati, dalam mikrokode setiap langkah membutuhkan satu atau beberapa siklus.
John Dvorak
4

Np1,...pNpi

N

O(n)nO(n2)

Ngomong-ngomong, ide ini mirip dengan multiplikasi modular Montgomery, di mana multiplikasi dilakukan dalam bentuk Montgomery yang jauh lebih cepat daripada multiplikasi biasa dan kemudian reduksi.

fade2black
sumber
1
@Mehrdad, saya harap Anda belajar multiplikasi sekolah dari dua angka. Algoritme itu masih banyak digunakan pada chip komputer, silakan lihat di sini. Apa yang Anda maksud adalah algoritma level perangkat lunak yang masih lebih buruk daripada waktu linier. Apakah algoritma multiplikasi ini banyak digunakan seperti pada rangkaian multiplikasi?
fade2black
1
Semangat jawabannya masih benar, kan? Jika tidak ada algoritma multiplikasi yang cocok dengan waktu penambahan linier?
Stephen
1
@Stephen, pada kenyataannya pertanyaannya bukan tentang apa kompleksitas yang tepat dari algoritma multiplikasi. Saya bisa memberikan informasi tambahan tentang hal ini jika komentator diperlukan. Saya pikir diskusi panjang tentang itu akan menjadi topik di sini. )))
fade2black