我有一些代码随机初始化一些 numpy 数组:
rng = np.random.default_rng(seed=seed)
new_vectors = rng.uniform(-1.0, 1.0, target_shape).astype(np.float32) # [-1.0, 1.0)
new_vectors /= vector_size
一切运行良好,所有项目测试都通过了。
不幸的是,uniform()
返回np.float64
,尽管下游步骤只需要np.float32
,而且在某些情况下,这个数组非常大(想想数百万个 400 维的词向量)。因此临时np.float64
返回值暂时使用 3X 所需的 RAM。
因此,我用定义上应该等效的内容替换了上面的内容:
rng = np.random.default_rng(seed=seed)
new_vectors = rng.random(target_shape, dtype=np.float32) # [0.0, 1.0)
new_vectors *= 2.0 # [0.0, 2.0)
new_vectors -= 1.0 # [-1.0, 1.0)
new_vectors /= vector_size
在此更改之后,所有密切相关的功能测试仍然通过,但是依赖于从如此初始化的向量进行的远下游计算的单个遥远的边缘测试已经开始失败。并且以非常可靠的方式失败。这是一个随机测试,在顶部情况下以较大的误差通过,但在底部情况下总是失败。所以:有些东西发生了变化,但以某种非常微妙的方式发生了变化。
的表面值new_vectors
似乎在这两种情况下都正确且相似地分布。同样,所有功能的“特写”测试仍然通过。
因此,我很想知道这个 3 行更改可能会带来哪些非直觉性的变化,而这些变化可能会出现在下游。
(我仍在尝试找到一个最小的测试来检测任何不同之处。如果您喜欢深入研究受影响的项目,查看成功的确切特写测试和失败的边缘测试,并提交/没有微小的变化,在https://github.com/RaRe-Technologies/gensim/pull/2944#issuecomment-704512389。但实际上,我只是希望一个 numpy 专家可能会认识到一些微小的角落案例,其中一些非-直觉发生,或提供一些可测试的相同理论。)
有什么想法、建议的测试或可能的解决方案吗?