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的。