我正在运行的代码可能会受益于随机数生成器的不同初始化。我使用库 torch
和 python
。我使用以下代码行在每次迭代开始时设置随机种子。
import numpy as np
import torch
seed = np.random.randint(0, 1000)
print(f"Seed: {seed}")
np.random.seed(seed)
torch.manual_seed(seed)
虽然出于某种原因,在(许多)迭代中我观察到种子总是设置为一个值,在我的例子中是 688
。我不明白的是 seed
变量的生成不受稍后设置的种子的约束。那么为什么每次都设置相同的种子,我该如何解决呢?谢谢。
最佳答案
在您的示例中,您通过不调用 RandomState 类并为其提供种子来隐式初始化默认随机数生成器。在这种情况下,NumPy 获得一个 alternative source for the seed。这可能不够随机。
此外,generate a random number on a small set of numbers and use it to seed the random number generator 不被认为是一种好的做法。 ,因为您生成相同种子的可能性很高。但是,如果您有相似的种子值和不太好的初始化,通常的做法是使用快速、微小但可能不太好的随机数生成器来创建高质量的种子值或整个初始状态本身。但无需手动执行,因为 NumPy 的遗留随机实现遵循 a specific case。一种科学合理的方法 [1],即使在相似(例如相邻)的种子值上也能确保良好的不同初始状态。 IE。您可以使用 0 到 1000 为您的模拟设定种子,并且您在不同迭代中使用 NumPy 获得的随机数看起来会完全不同。您还可以在保存计算或创建统计信息时使用此种子值来标识您的计算。
不过我不确定随机数生成器在 Torch 中的实现。好像it takes a 64-bit integer .如果它适合您的需要,您可以使用 NumPy 的引擎在此范围内生成随机数并将 at 用作种子值。如果进行 2 次模拟,则 2 个种子值相同的概率为 1/2^{64} ~ 5 * 10^{-20}。
通过下面的例子,保证了在for
循环的每次迭代中,NumPy的随机生成器的状态是不同的,而torch
的随机状态是最每次迭代可能不同
.
import numpy as np
import torch
max_sim = 3 # how many simulations you need
for numpy_seed in range(max_sim):
np.random.seed(numpy_seed)
torch_seed = np.random.randint(low=-2**63,
high=2**63,
dtype=np.int64)
print(torch_seed)
torch.manual_seed(torch_seed)
# do the rest of the simulation
# output:
# 900450186894289455
# -1530673954295414549
# -1180685649882019313
[1]:松本诚和和田、伊作和仓本、爱和芦原、兵、 标题:伪随机数生成器初始化的常见缺陷;围绕方程式 30
关于python - 为代码的每次运行设置不同的种子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66452559/