我正在尝试使用scikit-optimize(skopt)实现Google Cloud ml引擎超参数调整的功能。我不确定如何将ml-engine的scaleType转换为skopt.space.Real的prior
。
统一很简单,对数统一看起来在每个方面都具有等效性-但我不完全确定实现是否一致。如果UNIT_REVERSE_LOG_SCALE
与LOG_SCALE
的{{1}}一致,我也不确定如何实现ml引擎的skopt
。对于log-uniform
以外的参数,log-uniform
分布的行为似乎并不理想-例如如果要在0
和0.9
之间缩放,则分布接近均匀(请参见下面的第一幅图)。
使用0.999
s skopt
和下面的几个自定义转换进行代码和可视化。
log-uniform
我的问题是:
#!/usr/bin/python
import numpy as np
import matplotlib.pyplot as plt
import skopt
def sample_custom_log_uniform(min_val, max_val, n_samples):
sample = skopt.space.uniform(0, 1).rvs(n_samples)
return min_val + (10 ** sample - 1) / 9 *(max_val - min_val)
def sample_custom_reverse_log_uniform(min_val, max_val, n_samples):
sample = skopt.space.uniform(0, 1).rvs(n_samples)
return max_val - (10 ** sample - 1) / 9 *(max_val - min_val)
def sample(min_val, max_val, prior='log-uniform', n_samples=100000):
if prior == 'custom-log-uniform':
return sample_custom_log_uniform(min_val, max_val, n_samples)
elif prior == 'custom-reverse-log-uniform':
return sample_custom_reverse_log_uniform(min_val, max_val, n_samples)
else:
return skopt.space.Real(min_val, max_val, prior=prior).rvs(n_samples)
priors = (
'log-uniform', 'custom-log-uniform', 'custom-reverse-log-uniform')
fig, axes = plt.subplots(1, len(priors))
for (prior, ax) in zip(priors, axes):
ax.hist(sample(0.9, 0.999, prior))
ax.set_title(prior)
ax.set_yticklabels([])
plt.show()
是否将ml engine
实施为以上的LOG_SCALE
或log-uniform
,还是其他?custom-log-uniform
是否像上面的ml engine
一样实现REVERSE_LOG_SCALE
,还是其他?答案 0 :(得分:1)
对于具有可行区域[a,b]的参数:UNIT_LOG_SCALE
将可行空间对数地缩放为[0,1]。这会将值x映射到log(x / a)/ log(b / a)。 UNIT_REVERSE_LOG_SCALE
对数地将可行空间“反向”缩放为[0,1]。这会将值x映射到1.0-log((b + a-x)/ a)/ log(b / a)。
答案 1 :(得分:0)
Cloud ML Engine并未使用scikit learning进行超参数调整,而是使用自定义实现,使我们能够提供最先进的结果。