GPflow 2.0中使用Tensorflow双射链实现有界超参数优化

时间:2019-12-27 17:31:43

标签: optimization python-3.7 tensorflow2.0 tensorflow-probability gpflow

在GPflow 2.0中进行GP回归时,我想在长度比例上设置硬边界(即限制长度比例优化范围)。在该线程(Setting hyperparameter optimization bounds in GPflow 2.0之后,我构造了一个TensorFlow Bijector链(请参见下面的using namespace boost::math; students_t distt(df); // implementation of M +- t(df, 1 - alpha)*standadrd_deviation/sqrt(n) // with t(df, alpha) being the quantile of a student_t distribution with df degress of freedom and significance alpha double quantile_ = quantile(complement(distt, this->alpha/2)); double W = quantile_ * std_M ; // std_M is the standard deviation divided by sqrt(num of elements) double CI_MUpper = mesor + W; double CI_MLower = mesor - W; 函数)。但是,下面的双射链不会阻止模型在假定范围之外进行优化。我需要更改什么以使cart, cart_response = Cart.objects.get_or_create(owner=owner, is_ordered=False, ref_code=ref_code) OrderItem.create(cart=cart, item_count=item_count, price=total_price, color=color, size=size, product=product) 函数对优化施加严格的限制?

下面是MRE:

bounded_lengthscale

谢谢!

2 个答案:

答案 0 :(得分:1)

在MWE中,您将assign新的设置为已存在的Parameter(并且没有逻辑转换)。该值是使用逻辑转换构造的Parameter具有的约束空间值,但是该转换不会被继承。取而代之的是,您需要替换而不进行逻辑转换的参数,而将其替换为您想要的转换:m.kernel.lengthscale = bounded_lengthscale(0,1,0.5)

请注意,您分配给kernel.lengthscale属性的对象必须是一个Parameter实例;如果您像MWE中那样分配tf.cast(parameter)的返回值,则它等效于一个常量,并且实际上不会对其进行优化!

由于float32 / float64不匹配,在此问题中仅移动MWE中的tf.cast不会立即起作用。要解决此问题,AffineScalar双射器必须位于float64中;它没有dtype参数,而是将参数分别转换为shift=scale=到所需的类型:

def bounded_lengthscale(low, high, lengthscale):
    """Make lengthscale tfp Parameter with optimization bounds."""
    affine = tfb.AffineScalar(shift=tf.cast(low, tf.float64),
                              scale=tf.cast(high-low, tf.float64))
    sigmoid = tfb.Sigmoid()
    logistic = tfb.Chain([affine, sigmoid])
    parameter = gpflow.Parameter(lengthscale, transform=logistic, dtype=tf.float64)
    return parameter

m.kernel.lengthscale = bounded_lengthscale(0, 1, 0.5)

(GPflow可能应该包含这样的帮助器函数,以使有界参数转换更易于使用-GPflow总是感谢人们的帮助,因此,如果要将其转换为请求请求,请这样做!)

答案 1 :(得分:0)

tfb.Sigmoid 现在接受 lowhigh 参数,正如@Brian Patton 在评论中预测的那样。

因此,代码可以简化为:

from tensorflow_probability import bijectors as tfb

def bounded_lengthscale(low, high, lengthscale):
    """Make lengthscale tfp Parameter with optimization bounds."""
    sigmoid = tfb.Sigmoid(low, high)
    parameter = gpflow.Parameter(lengthscale, transform=sigmoid, dtype='float32')
    return parameter

m.kernel.lengthscale = bounded_lengthscale(0, 1, 0.5)