主要内容

并行贝叶斯优化

并行优化

并行运行贝叶斯优化可以节省时间。并行运行需要并行计算工具箱™。bayesopt在并行工作者上并发执行并行目标函数的计算。

并行优化:

  • bayesopt—设置UseParallel参数的名称-值真正的.例如,

    结果= bayesopt(fun,vars,“UseParallel”,真正的);
  • 适合功能-设置UseParallel字段HyperparameterOptimizationOptions结构真正的.例如,

    Mdl = fitcsvm(X,Y,“OptimizeHyperparameters”“汽车”...“HyperparameterOptimizationOptions”结构(“UseParallel”,真正的))

并行贝叶斯算法

并行贝叶斯优化算法类似于串行算法,在贝叶斯优化算法.区别在于:

  • bayesopt将要计算的点分配给并行工作线程,通常一次分配一个点。bayesopt在客户端上计算以确定分配哪个点。

  • bayesopt它通过拟合高斯过程(GP)模型来选择要评估的点。为了在一些工人还在评估分数时适应GP模型,bayesopt将一个值赋给仍然在worker上的每个点。估算值是GP模型在其评估点上的值的平均值,或者由bayesopt“ParallelMethod”名称-值参数。拟合函数的并行优化bayesopt使用默认值ParallelMethod估算值。

  • bayesopt分配一个要计算的点,在计算一个要分配的新点之前,它检查是否有太多的工人闲置。活动工作者的阈值由MinWorkerUtilization名称-值参数。如果有太多的工人闲置,那么bayesopt给所有空闲的工人分配随机点,在界限内统一选择。这一步使工人更快地活跃起来,但工人有随机点而不是拟合点。如果空闲工人的数量没有超过阈值,则bayesopt通过拟合GP模型和最大化获取函数,像往常一样选择一个点进行评估。

请注意

由于并行计时的不可再现性,并行贝叶斯优化不一定产生可再现的结果。

最佳并行性能设置

拟合函数没有特殊的设置以获得更好的并行性能。相比之下,几个bayesopt设置可以帮助加速优化。

解算器选项

设置GPActiveSetSize选项的值小于默认值(300)可以加快解决问题的速度。成本是潜在的不准确的点bayesopt选择评估,因为目标函数的GP模型的准确性可能低于较大的值。将选项设置为更大的值可以得到更准确的GP模型,但是需要更多的时间来创建模型。

设置ParallelMethod选项“max-observed”会导致bayesopt更广泛地寻找全局最优。这种选择可以在更短的时间内得到更好的解决方案。的默认值“clipped-model-prediction”往往是最好的。

设置MinWorkerUtilization选项设置为较大值会导致更高的并行利用率。然而,这种设置会导致评估更完全随机的点,这可能导致不太准确的解决方案。金宝搏官方网站在这种情况下,大的值取决于您有多少工人。默认为地板(0.8 * N),在那里N是并行工作者的数量。将该选项设置为较低的值可以降低并行利用率,但可以获得更高的质量点。

将目标函数放在工人身上

您可以通过以下三种方式之一将目标函数放在并行工作人员上。有些具有更好的性能,但需要更复杂的设置。

1.自动如果你给一个函数句柄作为目标函数,bayesopt在运行开始时将句柄发送给所有并行工作进程。例如,

负载电离层分割= optimizableVariable(“分裂”[1100],“类型”“整数”);minleaf = optimizableVariable(“minleaf”[1100],“类型”“整数”);fun = @(params)kfoldLoss(fitctree(X,Y,“Kfold”5,...“MaxNumSplits”params.splits,“MinLeaf”params.minleaf));结果= bayesopt(fun,[split,minleaf],“UseParallel”,真正的);

如果句柄很小,或者只运行一次优化,则此方法有效。但是,如果计划多次运行优化,则可以使用其他两种技术中的一种来节省时间。

2.平行的常数如果您计划多次运行优化,那么只需将目标函数传递给工作者一次就可以节省时间。当函数句柄包含大量数据时,这种技术尤其有效。通过将函数句柄设置为a来传递一次目标parallel.pool.Constant(并行计算工具箱)构造,如本例中所示。

负载电离层分割= optimizableVariable(“分裂”[1100],“类型”“整数”);minleaf = optimizableVariable(“minleaf”[1100],“类型”“整数”);fun = @(params)kfoldLoss(fitctree(X,Y,“Kfold”5,...“MaxNumSplits”params.splits,“MinLeaf”params.minleaf));C = copyFunctionHandleToWorkers(fun);results1 = bayesopt(C,[split,minleaf],“UseParallel”,真正的);results2 = bayesopt(C,[split,minleaf],“UseParallel”,真的,...“MaxObjectiveEvaluations”, 50);results3 = bayesopt(C,[split,minleaf],“UseParallel”,真的,...“AcquisitionFunction”“expected-improvement”);

在这个例子中,copyFunctionHandleToWorkers只向worker发送一次函数句柄。

3.建立工人的目标函数如果有大量数据要发送给worker,可以通过使用spmd(并行计算工具箱)加载工作线程上的数据。使用一个复合(并行计算工具箱)parallel.pool.Constant访问分布式目标函数。

% makeFun位于脚本的末尾spmdfun = makeFun();结束% ObjectiveFunction现在是一个Composite。获取一个parallel.pool.Constant%引用它,不复制到客户端:C = parallel.pool.Constant(fun);你也可以用电话线% C = parallel.pool.Constant(@MakeFun);在这种情况下,您不使用spmd调用bayesopt,传递常量分割= optimizableVariable(“分裂”, [1 100]);minleaf = optimizableVariable(“minleaf”, [1 100]);bo = bayesopt(C,[分割minleaf],“UseParallel”,真正的);函数f = makeFun() load(电离层的“X”“Y”);F = @乐趣;函数L = fun(参数)L = kfoldLoss(fitctree(X,Y,...“KFold”5,...“MaxNumSplits”Params.splits,...“MinLeaf”Params.minleaf));结束结束

在这个例子中,函数句柄只存在于worker上。句柄永远不会出现在客户端上。

并行贝叶斯优化输出的差异

bayesopt并行运行时,贝叶斯优化输出包含这些差异。

  • 迭代显示-迭代显示包括一列显示活动工人的数量。这是后面的数字bayesopt把工作分配给下一个工人。

  • 绘制函数

    • 目标函数模型图(@plotObjectiveModel)显示挂起的点(那些在并行工作上执行的点)。点的高度取决于ParallelMethod名称-值参数。

    • 流逝时间图(@plotElapsedTime)显示使用标签的总时间实时并将总目标函数评价时间,加在所有工人身上,加上标签客观评价时间(全体工人).客观评价时间包括一个工人开始工作的时间。

另请参阅

(并行计算工具箱)|(并行计算工具箱)

相关的话题