为什么增加对数概率比相乘概率快?


21

为了解决这个问题,在计算机科学中,我们经常要计算以下几种概率的乘积:

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

最简单的方法就是将这些数字相乘,这就是我要做的。但是,老板说最好添加概率的日志:

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

这给出了对数概率,但是如果需要,我们可以在以后获得概率:

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

日志添加被认为更好,原因有两个:

  1. 它防止“下溢”,因为下溢的概率乘积如此之小,以至于四舍五入为零。由于概率通常很小,因此这通常是一种风险。
  2. 它之所以快,是因为许多计算机体系结构执行加法的速度比乘法快。

我的问题是关于第二点。这就是我所看到的描述方式,但是没有考虑获取日志的额外费用!我们应该将“原木成本+加成成本”与“乘法成本”进行比较。考虑到这一点,它还会变小吗?

同样,Wikipedia页面(对数概率)在这方面令人困惑,指出“转换为对数格式很昂贵,但是只发生一次。” 我不明白这一点,因为我认为您需要在添加之前独立记录每个术语的日志。我想念什么?

最后,“计算机执行加法的速度比乘法快”的说法有点含糊。这是特定于x86指令集的,还是处理器体系结构的一些更基本的特征?


18
第一个好处(避免下溢)通常比提高性能重要得多,因此,即使不是更快,我们仍然会使用对数概率。
DW

为了扩展@DW所说的内容,有一个类似的“ log-sum-exp技巧”专门用于解决下溢问题,而与性能无关。实际上,这是我第一次看到有人将对数作为提高性能的技术!
Mehrdad

Answers:


14

同样,Wikipedia页面(https://en.wikipedia.org/wiki/Log_probability)在这方面令人迷惑,指出“转换为日志格式很昂贵,但只发生一次。” 我不明白这一点,因为我认为您需要在添加之前独立记录每个术语的日志。我想念什么?

如果只想计算一次,那么您是对的。您将必须计算n个对数和n - 1个加法,而朴素方法需要n - 1个乘法。P一种1个P一种ñññ-1个ñ-1个

但是,您通常希望回答以下形式的查询:

计算对于某一子集{ 1 ... Ñ }一世一世P一种一世一世{1个ñ}

在这种情况下,您可以预处理数据以仅计算一次所有,然后通过|来回答每个查询| 补充。日志P一种一世|一世|

最后,“计算机执行加法的速度比乘法快”的说法有点含糊。这是特定于x86指令集的,还是处理器体系结构的一些更基本的特征?

这是一个更广泛的问题。通常,计算乘法比(加法)难。计算ab的大小上是线性的(使用平凡的算法),而我们目前不知道如何以相同的时间复杂度来计算a × b(在此处查看最佳算法)。一种+b一种b一种×b

当然,没有明确的答案:例如,如果您仅处理整数并且乘以的幂,那么您应该将shift与add操作进行比较。2

但是,这在所有通用计算机体系结构上都是合理的说法:浮点数的乘法将比加法慢。


1
您是否还不需要考虑为所有概率计算对数所需的时间复杂度?P一种一世
David C

最后的exp()呢?那不是很慢吗?
Mehrdad

@DavidC:我没有尝试计算总体时间复杂度。我只是回答了“乘法比加法快”的问题。但是在一般情况下,在软件规模上计算浮点数的对数可以取,其中M n 是乘法算法的复杂度。因此,这将给予Θ ñ 中号ñ 日志ñ + ñ Σ q Q | q |的复杂性(其中QΘ中号ñ日志ñ中号ñΘñ中号ñ日志ñ+ñq|一世q|是一组查询)。
md5

2
@Mehrdad:这与计算对数一样困难。但是,我不确定您是否需要这样做。例如,如果您仅比较概率,则不愿计算最终。的乘法Ñ号码0 1 可能会很快变得非常小,因此对我们试图通过使用对数概率,以避免下溢同样的原因,我们应当在端留在对数形式(例如通过计算日志在基座10,这样它甚至更“易于阅读”)。经验值ñ01个日志10
md5

1
如果您使用IEEE浮点数,加法是否仍比乘法快-在这种情况下您肯定会做到这一点?现代cpus非常擅长将数字相乘,而浮点加法有几个无法同时执行的步骤-对齐尾数(根据减法结果向左移动),然后将其实际相加,然后进行规范化(这可能会触发下溢和溢出,是的。在电路中,有很多芯片,在微代码中,每个步骤花费一个周期或更少的时间。
John Dvorak

4

ñp1个pñp一世

ñ

ØññØñ2

顺便说一句,这个想法类似于蒙哥马利模乘,后者以蒙哥马利的形式执行乘法,比通常的乘法然后归约要快得多。



1
@Mehrdad,我希望您学会了两个数字的学校乘法。该算法仍在计算机芯片上广泛使用,请查看此处。您的意思是软件级算法仍比线性时间差。这些乘法算法是否已广泛用作乘法电路?
fade2black17年


1
答案的精神仍然是正确的,对吗?是否所有乘法算法都不匹配线性加法时间?
斯蒂芬,

1
@Stephen,实际上问题不在于乘法算法的确切最佳复杂度是多少。如果需要评论者,我可以提供有关此主题的其他信息。我认为,对此进行长时间的讨论将成为话题。)))
fade2black
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.