Чому додавання ймовірностей журналу швидше, ніж множення ймовірностей?


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. Це швидше, тому що багато архітектури комп'ютера можуть виконувати додавання швидше, ніж множення.

Моє запитання щодо другого пункту. Ось як я це бачив, як це описано, але він не враховує додаткових витрат на отримання журналу! Ми повинні порівнювати "вартість журналу + вартість додавання" до "вартість множення". Чи все-таки вона менша після врахування цього?

Також у цьому відношенні сторінка Вікіпедії ( ймовірність журналу ) є заплутаною, заявляючи, що "Перехід у форму журналу є дорогим, але відбувається лише один раз". Я цього не розумію, тому що я думаю, що вам потрібно буде взяти журнал кожного терміна самостійно перед додаванням. Що я пропускаю?

Нарешті, обґрунтування того, що "комп’ютери виконують додавання швидше, ніж множення", є дещо невиразним. Це специфічно для набору інструкцій x86 чи це якась більш фундаментальна риса архітектури процесорів?


18
Перша вигода (уникаючи переповнення) часто набагато важливіша, ніж підвищення продуктивності, тому навіть якщо це не було швидше, ми все одно використовували ймовірності журналу.
DW

Щоб розширити те, що сказав @DW, існує аналогічний "трюк log-sum-exp", який використовується спеціально для вирішення потоку даних, без будь-яких стосунків до продуктивності. Насправді це був перший раз, коли я бачив, як хтось розглядав логарифми як техніку підвищення продуктивності!
Мехрдад

Відповіді:


14

Також сторінка Вікіпедії ( https://en.wikipedia.org/wiki/Log_probability ) є заплутаною в цьому відношенні, заявляючи, що "Перехід у форму журналу є дорогим, але відбувається лише один раз". Я цього не розумію, тому що я думаю, що вам потрібно буде взяти журнал кожного терміна самостійно перед додаванням. Що я пропускаю?

Якщо ви просто хочете один раз обчислити , то ви праві. Вам доведеться обчислити n логарифмів і n - 1 доповнень, тоді як наївний метод вимагає n - 1 множення.P(A1)P(An)nn1n1

Однак дуже часто ви хочете відповідати на запити форми:

Обчислити для деякого підмножини я з { 1 , ... п } .iIP(Ai)I{1,n}

У цьому випадку ви можете попередньо обробити ваші дані, щоб обчислити весь лише один раз, і відповісти на кожен запит, виконавши | Я | доповнення.logP(Ai)|I|

Нарешті, обґрунтування того, що "комп’ютери виконують додавання швидше, ніж множення", є дещо невиразним. Це специфічно для набору інструкцій x86 чи це якась більш фундаментальна риса архітектури процесорів?

a+baba×b

2

Тим не менш, це розумне твердження у всіх поширених архітектурах комп'ютерів: множення на числа з плаваючою комою буде повільніше, ніж додавання.


1
P(Ai)

А як щодо остаточного досвіду ()? Хіба це не повільно?
Мехрдад

Θ(M(n)logn)M(n)Θ(nM(n)logn+nqQ|Iq|)Q- це набір запитів).
md5

2
досвідн(0,1)журнал10

1
Чи додавання все-таки швидше, ніж множення, якщо ви використовуєте плавці IEEE - що, безумовно, буде в цьому випадку? Сучасний процесор досить хороший у множенні чисел, тоді як додавання поплавця має пару кроків, які неможливо виконати одночасно - вирівняйте мантіси (зсуньте ліворуч на результат віднімання), а потім насправді додайте їх, а потім нормалізуйте (що може спричинити як підводне, так і переповнення, так). У ланцюзі це дуже багато гине, в мікрокоді кожен крок коштує циклу або декількох.
Джон Дворак

4

Np1,...pNpi

N

О(н)нО(н2)

До речі, ця ідея схожа на модульне множення Монтгомері, де множення виконується у формі Монтгомері, що є досить швидшим, ніж звичайне множення, а потім зменшення.



1
@Mehrdad, я сподіваюся, ти навчився множення двох чисел у школі. Цей алгоритм досі широко використовується на комп’ютерних мікросхемах, будь ласка, дивіться тут. Ви маєте на увазі алгоритми програмного рівня, які ще гірші, ніж лінійний час. Чи широко використовуються ці алгоритми множення, як у ланцюзі множення?
fade2black


1
Дух відповіді все-таки правильний, правда? Якщо жоден з алгоритмів множення не збігається з лінійним часом додавання?
Стівен

1
@Stephen, насправді питання полягало не в тому, яка саме найкраща складність алгоритму множення. Я міг би надати додаткову інформацію з цього приводу, якщо потрібні коментатори. Думаю, що довга дискусія з цього питання буде поза темою. )))
fade2black
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.