【问题标题】:NumPy precision when doing dot product进行点积时的 NumPy 精度
【发布时间】:2016-04-02 21:21:50
【问题描述】:

我正在使用 Theano/NumPy 做一些深度学习的事情。我发现了一个非常烦人的问题。我得到了一个权重矩阵 A(假设为 50*2048)和一个特征向量 b(2048 dim)。

A 被初始化使用

self.alpha = np.random.random((50, 2048)).astype(np.float32) * 2 - 1.0

b 是来自 theano 的 2048 dim numpy.ndarrary。

问题是

X = numpy.dot(A, b)
Y = [numpy.dot(A[i], b) for i in xrange(50)]

X 和 Y 的某些行并不严格相等。我对比了一下,发现差别在 1e-6 和 1e-7。

目前我更喜欢使用第二个来计算点积,因为它似乎可以学习更好的权重。但第一个要快得多。所以我想知道为什么会有这么大的差异。它是由点(矩阵,向量)和点(向量,向量)的不同实现引起的吗?非常感谢!

--编辑 正如 uhoh 所提到的,这是您可以重现它的代码。

import numpy as np

test_time = 1000
vector_size = 100
matrix_size = (100, 100)

for i in xrange(test_time):
    a = np.random.random(matrix_size).astype(np.float32) * 2 - 1.0
    b = np.random.random(vector_size).astype(np.float32)
    x = np.dot(a, b)
    y = [np.dot(a[i], b) for i in xrange(a.shape[0])]
    for k in xrange(len(y)):
        epsilon = x[k] - y[k]
        if abs(epsilon) > 1e-7:
            print('Diff: {0}\t{1}\t{2}'.format(x[k], y[k], epsilon))

【问题讨论】:

  • 你能用更小的数字数组复制问题吗?见How to create a Minimal, Complete, and Verifiable example。有时通过隔离现象,您可以在过程中自己发现问题。
  • @uhoh 我贴出了可以重现问题的代码。
  • 非随机示例:x = np.ones((2, 100), dtype=np.float32)/100; y = np.ones(100, dtype=np.float32)。比较np.dot(x, y)[0]np.dot(x[0], y)
  • 显然dot根据第一个参数是一维还是二维,遵循不同的代码路径,不同的路径导致数值错误略有不同。
  • FWIW 如果你正在做“深度学习”,请立即停止担心这种规模的错误......

标签: python numpy machine-learning precision theano


【解决方案1】:

嗯,通常需要在性能和精度之间进行权衡。您可能需要补偿其中一个或另一个。尽管我个人认为 0.0000001 的差异在大多数应用程序中都不是什么大问题。如果您寻求更高的精度,最好使用float64,但请注意float64 的操作在 GPU 上非常慢,尤其是 NVIDIA 9xx 系列 GPU。

我可能会注意到,上述问题似乎也取决于您的硬件设置,因为我的机器上没有遇到此类问题。

您也可以使用np.allclose(x, y) 来查看差异是否有形。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 2018-11-04
    • 2021-11-11
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 2016-11-01
    相关资源
    最近更新 更多