并行贝叶斯优化
并行优化
并行运行贝叶斯优化可以节省时间。并行运行需要并行计算工具箱™。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
)显示使用标签的总时间实时并将总目标函数评价时间,加在所有工人身上,加上标签客观评价时间(全体工人).客观评价时间包括一个工人开始工作的时间。
另请参阅
parallel.pool.Constant
(并行计算工具箱)|spmd
(并行计算工具箱)