HpBandSter代码理解

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:
Nb,l=max(Nmin,qNb)N_{b,l}=max(N_{min},q\cdot N_{b})
Nb,g=max(Nmin,NbNb,l)N_{b,g}=max(N_{min}, N_{b}-N_{b,l})

		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

几个还没有搞清楚的问题:

  1. 在一个iteration中,在过度不同的stage时,是否会沿用上一次迭代的configs?
  2. BOHB是根据budget去分组构建概率模型。在不同的iteration中,会用上次budget的kde吗?
  3. 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的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章