python - 数值稳定的softmax

标签 python numpy nan scientific-computing softmax

是否有一种数值稳定的方法来计算下面的 softmax 函数? 我得到的值在神经网络代码中变成了 Nans。

np.exp(x)/np.sum(np.exp(y))

最佳答案

softmax exp(x)/sum(exp(x)) 实际上在数值上表现良好。它只有正项,所以我们不用担心失去意义,而且分母至少和分子一样大,所以结果保证在0和1之间。

唯一可能发生的事故是指数过流或欠流。 x 的单个元素溢出或所有元素下溢将使输出或多或少变得无用。

但是通过使用对任何标量 c 都成立的恒等式 softmax(x) = softmax(x + c) 很容易防止这种情况发生:减去 max( x) 从 x 留下一个只有非正项的向量,排除溢出和至少一个为零的元素排除消失的分母(在一些但下溢并非所有条目都是无害的)。

脚注:从理论上讲,总和中的灾难性事故是可能的,但您需要荒谬 数量的术语。例如,即使使用只能解析 3 位小数的 16 位 float ——与“普通”64 位 float 的 15 位小数相比——我们需要 2^1431(~6 x 10^431)和 2 ^1432 得到的总和是 off by a factor of two .

关于python - 数值稳定的softmax,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42599498/

相关文章:

python - View 和 numpy 数组的浅拷贝有什么区别?

javascript - 如何在不使用存在误报的isNaN的情况下判断value是否为NaN?

Python生成和排序随机变量的4种情况出错

python - 临时存储数据的最佳方式?

python - numpy计算多个数组中的频率

python - 如何将掩码从一个数组应用到另一个数组?

python - 如何找到列表中除 NaN 之外的最后一个有效索引

c++ - 检查矩阵是否包含 CUDA 中的 nans 或无限值

python - 如何找到第一个非零元素和最后一个非零元素并修剪它

python - 谁能帮我理解 Python 变量作用域?