为每次运行代码设置不同的种子

Posted

技术标签:

【中文标题】为每次运行代码设置不同的种子【英文标题】:Setting a different seed for each run of the code 【发布时间】:2021-06-01 18:34:19 【问题描述】:

我正在运行的代码可能会受益于随机数生成器的不同初始化。我使用库torchpython。我使用以下代码行在每次迭代开始时设置随机种子。

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 变量的生成不受稍后设置的种子的控制。那么为什么每次都设置相同的种子,我该如何解决呢?谢谢。

【问题讨论】:

我无法重现这个 - 随机作品符合预期。 【参考方案1】:

在您的示例中,您通过不调用并为 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。

通过下面的例子,保证了NumPy的随机生成器的状态在for循环的每次迭代中都是不同的,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

【讨论】:

以上是关于为每次运行代码设置不同的种子的主要内容,如果未能解决你的问题,请参考以下文章

参数变化:固定,但运行的种子不同

为什么即使我事先设置了随机状态,我的cross_val_score总是不同?

VB中randomize的作用

sqlserver 中rand()是产生随机数,为啥还要设置种子?

Tensorflow 不是确定性的,它应该在哪里

具有固定种子和可变精度的 boost::multiprecision 随机数