Random 理解PyTorch中的ByteTensor种子

Random 理解PyTorch中的ByteTensor种子,random,pytorch,random-seed,Random,Pytorch,Random Seed,我知道种子是用来初始化伪随机数生成器的数字。在pytorch中,torch.get_rng_state文档状态如下“将随机数生成器状态作为torch.ByteTensor返回”。当我打印它时,我得到一个大小为5048的一维张量,其值如下所示 张量([80,78,248,…,0,0,0],dtype=torch.uint8) 为什么种子有5048个值,这与我们可以使用火炬获得的普通种子有何不同。初始种子听起来好像你认为种子和状态是等价的。对于较旧的伪随机数生成器(PRNG),这是正确的,但对于更现

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

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


为什么种子有5048个值,这与我们可以使用火炬获得的普通种子有何不同。初始种子听起来好像你认为种子和状态是等价的。对于较旧的伪随机数生成器(PRNG),这是正确的,但对于更现代的PRNG,其工作方式与所描述的一样。(链接中的答案是针对Mersenne Twister编写的,但这些概念同样适用于其他生成器。)

为什么不使用32位或64位状态空间并将状态报告为生成器的输出是个好主意?因为如果你这样做,一旦你看到任何值重复,整个序列就会重复。PRNG被设计为“全周期”,即在重复之前迭代最大数量的值。表明该方法能快速(O(sqrt(周期长度))将此类PRNG识别为非随机。这意味着,例如,对于32位整数,在统计学家能够以高于99%的置信度调用您之前,您不应该使用超过50000个值。许多现代PRNG使用的解决方案是拥有更大的状态空间并将其折叠以输出32位或64位结果。Since多个状态可以产生相同的输出,在不复制整个流的情况下,输出流中会发生重复。看起来PyTorch就是这么做的

考虑到更大的状态空间,为什么允许使用单个整数进行种子设定?方便。例如,Mersenne Twister有一个19937位的状态空间,但大多数人不想输入那么多信息来启动它。如果愿意,可以输入,但大多数人使用前端,它从单个整数输入填充整个状态空间