我需要执行softmax操作。也就是说,给定n
个实数值从-inf到+ inf的序列,我通过对每个值进行指数并除以指数之和来将它们转换为概率:
for (i = 0; i < n; i++)
p_x[i] = exp(x[i]) / sum_exp(x, n)
(不要从字面上理解代码,我不是每次迭代总结所有exp
!)
在某些极端情况下,当值超过700时,我遇到溢出问题(使用8个字节的双精度数)。我知道我可以使用另一个基础而不是e,但是,我担心调用pow
会比exp
慢得多(速度对我来说很重要)。
解决这个问题的最快方法是什么?
答案 0 :(得分: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);
}
答案 1 :(得分:0)
b^x = e^(x * ln b)
因此,使用较小的基数b
相当于在应用ln b
之前将您的值乘以exp
,并在结束时再次划分。