【问题标题】:How does random number generation ensure reproducibility?随机数生成如何确保可重复性?
【发布时间】:2017-08-02 06:29:45
【问题描述】:

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

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

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

【问题讨论】:

    标签: matlab random


    【解决方案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

    【讨论】:

      【解决方案2】:

      因为有时使用相同的随机数是好的,这就是 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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 2011-03-06
            • 1970-01-01
            • 2019-06-15
            • 1970-01-01
            • 2019-07-13
            • 1970-01-01
            • 2018-05-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多