1

我需要执行 softmax 操作。也就是说,给定一系列n从 -inf 到 +inf 的实数值,我通过对每个值取幂并除以指数之和将它们转化为概率:

for (i = 0; i < n; i++)
    p_x[i] = exp(x[i]) / sum_exp(x, n)

(不要从字面上理解代码,我不是在总结所有exp的每次迭代!)

在某些极端情况下(使用 8 字节双精度),当值超过 700 时,我会遇到溢出问题。我知道我可以使用另一个基础而不是 e,但是,我担心调用pow会慢得多exp(速度对我来说至关重要)。

解决这个问题的最快方法是什么?

4

2 回答 2

0

将每个数字用作 64 位浮点数中的 52 位尾数。这只是掩蔽然后铸造的问题。

#include <stdio.h>

int main(int argc, char *argv[])
{
  long long val = 1234567890;
  long long mval = val & ~0xfff0000000000000ULL;
  float fval = *((float*)&mval);
  printf("%f", fval);
}
于 2012-10-16T04:12:21.587 回答
0
b^x = e^(x * ln b)

因此,使用较小的基数相当于在应用之前b将您的值乘以,然后在最后再除。ln bexp

于 2012-10-16T19:30:00.217 回答