ソフトマックス操作を実行する必要があります。つまり、n
-inf から +inf までの範囲の実数値のシーケンスが与えられた場合、各値を指数化し、指数の合計で除算することにより、それらを確率に変換します。
for (i = 0; i < n; i++)
p_x[i] = exp(x[i]) / sum_exp(x, n)
(コードを文字通りに解釈しないでください。すべてexp
の反復を合計しているわけではありません!)
いくつかの極端なケース (8 バイトの double を使用) で値が 700 を超えると、オーバーフローの問題が発生します。e の代わりに別の基数を使用できることはわかっていますが、呼び出しpow
がはるかに遅くなることが心配ですexp
(速度は私にとって重要です)。
これを解決する最速の方法は何ですか?