我正在处理概率模型,当对这些模型进行推断时,估计的概率可能会变得非常小。为了避免下溢,我目前正在log域中工作(将概率的log值存储)。概率的乘法等价于加法,并且使用以下公式进行求和:
log(exp(a) + exp(b)) = log(exp(a - m) + exp(b - m)) + m
假设 m = max(a, b)
。
我使用了一些非常大的矩阵,并且必须对这些矩阵进行逐元素指数运算以计算矩阵-向量乘积。这一步骤非常费时,我想知道在处理概率时是否存在其他方法来处理下溢。
编辑:出于效率考虑,我正在寻找一种使用原始类型而不是存储实数任意精度表示的对象的解决方案。
编辑2:我正在寻找比log域技巧更快的解决方案,而不是更准确的解决方案。我对当前获得的精度感到满意,但我需要更快的方法。特别是,在矩阵-向量乘积期间会发生求和,并且我希望能够使用高效的BLAS方法。
解决方案:在与Jonathan Dursi的讨论后,我决定将每个矩阵和向量因子分解为其最大元素,并将该因子存储在对数域中。乘法很简单。在加法之前,我必须通过两个因子的比率因子分解一个要添加的矩阵/向量。我每十个操作更新一次因子。