做点积时的NumPy精度

mag*_*282 6 python precision numpy machine-learning theano

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

A使用初始化

self.alpha = np.random.random((50, 2048)).astype(np.float32) * 2 - 1.0
Run Code Online (Sandbox Code Playgroud)

b是来自theano的2048昏暗的numpy.ndarrary.

问题是

X = numpy.dot(A, b)
Y = [numpy.dot(A[i], b) for i in xrange(50)]
Run Code Online (Sandbox Code Playgroud)

X和Y的某些行并不严格相等.我比较了它们,发现差异在1e-6到1e-7之间.

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

--edit正如你所提到的,这是你可以重现它的代码.

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))
Run Code Online (Sandbox Code Playgroud)

Ami*_*mir 2

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

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

您还可以使用它np.allclose(x, y)来查看差异是否明显。