¿Por qué es más rápido agregar probabilidades de registro que multiplicar probabilidades?

21

Para enmarcar la pregunta, en informática a menudo queremos calcular el producto de varias probabilidades:

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

El enfoque más simple es simplemente multiplicar estos números, y eso es lo que iba a hacer. Sin embargo, mi jefe dijo que es mejor agregar el registro de las probabilidades:

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

Esto da la probabilidad de registro, pero podemos obtener la probabilidad después si es necesario:

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

La adición de registros se considera mejor por dos razones:

  1. Evita el "desbordamiento" por el cual el producto de las probabilidades es tan pequeño que se redondea a cero. Esto a menudo puede ser un riesgo ya que las probabilidades son a menudo muy pequeñas.
  2. Es más rápido porque muchas arquitecturas de computadora pueden realizar la suma más rápidamente que la multiplicación.

Mi pregunta es sobre el segundo punto. Así es como lo he visto descrito, ¡pero no tiene en cuenta el costo adicional de obtener el registro! Deberíamos comparar "costo de registro + costo de adición" con "costo de multiplicación". ¿Sigue siendo más pequeño después de tener eso en cuenta?

Además, la página de Wikipedia ( probabilidad de registro ) es confusa a este respecto, afirmando que "la conversión al formulario de registro es costosa, pero solo se incurre una vez". No entiendo esto, porque creo que necesitaría tomar el registro de cada término de forma independiente antes de agregar. ¿Qué me estoy perdiendo?

Finalmente, la justificación de que "las computadoras realizan la suma más rápido que la multiplicación" es algo vaga. ¿Es eso específico del conjunto de instrucciones x86, o es un rasgo más fundamental de las arquitecturas de procesador?

Stephen
fuente
18
El primer beneficio (evitar el desbordamiento) a menudo es mucho más importante que la ganancia de rendimiento, por lo que incluso si no fuera más rápido, seguiríamos usando probabilidades de registro.
DW
Para ampliar lo que dijo @DW, hay un "truco de log-sum-exp" similar que se usa específicamente para abordar el desbordamiento, sin tener en cuenta el rendimiento en absoluto. De hecho, ¡esta era la primera vez que veía a alguien considerar los logaritmos como una técnica para mejorar el rendimiento!
Mehrdad

Respuestas:

14

Además, la página de Wikipedia ( https://en.wikipedia.org/wiki/Log_probability ) es confusa a este respecto, afirmando que "La conversión al formulario de registro es costosa, pero solo se incurre una vez". No entiendo esto, porque creo que necesitaría tomar el registro de cada término de forma independiente antes de agregar. ¿Qué me estoy perdiendo?

Si solo desea calcular una vez, entonces tiene razón. Tendrás que calcular n logaritmos y n - 1 adiciones, mientras que el método ingenuo requiere n - 1 multiplicaciones.P(A1)P(An)nn1n1

Sin embargo, es muy común que desee responder consultas del formulario:

iIP(Ai)I{1,n}

logP(Ai)|I|

Finalmente, la justificación de que "las computadoras realizan la suma más rápido que la multiplicación" es algo vaga. ¿Es eso específico del conjunto de instrucciones x86, o es un rasgo más fundamental de las arquitecturas de procesador?

a+baba×b

2

Sin embargo, esta es una declaración razonable en todas las arquitecturas informáticas comunes: la multiplicación en números de punto flotante será más lenta que la suma.

md5
fuente
1
P(Ai)
¿Qué pasa con la exp final ()? ¿No es lento?
Mehrdad
Θ(M(n)logn)M(n)Θ(nM(n)logn+nqQ|Iq|)Qes el conjunto de consultas).
md5
2
expn(0,1)log10
1
¿Es la suma aún más rápida que la multiplicación si usa flotadores IEEE, lo que ciertamente lo hará en este caso? Los cpus modernos son bastante buenos para multiplicar números, mientras que la adición de flotador tiene un par de pasos que no se pueden ejecutar simultáneamente: alinee las mantisas (desplace a la izquierda según el resultado de la resta), luego agréguelas, luego normalice (lo que puede desencadenar tanto el desbordamiento como desbordamiento, yay). En el circuito son muchos dados, en microcódigo cada paso cuesta un ciclo o pocos.
John Dvorak
4

Np1,...pNpi

N

O(n)nO(n2)

Por cierto, esta idea es similar a la multiplicación modular de Montgomery, donde las multiplicaciones se realizan en la forma de Montgomery, que es bastante más rápida que la multiplicación habitual y luego la reducción.

fade2black
fuente
1
@Mehrdad, espero que hayas aprendido la multiplicación escolar de dos números. Ese algoritmo todavía se usa ampliamente en chips de computadora. Mire aquí. Lo que quiere decir es que los algoritmos de nivel de software son aún peores que el tiempo lineal. ¿Son estos algoritmos de multiplicación ampliamente utilizados como en el circuito de multiplicación?
fade2black
1
Sin embargo, el espíritu de la respuesta sigue siendo correcto, ¿verdad? Si ninguno de los algoritmos de multiplicación va a coincidir con el tiempo lineal de la suma?
Stephen
1
@Stephen, de hecho, la pregunta no era sobre cuál es la mejor complejidad exacta del algoritmo de multiplicación. Podría proporcionar información adicional sobre este tema si los comentaristas lo requieren. Creo que una larga discusión sobre eso estaría fuera de tema aquí. )))
fade2black