cloud_ml_engine scaleType 实现

cloud_ml_engine scaleType implementation

我正在尝试使用 scikit-optimize (skopt) 实现 google 云 ml 引擎的超参数调整功能。我不确定如何始终如一地转换 ml-engine 的 scaleType to skopt.space.Realpriors.

Uniform 已经足够直接了,log-uniform 看起来 在每个方面都有一个等价物 - 但我不完全确定实现是一致的。如果 LOG_SCALEskoptlog-uniform 一致,我也不确定如何实现 ml 引擎的 UNIT_REVERSE_LOG_SCALElog-uniform 分布似乎并不像远离 0 的参数那样表现 - 例如如果你想在 0.90.999 之间缩放,分布接近均匀(见下面的第一张图)。

代码和可视化使用 skopts 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()

我的问题是:

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