Günlük olasılıklarını eklemek neden olasılıkları çarpmaktan daha hızlı?


21

Soruyu çerçevelemek için, bilgisayar biliminde sıklıkla birkaç olasılığın ürününü hesaplamak istiyoruz:

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

En basit yaklaşım basitçe bu sayıları çarpmaktır ve yapacağım da buydu. Ancak, patronum olasılıkların günlüğünü eklemenin daha iyi olduğunu söyledi:

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

Bu, günlük olasılığını verir, ancak gerekirse daha sonra olasılığı elde edebiliriz:

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

Günlük ekleme iki nedenden dolayı daha iyi kabul edilir:

  1. Olasılıkların çarpımı sıfıra yuvarlanacak şekilde "küçük" akışı önler. Olasılıklar çok küçük olduğu için bu genellikle bir risk olabilir.
  2. Daha hızlıdır, çünkü birçok bilgisayar mimarisi çarpma işleminden daha çabuk toplama yapabilir.

Benim sorum ikinci nokta. Ben böyle tarif gördüm, ama günlük alma ek maliyet dikkate almaz! "Günlük maliyeti + toplama maliyeti" ile "çarpma maliyeti" ni karşılaştırmalıyız. Bunu dikkate aldıktan sonra hala daha mı küçük?

Ayrıca, Wikipedia sayfası ( Günlük olasılığı ) bu açıdan kafa karıştırıcıdır: "Günlük formuna dönüşüm pahalı, ancak yalnızca bir kez gerçekleşiyor." Bunu anlamıyorum, çünkü eklemeden önce her dönemin kaydını bağımsız olarak almanız gerektiğini düşünüyorum. Neyi kaçırıyorum?

Son olarak, "bilgisayarlar çarpma işleminden daha hızlı toplama yapar" gerekçesi belirsizdir. Bu x86 komut setine özgü mü, yoksa işlemci mimarilerinin daha temel bir özelliği mi?


18
İlk fayda (taşmadan kaçınmak) genellikle performans kazancından çok daha önemlidir, bu yüzden daha hızlı olmasa bile günlük olasılıklarını kullanırdık.
DW

@DW'nin söylediklerini genişletmek için, performansa bakmaksızın, özellikle de taşma durumunun giderilmesi için kullanılan benzer bir "log-sum-exp hilesi" vardır. Aslında, logaritmaları bir performans iyileştirme tekniği olarak görmeyi ilk kez görmüştüm!
Mehrdad

Yanıtlar:


14

Ayrıca, Wikipedia sayfasının ( https://en.wikipedia.org/wiki/Log_probability ) bu açıdan kafa karıştırıcı olduğunu belirterek, "Günlük formuna dönüştürme pahalıdır, ancak yalnızca bir kez yapılır." Bunu anlamıyorum, çünkü eklemeden önce her dönemin kaydını bağımsız olarak almanız gerektiğini düşünüyorum. Neyi kaçırıyorum?

kez hesaplamak istiyorsanız, haklısınız. N logaritması ve n - 1 eklemelerini hesaplamanız gerekecekken naif yöntem n - 1 gerektirirP(A1)P(An)nn1n1 çarpımını .

Ancak, formun sorgularını yanıtlamak çok yaygındır:

{ 1 , n } ' nin bazı alt kümeleri I için hesaplayın .iIP(Ai)I{1,n}

Bu durumda, tüm yalnızca bir kez hesaplamak için verilerinizi önceden işleyebilir ve | I | eklemeler.logP(Ai)|I|

Son olarak, "bilgisayarlar çarpma işleminden daha hızlı toplama yapar" gerekçesi belirsizdir. Bu x86 komut setine özgü mü, yoksa işlemci mimarilerinin daha temel bir özelliği mi?

Bu daha geniş bir soru. Genel olarak çarpmayı hesaplamak toplama işleminden (muhtemelen?) Daha zordur. Bilgisayar boyutunda doğrusal bir ve b şu anda hesaplamak için nasıl bilmiyorum, oysa (önemsiz bir algoritma kullanarak) bir × b aynı zaman karmaşıklığı (en iyi algoritmalar kontrol ile burada ).a+baba×b

Elbette kesin bir cevap yoktur: örneğin sadece tamsayılarla uğraşıyorsanız ve gücüyle çarpıyorsanız , vardiyayı ekleme işlemleriyle karşılaştırmalısınız.2

Bununla birlikte, bu, tüm yaygın bilgisayar mimarileri için makul bir ifadedir: kayan nokta sayıları ile çarpma toplama işleminden daha yavaş olacaktır.


1
Tüm olasılıklar için logaritmaları hesaplamak için gereken zaman karmaşıklığını da hesaba katmanıza gerek yok mu? P(birben)
David C

Nihai exp () ne olacak? Bu yavaş değil mi?
Mehrdad

Θ(M(n)günlükn)M(n)Θ(nM(n)günlükn+nΣqS|benq|)Ssorgu kümesidir).
md5

2
expn(0,1)günlük10

1
IEEE şamandıraları kullanıyorsanız, ekleme işlemi çarpma işleminden hala daha hızlı mı - bu durumda kesinlikle yapacaksınız? Modern cpus, sayıları çarpmada oldukça iyidir, şamandıra eklenmesi aynı anda yürütülemeyen birkaç adım içerir - mantisleri hizalayın (çıkarma sonucuna göre sola kaydırın), sonra onları ekleyin, sonra normalleştirin (hem de hem taşmayı hem de tetikleyebilir) taşma, yay). Devrede çok fazla kalıp var, mikrokodda her adım bir veya birkaç döngüye mal oluyor.
John Dvorak

4

N-p1,...pN-pben bunları ekleyerek günlük alanında olasılık çarpımları gerçekleştirirsiniz (ki bu daha az zaman alır) ve daha sonra üs kullanarak ilk boşluğunuza geri dönersiniz.

N-

O(n)nO(n2)

Bu arada, bu fikir Montgomery modüler çarpımına benzer, burada çarpımlar Montgomery formunda gerçekleştirilir, bu da normal çarpma ve daha sonra indirgemeden oldukça hızlıdır.



1
@Mehrdad, umarım iki sayının okulda çarpılmasını öğrenmişsinizdir. Bu algoritma hala bilgisayar çiplerinde yaygın olarak kullanılmaktadır, lütfen buraya bakın Demek istediğin, doğrusal zamandan daha kötü olan yazılım seviyesi algoritmaları. Bu çarpma algoritmaları, çarpma devresinde olduğu gibi yaygın olarak kullanılıyor mu?
fade2black


1
Cevabın ruhu hala doğru, değil mi? Çarpma algoritmalarının hiçbiri doğrusal ekleme zamanına uymayacaksa?
Stephen

1
@Stephen, aslında soru çarpma algoritmasının en iyi karmaşıklığının ne olduğu ile ilgili değildi. Yorum yapacak kişiler gerekirse bu konuda ek bilgi verebilirim. Bu konuda uzun bir tartışmanın konu dışı olacağını düşünüyorum. )))
fade2black
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.