随机数生成如何确保可重复性?



在阅读有关 MATLab 迁移学习的信息时,我遇到了一段代码,上面写着......

rng(2016) % For reproducibility
convnet = trainNetwork(trainDigitData,layers,options);

。在训练网络之前,以便尝试该代码的任何人都可以完全按照示例中给出的结果重现结果。我想知道使用rng(seed_value)函数生成伪随机数如何帮助整个结果范围的可重复性?

不是随机数生成,随机数生成器种子

没有随机数这样的东西,只有伪随机数,行为几乎是随机的,通常由一些复杂的数学函数产生,通常需要初始值的函数。通常,计算机从PC微芯片中的时间寄存器中获取此初始值,从而"确保"随机性。

但是,如果您有一个基于随机数的算法(例如 NN(,则当您想要共享结果时,可重复性可能是一个问题。重新运行您的代码的人将确保获得不同的结果,因为随机性是算法的一部分。但是,您可以告诉随机数生成器,而不是从随机获取的种子开始,而是从固定种子开始。这将确保虽然生成的数字在它们之间是随机的,但它们每次都是相同的(例如[3 84 12 21 43 6]可以是随机输出,但 ti 将始终相同(。

通过为您的 NN 设置种子,您可以确保对于相同的数据,它将输出相同的结果,因此您可以使您的代码"可重现",即其他人可以运行您的代码并获得完全相同的结果。

作为测试,我建议您尝试以下方法:

rand(1,10)
rand(1,10)

然后尝试

rng(42)
rand(1,10)
rng(42)
rand(1,10)

伪随机数生成器的维基百科

因为有时使用相同的随机数是件好事,所以这就是 matlab 所说的

当您需要执行以下操作时,将种子和生成器类型同时设置:

Ensure that the behavior of code you write today returns the same results when you run that code in a future MATLAB® release.
Ensure that the behavior of code you wrote in a previous MATLAB release returns the same results using the current release.
Repeat random numbers in your code after running someone else's random number code

这是重新分配种子并生成相同随机数的要点。 MATLAB 在两篇好文章中指出了这一点,一篇用于重复数字,一篇用于不同数字

您不想从所有等于零的权重开始,因此在初始化阶段,您可以为权重提供一些随机值。在学习过程的后期搜索最小值时,或者在您提供数据的方式中,可能还涉及其他随机值。 因此,所有神经网络学习过程的真正输入是您的数据和随机数生成器。 如果它们是相同的,那么一切都会是一样的。 "rng"命令将随机数生成器置于预定义状态,因此它将生成相同的数字序列。

anquegi的回答,几乎回答了你的问题,所以这篇文章只是为了详细说明更多。

每当你要求一个随机数时,MATLAB 真正做的是生成一个伪随机数,它的分布为 U(0,1((即 [0,1]上的均匀( 这是通过一些确定性公式完成的,通常是这样的,参见 线性同余生成器:

X_{n+1} = (a X_{n} + b) mod M

则通过 U = X_{n+1}/M 得到一个均匀数。

但是,有一个问题,如果你想要X_{1},那么你需要X_{0}。您需要初始化生成器,这是种子。这也意味着一旦指定了X_{0},您每次都会绘制相同的随机数。尝试打开一个新的 MATLAB 实例,运行randn,关闭 MATLAB,再次打开它并再次运行randn。它将是相同的数字。这是因为 MATLAB 在打开时总是使用相同的种子。

因此,你对rng(2016)所做的是"重置"生成器,并输入X_{0} = 2016,这样你现在就知道你要求的所有数字,从而重现结果。

最新更新