在PyTorch中了解ByteTensor的种子

时间:2018-11-23 19:27:56

标签: random pytorch random-seed

我知道种子是用于初始化伪随机数生成器的数字。在pytorch中,torch.get_rng_state文档的状态如下:“将随机数生成器状态作为torch.ByteTensor返回。”。当我打印时,我得到一维张量为5048的张量,其值如下所示

  

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

为什么种子有5048个值,这与我们可以使用torch.initial_seed获得的普通种子有何不同

1 个答案:

答案 0 :(得分:1)

听起来您正在将种子和状态视为等效。对于较旧的伪随机数生成器(PRNG),这是正确的,但对于更现代的PRNG,它们倾向于按here中所述工作。 (链接中的答案是针对Mersenne Twister编写的,但这些概念同样适用于其他生成器。)

为什么没有32位或64位状态空间并将状态报告为生成器的输出是一个好主意?因为如果这样做,一旦看到任何值重复,整个序列就会重复。 PRNG被设计为“完整周期”,即在重复之前迭代尽可能多的值。 This paper表明birthday problem可以很快(O(sqrt(cycle-length))将此类PRNG识别为非随机。这意味着,例如,对于32位整数,您不应使用在统计人员可以以超过99%的置信度好胜过之前,您需要使用超过约500000个值。许多现代PRNG使用的解决方案是拥有更大的状态空间并将其折叠以输出32或64-位结果。由于多个状态可以产生相同的输出,因此输出流中将出现重复项,而不会复制整个流。这就是PyTorch所做的。

鉴于更大的状态空间,为什么允许使用单个整数进行播种?方便。例如,梅森·扭转者(Mersenne Twister)具有19,937位的状态空间,但是大多数人不想输入那么多信息来启动它。您可以根据需要进行操作,但是大多数人都使用前端,该前端从单个整数输入填充整个状态空间。