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

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