问题标签 [numerical-stability]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
3468 浏览

c++ - 为 [-1, 1] 中的 c 计算 sqrt((b²*c²) / (1-c²)) 的数值稳定方法

对于一些真正的价值bcin [-1, 1],我需要计算

sqrt( (b²*c²) / (1-c²) ) = (|b|*|c|) / sqrt((1-c)*(1+c))

c当接近 1 或 -1时,分母中出现灾难性抵消。平方根可能也无济于事。

我想知道是否可以在这里应用一个聪明的技巧来避免 c=1 和 c=-1 周围的困难区域?

0 投票
0 回答
46 浏览

matlab - 计算平均值是否比计算总和对数字消除更稳健?

考虑以下在 Matlab 中执行的示例:

总和的相对误差最终比平均值略大(相差不大:相差 1.1102e-16),但我不明白为什么,特别是因为计算平均值也涉及计算相同的总和(除非Matlab mean() 本身不使用相同的 sum() 函数本身?)。

为了提供更多背景信息,这是我们为学生创建的作业的一部分,基于我自己在学生时代的作业。该作业中的原始问题是“在这种情况下,求和运算符对数字消除或均值运算符更健壮吗?为什么?” 我开始认为这个问题没有以最好的方式表达,也许两者都同样强大。

0 投票
1 回答
69 浏览

numerical-methods - 如何以数值稳定的方式计算 (exp(t) - 1)/t?

表达式趋于 0 时(exp(t) - 1)/t收敛到 1。t但是,当进行数值计算时,我们得到了不同的结果:

有什么方法可以计算这个表达式而不会遇到这些问题?我曾考虑过使用幂级数,但我对自己实施这一点持谨慎态度,因为我不确定实施细节,例如要使用多少个术语。

如果相关,我将 Python 与 scipy 和 numpy 一起使用。

0 投票
0 回答
710 浏览

python - 为什么 python numpy 没有与 cotangens 相关的函数,例如 arccot?

我尝试arctan(a/b)通过计算arccot(b/a)b和大a来增加计算的数值稳定性,但 numpy 似乎不提供 arccot 函数?

编辑:好的@hpaulj 指出有一个 arctan2 / tan2 函数。我查了一下,它基本上消除了数值稳定性问题,根本不除,而是将分子和分母作为单独的输入。

0 投票
0 回答
41 浏览

java - 为什么使用部分枢轴预成型的行减少比不使用枢轴更差?

提前抱歉。这将是一个漫长的过程。

一些背景。我已经在 J​​ava 中实现了几个与矩阵相关的算法来获得乐趣。我正在研究简化的行梯形式(rref)。我已经实现了使用和不使用部分旋转的 rref。我的理解是,部分旋转应该比不旋转在数值上更稳定。但是,我看到一些矩阵与我的实现相反,这让我认为我做错了什么。

关于我的实现的一些注意事项:

  • 我已经实现了自己的Number课程。此类允许使用复数或实数。
  • 类中的compareTo()方法Number使用复数的大小。实际值的比较是通过另一种方法完成的。
  • 我的Matrix类本质上包装了这些Number对象的二维数组,并提供了几个构造函数/方法。

代码:
没有部分旋转:

部分旋转:

现在来看看结果。以下是不同矩阵的三个结果。

对于前两个,rref()甚至没有得到正确的答案。我查看了矩阵,在 while 循环的倒数第二次迭代中,这就是它的样子……

所以有非常小的非零值(应该是零)导致了这个问题。这似乎是浮点算术错误的结果。C 类似。然而,对于矩阵 B,部分旋转确实产生了正确的答案,而不旋转方法有一些错误。

所以这是我的正式问题,最后是嘘。首先,我的部分枢轴执行是否存在问题?无论是引入数值不稳定性还是不正确的逻辑。其次,部分旋转是否保证在数值上更稳定?或者,使用部分旋转时的两个矩阵 E 和 C 示例是否不太稳定?这些类型的错误是不可避免的吗?我应该将非常小的数字四舍五入为零以便算法有效吗?
提前谢谢大家。

0 投票
0 回答
88 浏览

python - 小幅度向量的数值稳定归一化

问题的背景是我在 Jax(基本上是 NumPy)中有一个 resnet 模型,并且我采用了图像相对于其类别预测的梯度。这给了我一个梯度向量 ,g然后我想对其进行归一化。问题是,分量 , 的大小g[i]是这样的g[i]**2 == 0,这意味着仅除以np.linalg.norm(g)给出 的值0,因此给我nans。

到目前为止,我所做的只是检查范数是否为 0,然后乘以某个常数因子,如 ( g = np.where(np.linalg.norm(g) < 1e-20, g * 1e20, g)) 所示。

在想也许我应该除以最小的非零元素然后归一化。有没有人知道如何正确规范化这个向量?

0 投票
1 回答
690 浏览

python - 从头开始实现二元交叉熵——训练神经网络的结果不一致

我正在尝试使用 JAX 库及其小神经网络子模块“Stax”来实现和训练神经网络。由于这个库没有实现二进制交叉熵,我自己写了:

我实现了一个简单的神经网络并在 MNIST 上对其进行了训练,并开始怀疑我得到的一些结果。所以我在 Keras 中实现了相同的设置,我立即得到了截然不同的结果!相同的模型,在相同的数据上以相同的方式训练,在 Keras 中获得了 90% 的训练准确率,而不是在 JAX 中大约 50%。最终,我将问题的一部分归结为我对交叉熵的幼稚实现,据说它在数值上是不稳定的。在这篇文章和我找到的这段代码之后,我编写了以下新版本:

这工作得更好一些。现在我的 JAX 实现获得了高达 80% 的训练准确率,但这仍然比 Keras 获得的 90% 低很多。我想知道发生了什么?为什么我的两个实现的行为方式不同?

下面,我将我的两个实现浓缩为一个脚本。在这个脚本中,我在 JAX 和 Keras 中实现了相同的模型。我使用相同的权重初始化两者,并使用全批梯度下降对来自 MNIST 的 1000 个数据点进行 10 步训练,每个模型的数据相同。JAX 以 80% 的训练准确率结束,而 Keras 以 90% 结束。具体来说,我得到这个输出:

实际上,当我稍微改变条件(使用不同的随机初始权重或不同的训练集)时,有时我会得到 50% 的 JAX 准确度和 90% 的 Keras 准确度。

我最后交换了权重,以验证从训练中获得的权重确实是问题所在,与网络预测的实际计算或我计算准确性的方式无关。

编码:

尝试将第 57 行的 PRNG 种子更改为其他值,而不是0使用不同的初始权重运行实验。

0 投票
1 回答
296 浏览

python - softmax 的 TensorFlow 问题

我有一个 Tensorflow 多类分类器,它正在生成naninf同时使用tf.nn.softmax. 请参阅以下代码片段(logits形状为batch_size x 6,因为我有 6 个类并且输出是单热编码的)。batch_size是 1024。

分类器在最后一条语句上失败,因为它找到naninf。是干净的,否则第一个语句将失败。probabilitieslogits

从我读到的内容来看tf.nn.softmax,它可以处理 logits 中非常大和非常小的值。我已经在交互模式下验证了这一点。

然后我尝试将这些值剪掉,logits现在整个事情都可以工作了。请参阅下面的修改片段。

在第二个语句中,我将值裁剪logits为 -15 和 15,这以某种方式阻止了nan/inf在 softmax 计算中。所以,我能够解决手头的问题。

但是,我仍然不明白为什么这个剪辑有效?(我应该提到 -20 和 20 之间的裁剪不起作用,并且模型在naninf中失败probabilities)。

有人可以帮我理解为什么会这样吗?

我正在使用 tensorflow 1.15.0,在 64 位实例上运行。

0 投票
1 回答
32 浏览

floating-point - 计算机可以更好地保留哪个数字:`256,007` 或 `.000333`

我一直认为256,007.000333.

对于问题的上下文,在工程课程中,我们应该展示带有旋转的 LU 分解如何比不使用旋转在数值上更稳定。这本书认为,将最大的枢轴置换到位更稳定,但在我看来,最小的数字是最好的,这样你就不会得到微小的小数。

0 投票
1 回答
54 浏览

python - 函数在边界处发散:薛定谔 2D,显式方法

我正在尝试使用Askar 和 Cakmak (1977) 提出的显式算法来模拟二维薛定谔方程。我用复杂函数 u+iv 定义了一个 100x100 网格,边界处为空。问题是,经过几次迭代,复杂函数的绝对值在边界附近爆炸。

最初的归一化高斯波包经过 27 次迭代就变成了这样

我在这里发布代码,所以如果有兴趣,您可以查看它:

如您所见,代码非常简单:我看不出这个错误来自哪里(我不认为这是一个稳定性问题,因为 alpha<1/2)。您在过去的模拟中是否遇到过类似的情况?