cloud_ml_engine scaleType 实现
cloud_ml_engine scaleType implementation
我正在尝试使用 scikit-optimize (skopt) 实现 google 云 ml 引擎的超参数调整功能。我不确定如何始终如一地转换 ml-engine 的 scaleType to skopt.space.Real 的 prior
s.
Uniform 已经足够直接了,log-uniform 看起来 在每个方面都有一个等价物 - 但我不完全确定实现是一致的。如果 LOG_SCALE
与 skopt
的 log-uniform
一致,我也不确定如何实现 ml 引擎的 UNIT_REVERSE_LOG_SCALE
。 log-uniform
分布似乎并不像远离 0
的参数那样表现 - 例如如果你想在 0.9
和 0.999
之间缩放,分布接近均匀(见下面的第一张图)。
代码和可视化使用 skopt
s 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
是像上面的 custom-reverse-log-uniform
一样实现 REVERSE_LOG_SCALE
还是其他?
Cloud ML Engine 不使用 scikit learn 进行超参数调整,而是使用自定义实现来提供最先进的结果。
对于具有可行区域 [a, b] 的参数:UNIT_LOG_SCALE
将可行区域 space 以对数方式缩放到 [0, 1]。这会将值 x 映射到 log(x / a) / log(b / a)。 UNIT_REVERSE_LOG_SCALE
将可行的 space "reverse" 以对数方式缩放到 [0, 1]。这会将值 x 映射到 1.0 - log((b + a - x) / a) / log(b / a)。
我正在尝试使用 scikit-optimize (skopt) 实现 google 云 ml 引擎的超参数调整功能。我不确定如何始终如一地转换 ml-engine 的 scaleType to skopt.space.Real 的 prior
s.
Uniform 已经足够直接了,log-uniform 看起来 在每个方面都有一个等价物 - 但我不完全确定实现是一致的。如果 LOG_SCALE
与 skopt
的 log-uniform
一致,我也不确定如何实现 ml 引擎的 UNIT_REVERSE_LOG_SCALE
。 log-uniform
分布似乎并不像远离 0
的参数那样表现 - 例如如果你想在 0.9
和 0.999
之间缩放,分布接近均匀(见下面的第一张图)。
代码和可视化使用 skopt
s 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
是像上面的custom-reverse-log-uniform
一样实现REVERSE_LOG_SCALE
还是其他?
Cloud ML Engine 不使用 scikit learn 进行超参数调整,而是使用自定义实现来提供最先进的结果。
对于具有可行区域 [a, b] 的参数:UNIT_LOG_SCALE
将可行区域 space 以对数方式缩放到 [0, 1]。这会将值 x 映射到 log(x / a) / log(b / a)。 UNIT_REVERSE_LOG_SCALE
将可行的 space "reverse" 以对数方式缩放到 [0, 1]。这会将值 x 映射到 1.0 - log((b + a - x) / a) / log(b / a)。