hpbandster.core.worker.Worker#compute
是计算部分
kde_models
字典的添加:
hpbandster.optimizers.config_generators.bohb.BOHB#new_result
首先是要满足一个条件才能往kde_models
中添加记录
if train_data_good.shape[0] <= train_data_good.shape[1]:
return
if train_data_bad.shape[0] <= train_data_bad.shape[1]:
return
对应论文formula 3:
self.kde_models[budget] = {
'good': good_kde,
'bad' : bad_kde
}
self.kde_models[9.0]['good']
Out[21]:
KDE instance
Number of variables: k_vars = 1
Number of samples: nobs = 2
Variable types: c
BW selection method: normal_reference
type(self.kde_models[9.0]['good'])
Out[22]: statsmodels.nonparametric.kernel_density.KDEMultivariate
回到run函数:
hpbandster/core/master.py:206
next_run = self.iterations[i].get_next_run()
next_run
Out[32]: ((0, 0, 5), {'x': 0.021475631245521144}, 9.0)
这个三元组是什么意思呢?可以看到build.lib.hpbandster.core.base_iteration.BaseIteration#get_next_run
return(k, v.config, v.budget)
分别是config_id
, config
, budget
job是由调度器提交的
self.iterations[i]
Out[38]: <hpbandster.optimizers.iterations.successivehalving.SuccessiveHalving at 0x7f6a400ae9e8>
进入hpbandster.core.base_iteration.BaseIteration#get_next_run
self.data.keys()
Out[40]: dict_keys([(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 0, 4), (0, 0, 5)])
键应该都是config_id
type(self.data[(0, 0, 0)])
Out[42]: hpbandster.core.base_iteration.Datum
self.actual_num_configs
Out[46]: [6, 0, 0, 0]
self.stage
Out[47]: 0
self.num_configs
Out[48]: [27, 9, 3, 1]
actual_num_configs
表示已经运行的配置数
num_configs
表示应该运行的配置数
stage
表示当前的阶段
看到hpbandster.core.base_iteration.BaseIteration#add_configuration
self.config_sampler
Out[49]: <bound method BOHB.get_config of <hpbandster.optimizers.config_generators.bohb.BOHB object at 0x7f6a78de66a0>>
难道这就是传说中的代理模式吗
取配置:
config, config_info = self.config_sampler(self.budgets[self.stage])
进入hpbandster.optimizers.config_generators.bohb.BOHB#get_config
这个函数对应的是论文的 Algorithm 2, 即用贝叶斯算法采样的部分
再看下kde_model
是怎么构建的。
hpbandster.optimizers.config_generators.bohb.BOHB#new_result
BOHB总体总体上就是HyperBand,不过采样部分用的是BO。
HyperBand是一个2层循环,
第一层是iterations,第二层是stages
min_budget:9
max_budget:243
n_iterations:4
iteration : 0
s : 3
n0 : 27
ns : [27, 9, 3, 1]
budgets : [ 9. 27. 81. 243.]
num_configs : [27, 9, 3, 1]
iteration : 1
总budget: 234x4
s : 2
n0 : 9
ns : [9, 3, 1]
budgets : [ 27. 81. 243.]
num_configs : [9, 3, 1]
iteration : 2
总budget: 234x3
s : 1
n0 : 6
ns : [6, 2]
budgets : [ 81. 243.]
num_configs : [6, 2]
iteration : 3
总budget: 234x2
s : 0
n0 : 4
ns : [4]
budgets : [243.]
num_configs : [4]
总budget: 234x4
几个还没有搞清楚的问题:
- 在一个iteration中,在过度不同的stage时,是否会沿用上一次迭代的configs?
- BOHB是根据budget去分组构建概率模型。在不同的iteration中,会用上次budget的kde吗?
- n_iterations与stages的关系?
hpbandster.optimizers.config_generators.bohb.BOHB#new_result
if max(list(self.kde_models.keys()) + [-np.inf]) > budget:
return
如果kde_models已经有27.0的budget,9.0 budget的样本点不会触发更新
self.configs
是BOHB的一个成员变量。是一个dict,key是budget。
hpbandster.core.base_iteration.BaseIteration#process_results
这个函数是在一次stage结束后,挑选config进入下一次stage的。