【问题标题】:understanding seed of a ByteTensor in PyTorch在 PyTorch 中理解 ByteTensor 的种子
【发布时间】:2018-11-23 19:27:55
【问题描述】:
我了解种子是用于初始化伪随机数生成器的数字。在 pytorch 中,torch.get_rng_state 文档状态如下“将随机数生成器状态返回为 torch.ByteTensor。”。当我打印它时,我得到一个大小为 5048 的一维张量,其值如下所示
张量([ 80, 78, 248, ..., 0, 0, 0], dtype=torch.uint8)
为什么种子有 5048 个值,这与我们可以使用 torch.initial_seed 获得的普通种子有何不同
【问题讨论】:
标签:
random
pytorch
random-seed
【解决方案1】:
听起来您认为种子和状态是等价的。对于较旧的伪随机数生成器 (PRNG),这是正确的,但对于更现代的 PRNG,往往会按照here 的描述工作。 (链接中的答案是针对 Mersenne Twister 编写的,但这些概念同样适用于其他生成器。)
为什么不使用 32 位或 64 位状态空间并将状态报告为生成器的输出是个好主意?因为如果你这样做,一旦你看到任何值重复,整个序列就会重复。 PRNG 被设计为“全周期”,即在重复之前迭代尽可能多的值。 This paper 表明 birthday problem 可以快速 (O(sqrt(cycle-length)) 将此类 PRNG 识别为非随机的。这意味着,例如,对于 32 位整数,您不应使用超过 ~50000在统计学家能够以高于 99% 的置信度为您调用之前的值。许多现代 PRNG 使用的解决方案是拥有更大的状态空间并将其折叠以输出 32 位或 64 位结果。多个状态可以产生相同的输出,输出流中会出现重复,而不会复制整个流。看起来这就是 PyTorch 正在做的事情。
鉴于更大的状态空间,为什么允许使用单个整数进行种子设定?方便。例如,Mersenne Twister 有一个 19,937 位的状态空间,但大多数人不想输入那么多信息来启动它。如果你愿意,你可以,但大多数人使用前端,它从单个整数输入填充完整的状态空间。