我正在尝试使用SMAC v3进行超参数优化。
我想用固定数量的目标函数 ( tae_runner ) 计算来限制优化过程,并在“小批量”模式下运行它:
首先,我用一些预算运行 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()
这段代码似乎有效。这是我在文档中找到的:
wallclock_limit、runcount_limit和 tuner-timeout 分别用于控制最大 wallclock-time、算法调用次数和用于优化的 cpu-time。
据我从存储库中的代码了解,此代码的工作原理如下:
1) SMAC 包装 SMBO 并将 Scenario 和其他参数传递给它。
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))
顺便说一句,如果我只设置了runcount_limit ,这里的 time_bound 是多少?
3) 如果超出预算,则退出主 smbo 循环:
if self.stats.is_budget_exhausted():
break
而其余的挑战者,在生成、成本预测和排序的地方,都被丢弃了。
我担心的是:如果 runcount_limit 值太小,例如1
或10
类似的东西,可能会浪费大量资源来生成、排序和丢弃大量配置(5K)以及启动和停止的开销每个小批量的 smac。
另一方面,如果我将runcount_limit设置为 10K 的倍数,它就不再是小批量了。
你能建议一种方法来确定这些批次的大小吗?