【发布时间】: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