Perché l'aggiunta delle probabilità di registro è più rapida della moltiplicazione delle probabilità?


21

Per inquadrare la domanda, nell'informatica spesso vogliamo calcolare il prodotto di diverse probabilità:

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

L'approccio più semplice è semplicemente quello di moltiplicare questi numeri, ed è quello che stavo per fare. Tuttavia, il mio capo ha detto che è meglio aggiungere il registro delle probabilità:

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

Questo dà la probabilità del registro, ma possiamo ottenere la probabilità in seguito, se necessario:

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

L'aggiunta del registro è considerata migliore per due motivi:

  1. Impedisce "underflow" per cui il prodotto delle probabilità è così piccolo che viene arrotondato a zero. Questo può essere spesso un rischio poiché le probabilità sono spesso molto piccole.
  2. È più veloce perché molte architetture di computer possono eseguire l'aggiunta più rapidamente della moltiplicazione.

La mia domanda riguarda il secondo punto. Questo è come l'ho visto descritto, ma non tiene conto del costo aggiuntivo di ottenere il registro! Dovremmo confrontare il "costo del registro + costo dell'aggiunta" con il "costo della moltiplicazione". È ancora più piccolo dopo averlo preso in considerazione?

Inoltre, la pagina di Wikipedia ( Probabilità di registro ) è confusa in questo senso, affermando che "La conversione in forma di registro è costosa, ma è sostenuta solo una volta". Non capisco questo, perché penso che dovresti prendere il registro di ogni termine in modo indipendente prima di aggiungere. Cosa mi sto perdendo?

Infine, la giustificazione secondo cui "i computer eseguono l'aggiunta più velocemente della moltiplicazione" è piuttosto vaga. È specifico del set di istruzioni x86 o è un tratto più fondamentale delle architetture di processori?


18
Il primo vantaggio (evitando il underflow) è spesso molto più importante dell'aumento delle prestazioni, quindi anche se non fosse più veloce utilizzeremmo comunque le probabilità di log.
DW

Per espandere ciò che ha detto @DW, esiste un simile "trucco log-sum-exp" utilizzato specificamente per indirizzare il underflow, senza alcun riguardo per le prestazioni. In effetti, questa era la prima volta che vedevo qualcuno considerare i logaritmi come una tecnica di miglioramento delle prestazioni!
Mehrdad,

Risposte:


14

Inoltre, la pagina di Wikipedia ( https://en.wikipedia.org/wiki/Log_probability ) è confusa in questo senso, affermando "La conversione in modulo di registrazione è costosa, ma è sostenuta solo una volta." Non capisco questo, perché penso che dovresti prendere il registro di ogni termine in modo indipendente prima di aggiungere. Cosa mi sto perdendo?

Se vuoi solo calcolare una volta, allora hai ragione. Dovrai calcolare n logaritmi e n - 1 aggiunte, mentre il metodo ingenuo richiede n - 1 moltiplicazioni.P(A1)P(An)nn1n1

Tuttavia, è molto comune che si desideri rispondere alle domande del modulo:

Calcola per alcuni sottogruppi I di { 1 , ... n } .iIP(Ai)I{1,n}

In tal caso, è possibile preelaborare i dati per calcolare tutti i una sola volta e rispondere a ciascuna query eseguendo | Io | integrazioni.logP(Ai)|I|

Infine, la giustificazione secondo cui "i computer eseguono l'aggiunta più velocemente della moltiplicazione" è piuttosto vaga. È specifico del set di istruzioni x86 o è un tratto più fondamentale delle architetture di processori?

Questa è una domanda più ampia. In generale, è (probabilmente?) Più difficile calcolare la moltiplicazione rispetto all'aggiunta. Calcolo è lineare nella dimensione di un e B (utilizzando l'algoritmo banale), mentre al momento non sappiamo come calcolare un × b con la stessa complessità temporale (controllare le migliori algoritmi qui ).a+baba×b

Ovviamente non esiste una risposta definitiva: ad esempio se si tratta solo di numeri interi e si moltiplica per potenze di , si dovrebbe piuttosto confrontare il turno con le operazioni di aggiunta.2

Tuttavia, questa è un'affermazione ragionevole su tutte le architetture di computer comuni: la moltiplicazione su numeri in virgola mobile sarà più lenta dell'aggiunta.


1
Non è inoltre necessario tenere conto della complessità temporale necessaria per calcolare i logaritmi per tutte le probabilità ? P(UNio)
David C,

Che dire dell'exp () finale? Non è lento?
Mehrdad,

@DavidC: non ho provato a calcolare la complessità temporale complessiva. Ho appena risposto alla domanda "la moltiplicazione è più veloce dell'aggiunta". Ma in generale il logaritmo informatico dei numeri in virgola mobile su scala software può richiedere dove M ( n ) è la complessità di un algoritmo di moltiplicazione. Quindi darebbe una complessità Θ ( n M ( n ) log n + n q Q | I q | ) (dove QΘ(M(n)logn)M(n)Θ(nM(n)logn+nqQ|Iq|)Qè l'insieme di query).
md5,

2
@Mehrdad: è difficile come calcolare un logaritmo. Tuttavia non sono sicuro che dovrai mai farlo. Ad esempio, se confronti solo le probabilità, preferiresti non calcolare l' finale . La moltiplicazione di n numeri in ( 0 , 1 )expn(0,1) può diventare rapidamente molto piccola, quindi per lo stesso motivo proviamo a evitare il underflow utilizzando le probabilità del log, alla fine dovremmo rimanere nella forma logaritmica (ad es. Calcolando il in base 10 , in modo che sia ancora più "leggibile dall'uomo"). log10
md5,

1
L'aggiunta è ancora più veloce della moltiplicazione se si utilizzano i float IEEE, cosa che in questo caso lo farai sicuramente? I cpus moderni sono piuttosto bravi a moltiplicare i numeri mentre l'aggiunta float ha un paio di passaggi che non possono essere eseguiti contemporaneamente: allineare le mantisse (spostare a sinistra in base al risultato della sottrazione), quindi effettivamente aggiungerle, quindi normalizzare (che può innescare sia underflow che straripamento, yay). Nel circuito è abbastanza difficile, nel microcodice ogni passaggio costa un ciclo o pochi.
John Dvorak,

4

Per "sostenuto una volta" probabilmente significa che se hai probabilitàNp1,...pNpi

N

Infine, l'aggiunta è più veloce della moltiplicazione non a causa dell'architettura della macchina. L'aggiunta è intrinsecamente più veloce della moltiplicazione. In termini di complessità, ci vuole O(n)nO(n2)

A proposito, questa idea è simile alla moltiplicazione modulare Montgomery, in cui le moltiplicazioni vengono eseguite nella forma Montgomery che è molto più veloce della solita moltiplicazione e quindi riduzione.



1
@Mehrdad, spero che tu abbia imparato la moltiplicazione scolastica di due numeri. Che l'algoritmo sia ancora ampiamente usato sui chip dei computer , guarda qui. Cosa intendi per algoritmi di livello software che sono ancora peggio del tempo lineare. Questi algoritmi di moltiplicazione sono ampiamente utilizzati come nei circuiti di moltiplicazione?
fade2black,


1
Lo spirito della risposta è comunque corretto, giusto? Se nessuno degli algoritmi di moltiplicazione corrisponderà al tempo lineare di addizione?
Stephen,

1
@Stephen, in effetti la domanda non era su quale sia la migliore complessità esatta dell'algoritmo di moltiplicazione. Potrei fornire ulteriori informazioni su questo argomento se i commentatori lo richiedono. Penso che una lunga discussione su questo sarebbe fuori tema qui. )))
fade2black
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.