了解 PyTorch 中 ByteTensor 的种子

understanding seed of a ByteTensor in PyTorch

我了解到种子是用于初始化伪随机数生成器的数字。在 pytorch 中,torch.get_rng_state 文档说明如下 "Returns the random number generator state as a torch.ByteTensor."。当我打印它时,我得到一个大小为 5048 的一维张量,其值如下所示

tensor([ 80, 78, 248, ..., 0, 0, 0], dtype=torch.uint8)

为什么一个种子有 5048 个值,这与我们可以使用 torch.initial_seed

获得的普通种子有何不同

听起来您好像在考虑种子和状态是等价的。对于较旧的伪随机数生成器 (PRNG),这是正确的,但对于更现代的 PRNG,往往会按照 所述的方式工作。 (link 中的答案是针对 Mersenne Twister 编写的,但这些概念同样适用于其他生成器。)

为什么不使用 32 位或 64 位状态 space 并将状态报告为生成器的输出是个好主意?因为如果你这样做,一旦你看到任何重复的值,整个序列就会重复。 PRNG 被设计为 "full cycle,",即在重复之前迭代可能的最大数量的值。 This paper showed that the birthday problem 可以快速 (O(sqrt(cycle-length)) 将此类 PRNG 识别为非随机的。这意味着,例如,对于 32 位整数,您不应该在统计学家之前使用超过 ~50000 个值可以用超过 99% 的置信度告诉你。许多现代 PRNG 使用的解决方案是拥有更大的状态 space 并将其折叠以输出 32 位或 64 位结果。因为多个状态可以产生相同的输出,重复项将出现在输出流中,而不会复制整个流。看起来这就是 PyTorch 正在做的事情。

鉴于较大的状态 space,为什么允许使用单个整数进行播种?方便。例如,Mersenne Twister 有一个 19,937 位的状态 space,但大多数人不想输入那么多信息来启动它。如果你愿意,你可以,但大多数人使用从单个整数输入填充完整状态 space 的前端。