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

时间:2017-08-02 06:29:45

标签: matlab random

在阅读Transfer Learning with MATLab时,我遇到了一段代码......

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

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

4 个答案:

答案 0 :(得分:1)

因为有时候使用相同的随机数很好,这就是matlab says关于那个

  

如果要执行以下操作,请将种子和生成器类型设置为:

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在两篇好文章中指出了一篇repeating numbers和一篇different numbers

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

每当你要求一个随机数时,MATLAB真正做的是,它产生一个伪随机数,它具有分布U(0,1)(即[0,1]上的统一)这是通过一些确定性公式,通常类似于,见Linear congruential generator

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,以便您现在知道您要求的所有数字,从而重现结果。

答案 3 :(得分:1)

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

没有随机数,只是伪随机数,行为几乎随机的数字,通常来自某些复杂的数学函数,通常需要初始值的函数。通常,计算机从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)

Wikipedia for Pseudo-random number generator