ハイパーパラメータの最適化にSMAC v3を使用しようとしています。
ターゲット関数 ( tae_runner ) の計算量を一定にして最適化プロセスを制限し、「ミニバッチ」モードで実行し
たいと考えています。止まったところ。
この計算予算の妥当なサイズを決定するにはどうすればよいでしょうか?
以下に懸念事項を説明します。
私のターゲット関数はかなり高価で、計算に 1 ~ 10 秒、またはそれ以上かかることがあります。したがって、ミニバッチを使用して、問題に固有の追加の手順を実行することにしました。
budget = .. # 1? 10? 100? 1000? 10000?
total_limit = budget
my_scenario = Scenario({"run_obj": "quality",
"cs": my_configuratoin_space
"runcount_limit": total_limit
})
smac = SMAC(scenario=my_scenario, rng=42, tae_runner=my_target_function)
best_configuration = self.smac.optimize()
# when I decide to continue running:
total_limit += budget
my_scenario = Scenario({"run_obj": "quality",
"cs": my_configuratoin_space,
"runcount-limit": total_limit
})
smac.stats._Stats__scenario = my_scenario
better_configuration = smac.optimize()
このコードはうまくいくようです。ドキュメントで見つけたものは次のとおりです。
wallclock_limit、runco unt_limit、および tuner-timeout は、最適化に使用される最大ウォールクロック時間、アルゴリズム呼び出しの数、および CPU 時間をそれぞれ制御するために使用されます。
リポジトリのコードから理解できる限り、このコードは次のように簡単に機能します。
1) SMAC は SMBO をラップし、シナリオとその他のパラメーターをそれに渡します。
2)常に新しいチャレンジャーを生成しているメインの SMBO ループがあります(インターリーブ ランダムを含めて、たまたま 10K になります)。
challengers = self.choose_next(X, Y)
そしてそれらを現職者と比較します (これまでで最もよく見つかった構成):
self.incumbent, inc_perf = self.intensifier.intensify(
challengers=challengers,
...
time_bound=max(self.intensifier._min_time, time_left))
runco unt_limitしか設定していない場合、 time_boundは何ですか?
3) 予算を超えた場合、メインの smbo ループは終了します。
if self.stats.is_budget_exhausted():
break
そして、生成され、コストが予測され、ソートされた残りのチャレンジャーは、単にドロップされます。
私の懸念は次のとおりです。runcount_limit の値が小さすぎる場合、たとえば1
、または10
そのようなものである場合、多くの構成 (5K) を生成、ソート、および破棄するためのリソースが大量に浪費され、開始と停止のオーバーヘッドが発生する可能性があります。ミニバッチごとに smac 。
一方、runcount_limitを 10K の倍数に設定すると、ミニバッチではなくなります。
それらのバッチのサイズを実証する方法を提案できますか?