我尝试使用SMAC v3进行超参数优化。
我希望使用目标函数固定数量( tae_runner )计算来限制优化过程,并在" mini-batch&#34中运行它;模式:
首先,我用一些预算运行SMAC,然后我再添加一些,并从停止的地方开始继续。
如何确定此计算预算的合理大小?
让我解释下面的问题:
我的目标功能相当昂贵,可能需要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()
此代码似乎有效。以下是我在docs中找到的内容:
wallclock_limit, runcount_limit 和tuner-timeout用于控制 最大wallclock-time,算法调用次数和使用的cpu-time 分别用于优化。
据我所知,从存储库中的代码可以看出,此代码的工作原理如下:
1)SMAC包装SMBO并将Scenario和其他参数传递给它。
2)有main SMBO loop,它不断产生新的挑战者(恰好是10K,包括交错randoms):
challengers = self.choose_next(X, Y)
并将它们与现任(迄今为止找到的最佳配置)进行比较:
self.incumbent, inc_perf = self.intensifier.intensify(
challengers=challengers,
...
time_bound=max(self.intensifier._min_time, time_left))
这里的 time_bound 是什么,如果我只设置 runcount_limit ,顺便说一下?
3)如果超出预算,主smbo循环退出:
if self.stats.is_budget_exhausted():
break
其他挑战者,即生成,成本预测和分类,只是放弃了。
我关注的是以下:
如果runcount_limit值太小,例如1
或10
或类似的东西,它可能会浪费大量资源来生成,排序和丢弃大量配置(5K)以及开销为每个小批量启动和停止smac
另一方面,如果我将 runcount_limit 设置为10K的倍数,则不再是小批量。
您能否建议一种方法来确定这些批次的大小?