3

我正在尝试使用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、runco​​unt_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))

顺便说一句,如果我只设置了runco​​unt_limit 这里的 time_bound 是多少?

3) 如果超出预算,则退出主 smbo 循环

    if self.stats.is_budget_exhausted():
        break

而其余的挑战者,在生成、成本预测和排序的地方,都被丢弃了。

我担心的是:如果 runco​​unt_limit 值太小,例如110类似的东西,可能会浪费大量资源来生成、排序和丢弃大量配置(5K)以及启动和停止的开销每个小批量的 smac。
另一方面,如果我将runco​​unt_limit设置为 10K 的倍数,它就不再是小批量了。

你能建议一种方法来确定这些批次的大小吗?

4

0 回答 0