【问题标题】:Using rng('shuffle') function in parallel computing在并行计算中使用 rng('shuffle') 函数
【发布时间】:2014-11-05 01:00:21
【问题描述】:

我在Matlab 中有一个用于并行计算的parfor 循环。我希望在 8 个工作人员上每次调用这些 parforloops 时都有不同的随机数。如果我不使用rng('shuffle') 函数,我对randperm(10) 有相同的随机数。在这种情况下,我的代码在所有工作人员中同时在 randperm 之前运行 rng('shuffle') 函数。在这种情况下我有不同的随机数吗?当我在 parfor 循环中看到 randperm 输出时,其中一些输出是相同的!

我需要在rng('shuffle') 之前保存rng 并在结束并行循环后使用rng(saved_rng) 之类的东西?

我们在Matlab 帮助中有这个:

注意因为 rng('shuffle') 是基于随机数生成器的种子 在当前时间,你不应该使用这个命令来设置随机 如果您想确保独立,则在不同的工作人员上进行号码流 流。当命令发送到多个 同时工作人员,例如在 parfor、spmd 或 沟通工作。对于工作人员的独立流,使用 默认行为;或者如果这不足以满足您的需求, 考虑在每个工作人员上使用唯一的子流。

那我该怎么办?如果我删除rng,我会有不同的随机数吗?我有这些代码的两个版本。其中之一是使用parfor 和其他使用for 循环进行计算,我可以从for 循环中删除shuffle 吗?在这种情况下我有不同的随机数?

谢谢。

附言

我可以有这些结构:

parfor I=1:X
xx = randperm(10)
end


parfor I=1:X
rng('shuffle');
xx = randperm(10)
end

rng('shuffle');
parfor I=1:X
xx = randperm(10)
end

我想从randperm 函数中获得不同的随机数。我怎样才能做到这一点?对于for 结构,我需要shuffle 函数(没有它,随机数是相同的)但是当我将它添加到parfor 时,randperm 的一些随机输出是相同的!

【问题讨论】:

  • 你为什么使用rng('shuffle')?默认设置有什么问题?另外,是否可以将随机生成移到并行部分之前?
  • 感谢您的评论。我们可以删除parfor 中的rng('shuffle') 吗?为什么在parfor loop 之前需要random generation
  • 这并没有让我更清楚。您能否包含代码的简化版本,清楚地显示问题?
  • 好的。我会将其添加到主要问题中。

标签: matlab parallel-processing random-sample parfor


【解决方案1】:

要正确执行此操作,您需要选择支持并行子流的 RNG 算法(换句话说,您可以将随机流拆分为子流,并且每个子流仍然具有您想要的正确统计属性随机流)。

默认的 RNG 算法(Mersenne Twister 或 mt19937ar)不支持并行子流,但 MATLAB 支持两种算法(乘法滞后斐波那契生成器 mlfg6331_64 和组合的多重递归生成器 mrg32k3a)。

例如:

s = RandStream.create('mrg32k3a','NumStreams',4,'Seed','shuffle','CellOutput',true)

s 现在是一个随机数子流的元胞数组。都具有相同的种子,如果需要,您可以记录 s{1}.Seed 以进行重现。

现在,您可以调用 rand(s{1})(或 randn(s{1}))从流 1 中生成随机数,依此类推。使用reset(s{1}) 将流重置为其初始配置,您应该会发现每个流都可以单独重现。

然后,每个工作人员都可以生成随机数,这种方式在统计上仍然合理,并且即使在并行时也可以重现:

parfor i = 1:4
    rand(s{i})
end

有关更多信息,请查看加速统计计算下的统计工具箱文档。那里有几篇文章带您了解所有复杂的细节。如果您没有 Statistics Toolbox,请参阅 MathWorks 网站上的在线文档。

【讨论】:

  • 感谢您的回答。我在某处读到我应该只应该在parfor 中使用randperm,而不需要其他任何东西。由于在工人身上运行,我在每个 parfor 循环中都有不同的随机数流。我可以这样做吗?如果不是,那是什么问题?
  • 您可以在worker上使用randperm(s{i}),以及randrandnrandi
  • 为什么我们不能只使用randperm?除了使用randperm,我还使用configure 函数对神经网络进行了权重初始化。我应该怎么做,为什么?谢谢。
  • 默认行为是让每个worker使用组合的多重递归生成器,但是每个worker会以不同状态的RNG开始,所以randperm会在每个worker上给出不同的结果。我在回答中向您描述的是如何直接控制每个工人的 RNG 状态,并确保它们都是独立的、可重现的,并具有正确的统计属性。
  • 我将种子设置为shuffle,因为您希望获得新的随机数,而不是让它们每次都相同。如果您不希望这样,请将种子设置为特定的内容。命令statset 用于创建选项,您可以将这些选项直接传递到 Statistics Toolbox 中的某些命令中,告诉他们您希望如何处理随机数生成。如果您没有使用 Statistics Toolbox 中的这些命令,则没有必要。
猜你喜欢
  • 2014-03-04
  • 1970-01-01
  • 2019-02-18
  • 1970-01-01
  • 1970-01-01
  • 2016-10-04
  • 1970-01-01
  • 1970-01-01
  • 2020-04-27
相关资源
最近更新 更多