Почему добавление вероятностей журнала быстрее, чем умножение вероятностей?


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 логарифмов ип(A1)...п(AN)N сложений, тогда как простой метод требует n - 1 умножений.N-1N-1

Тем не менее, очень часто вы хотите отвечать на запросы в форме:

Вычислить для некоторого подмножества я изΠяяп(Aя)я .{1,...N}

В этом случае вы можете предварительно обработать ваши данные для вычисления всего журналп(Aя) только один раз, и ответить на каждый запрос, выполнив дополнения.|я|

Наконец, обоснование того, что «компьютеры выполняют сложение быстрее, чем умножение», является довольно расплывчатым. Это специфично для набора команд x86 или это более фундаментальная черта процессорных архитектур?

Это более широкий вопрос. Вообще (наверное?) Сложнее вычислить умножение, чем сложение. Вычисление является линейным по размеру a и b (используя тривиальный алгоритм), в то время как в настоящее время мы не знаем, как вычислить a × b с той же временной сложностью (посмотрите лучшие алгоритмы здесьa+baba×b ).

Конечно, нет однозначного ответа: например, если вы имеете дело только с целыми числами и умножаете на степени , вам лучше сравнить сдвиг с операциями сложения.2

Тем не менее, это разумное утверждение для всех распространенных компьютерных архитектур: умножение на числа с плавающей запятой будет медленнее, чем сложение.


1
Вам также не нужно учитывать сложность времени, необходимую для вычисления логарифмов для всех вероятностей ? P(Aя)
Дэвид C

Как насчет окончательного опыта ()? Разве это не медленно?
Мердад

@DavidC: я не пытался вычислить общую сложность времени. Я только что ответил на вопрос «умножение быстрее, чем сложение». Но в общем случае вычисление логарифма чисел с плавающей точкой в ​​программном масштабе может принять где M ( n ) - сложность алгоритма умножения. Так что это даст thetas ; ( п М ( п ) войти п + п Σ Q Q | I д | ) сложность (где QΘ(M(n)logn)M(n)Θ(nM(n)logn+nqQ|Iq|)Qэто набор запросов).
MD5

2
@ Mehrdad: это так же сложно, как вычислить логарифм. Однако я не уверен, что вам когда-нибудь понадобится это сделать. Например , если вы только сравнить вероятности вы не хотите вычислить конечный . Умножение n чисел в ( 0 , 1 ) может быстро стать очень маленьким, поэтому по той же причине, по которой мы стараемся избегать потери значения, используя вероятности записи, мы должны оставаться в логарифмической форме в конце (например, вычисляя журнал в базе 10). , так что это еще более «читабельно»). expn(0,1)log10
md5

1
Является ли сложение еще более быстрым, чем умножение, если вы используете плавающие элементы IEEE - что вы, безусловно, будете делать в этом случае? Современные процессоры очень хороши в умножении чисел, тогда как сложение с плавающей запятой имеет пару шагов, которые не могут быть выполнены одновременно - выровняйте мантиссы (сдвиг влево на основе результата вычитания), затем фактически добавьте их, затем нормализуйте (что может вызвать как потерю, так и переполнение, ууу). В схеме это довольно много, в микрокоде каждый шаг стоит цикла или меньше.
Джон Дворак

4

Np1,...pNpi , выполняете умножения вероятностей в пространстве журналов, добавляя их (что занимает меньше времени), а затем переключаетесь обратно в исходное пространство, используя возведение в степень.

N

O(n)nO(n2)

Кстати, эта идея похожа на модульное умножение Монтгомери, где умножения выполняются в форме Монтгомери, которая является более быстрой, чем обычное умножение, а затем сокращение.



1
@ Mehrdad, я надеюсь, ты выучил умножение чисел в школе на два числа Этот алгоритм все еще широко используется на компьютерных чипах, пожалуйста, посмотрите здесь. То есть, вы имеете в виду алгоритмы программного уровня, которые все еще хуже линейного времени. Широко ли используются эти алгоритмы умножения в схеме умножения?
fade2black


1
Дух ответа все еще правильный, правда? Если ни один из алгоритмов умножения не будет соответствовать линейному времени сложения?
Стивен

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