Я работаю над вероятностными моделями, и, делая вывод о тех моделях, оцененные вероятности могут стать очень маленькими. Чтобы избежать переполнения, я в настоящее время работаю в домене журнала (я сохраняю журнал вероятностей). Умножимые вероятности эквивалентны добавлению, а суммирование производится по формуле:
log(exp(a) + exp(b)) = log(exp(a - m) + exp(b - m)) + m
где m = max(a, b)
.
Я использую некоторые очень большие матрицы, и для вычисления матрично-векторных умножений я должен принять элементарную экспоненту этих матриц. Этот шаг довольно дорогостоящий, и мне было интересно, существуют ли другие методы борьбы с недостаточным потоком при работе с вероятностями.
Изменить: по соображениям эффективности, я ищу решение с использованием примитивных типов, а не объектов, сохраняющих произвольное представление реальных чисел.
Изменить 2: Я ищу более быстрое решение, чем трюк в лог-домене, а не более точное решение. Я доволен той точностью, которую я сейчас получаю, но мне нужен более быстрый метод. В частности, суммирование происходит при умножении матричных векторов, и я хотел бы иметь возможность использовать эффективные методы BLAS.
Решение: после обсуждения с Джонатаном Дурси я решил разложить каждую матрицу и вектор на свой самый большой элемент и сохранить этот фактор в домене журнала. Умножения просты. Перед добавлением я должен разложить одну из добавленных матриц/векторов на отношение двух факторов. Я обновляю коэффициент каждые десять операций.