このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
ベイズ最適化を並列実行すると,時間を節約できます。並列実行には并行计算工具箱™が必要です。bayesopt
は並列ワーカー上で,目的関数の並列評価を同時実行します。
最適化を並列で行うには,
bayesopt
——名前と値のペアUseParallel
を真正的
に設定します。たとえば,以下のようにします。
结果= bayesopt (var,有趣“UseParallel”,真正的);
近似関数——構造体HyperparameterOptimizationOptions
のUseParallel
フィールドを真正的
に設定します。たとえば,以下のようにします。
Mdl = fitcsvm (X, Y,“OptimizeHyperparameters”,“汽车”,...“HyperparameterOptimizationOptions”结构(“UseParallel”,真正的))
並列ベイズ最適化アルゴリズムは,ベイズ最適化のアルゴリズムで説明されている逐次アルゴリズムに似ています。相違点は,
bayesopt
は評価対象の点(通常は一度に1つずつの点)を並列ワーカーに割り当てます。bayesopt
はどの点を割り当てるかを決定するための計算をクライアントで行います。
bayesopt
は,初期の無作為な点を評価した後で,ガウス過程(GP)モデルをあてはめることにより評価対象の点を選択します。bayesopt
は,まだ点を評価しているワーカーがある状態でGPモデルをあてはめるため,まだワーカー上にある各点に値を割り当て(補定し)ます。補定値は,評価対象の点におけるGPモデル値の平均,またはbayesopt
の名前と値のペア“ParallelMethod”
によって指定された他の値です。近似関数の並列最適化の場合,bayesopt
は補定値としてParallelMethod
の既定値を使用します。
bayesopt
は,評価対象の点を割り当てた後で,新しい割り当て対象の点を計算する前に,アイドル状態のワーカーが過剰にあるかどうかをチェックします。アクティブワーカーのしきい値は名前と値のペアMinWorkerUtilization
によって決定されます。アイドル状態のワーカーが過剰にある場合,bayesopt
はすべてのアイドルワーカーに対し,範囲内で一様に選択した無作為な点を割り当てます。このステップによりワーカーがより短時間でアクティブになりますが,あてはめられた点ではなく無作為な点がワーカーに割り当てられます。アイドルワーカーの個数がしきい値を超えていない場合,bayesopt
はGPモデルをあてはめて獲得関数を最大化することにより評価対象の点を通常どおり選択します。
メモ
並列でのタイミングに再現性がないため,並列ベイズ最適化で再現性のある結果が生成されるとは限りません。
近似関数には,並列実行のパフォーマンスを向上させるための特別な設定はありません。対照的に,bayesopt
には最適化の高速化に役立つ設定がいくつかあります。
GPActiveSetSize
オプションを既定(300
)より小さい値に設定すると,計算が高速になる可能性があります。代償として,大きい値の場合より目的関数のGPモデルの精度が低下する可能性があるため,bayesopt
が評価対象として選択する点の精度が低下する可能性があります。このオプションを大きい値に設定すると,GPモデルは正確になる可能性がありますが,モデルの作成に必要な時間が長くなります。
ParallelMethod
オプションを“max-observed”
に設定すると,bayesopt
は大域的な最適値をより幅広く探索するようになります。これにより,より適切な解がより短い時間で得られるようになる可能性があります。ただし,多くの場合で既定値の“clipped-model-prediction”
が最適です。
MinWorkerUtilization
オプションを大きい値に設定すると,並列の使用率が増加する可能性があります。ただし,この設定では評価対象として完全に無作為な点の個数が増えるので,解の精度が低下する可能性があります。この場合の大きい値は,使用するワーカーの個数によって異なります。既定の設定は地板(0.8 * N)
です。N
は並列ワーカーの個数です。このオプションを小さい値に設定すると,並列の使用率が低下する可能性がありますが,点の品質が向上するというメリットがあります。
3つの方法のいずれかにより,目的関数を並列ワーカーに配置できます。一部の方法ではパフォーマンスが向上しますが,より複雑な設定が必要になります。
1.自動:目的関数として関数ハンドルを与えた場合,bayesopt
は実行の最初にハンドルをすべての並列ワーカーに送ります。たとえば,以下のようにします。
负载电离层分裂= optimizableVariable (“分裂”[1100],“类型”,“整数”);minleaf = optimizableVariable (“minleaf”[1100],“类型”,“整数”);有趣= @ (params) kfoldLoss (fitctree (X, Y,“Kfold”5,...“MaxNumSplits”params.splits,“MinLeaf”params.minleaf));结果= bayesopt(有趣,[分裂,minleaf],“UseParallel”,真正的);
この方法は,ハンドルが小さい場合または最適化を1回だけ実行する場合に効果的です。しかし,最適化を複数回実行する場合は,他の2つの方法のいずれかを使用すると時間を節約できます。
2.並列定数:最適化を複数回実行する場合は,目的関数を1回だけワーカーに転送することにより時間を節約します。関数ハンドルに大量のデータが含まれている場合,この方法は特に効果的です。次の例のように関数ハンドルを構造体parallel.pool.Constant
(并行计算工具箱)に設定して,目的関数を1回だけ転送します。
负载电离层分裂= optimizableVariable (“分裂”[1100],“类型”,“整数”);minleaf = optimizableVariable (“minleaf”[1100],“类型”,“整数”);有趣= @ (params) kfoldLoss (fitctree (X, Y,“Kfold”5,...“MaxNumSplits”params.splits,“MinLeaf”params.minleaf));C = copyFunctionHandleToWorkers(有趣的);其中回答= bayesopt (C[分裂,minleaf]“UseParallel”,真正的);results2 = bayesopt (C[分裂,minleaf]“UseParallel”,真的,...“MaxObjectiveEvaluations”, 50);results3 = bayesopt (C[分裂,minleaf]“UseParallel”,真的,...“AcquisitionFunction”,“expected-improvement”);
この例では,copyFunctionHandleToWorkers
は関数ハンドルを1回だけワーカーに送ります。
3 .ワーカー上での目的関数の作成:ワーカーに送るデータが大量にある場合は,spmd
(并行计算工具箱)を使用してワーカーにデータを読み込むことにより,クライアントにおけるデータの読み込みを回避できます。分散された目的関数へのアクセスには,复合
(并行计算工具箱)とparallel.pool.Constant
を使用します。
% makeFun位于脚本的末尾spmd有趣= makeFun ();结束% ObjectiveFunction现在是合成的。得到一个parallel.pool.Constant%引用它,而不复制到客户端:C = parallel.pool.Constant(有趣的);你也可以使用line% C = parallel.pool.Constant(@MakeFun);%在这种情况下,您不使用spmd%调用bayesopt,传递常量分裂= optimizableVariable (“分裂”100年[1]);minleaf = optimizableVariable (“minleaf”100年[1]);bo = bayesopt(C,[split minleaf],“UseParallel”,真正的);函数f = makeFun() load(电离层的,“X”,“Y”);f = @fun;函数L = kfoldLoss(fitctree(X,Y))...“KFold”5,...“MaxNumSplits”Params.splits,...“MinLeaf”Params.minleaf));结束结束
この例では,関数ハンドルはワーカーのみに存在します。ハンドルがクライアントに現れることはありません。
bayesopt
を並列実行する場合,ベイズ最適化の出力には次のような違いがあります。
反復表示——アクティブワーカーの個数を示す列が反復表示に含まれます。これは,bayesopt
がジョブを次のワーカーに割り当てた後の値です。
プロット関数
目的関数モデルのプロット(@plotObjectiveModel
)には,保留中の点(並列ワーカー上で実行中の点)が示されます。点の高さは名前と値のペアParallelMethod
によって変化します。
経過時間のプロット(@plotElapsedTime
)には,合計経過時間が[リアルタイム],というラベルですべてのワーカーについて合計した目的関数の総評価時間が(目的関数の評価時間(すべてのワーカー))というラベルで表示されます。目的関数の評価時間には,ジョブでワーカーを起動する時間が含まれます。
parallel.pool.Constant
(并行计算工具箱)|spmd
(并行计算工具箱)