在GPflow 1.0中,如果我想对像lengthscale这样的参数设置硬边界(即,限制参数的优化范围),
transforms.Logistic(a=4., b=6.)
将参数限制在4到6之间。
GPflow 2.0的文档说,转换由TensorFlow Probability的Bijector类处理。哪个Bijector类可以处理对参数设置的硬限制,以及实现它的正确方法是什么?
此处(Kernel's hyper-parameters; initialization and setting bounds)提出了有关GPflow 1.0的类似问题。但是由于GPflow 1.0不涉及使用Bijector,所以我提出了一个新问题。
答案 0 :(得分:1)
这很容易实现双射链:
In [35]: a = 3.0
...: b = 5.0
...: affine = tfp.bijectors.AffineScalar(shift=a, scale=(b - a))
...: sigmoid = tfp.bijectors.Sigmoid()
...: logistic = tfp.bijectors.Chain([affine, sigmoid])
In [36]: logistic.forward(logistic.inverse(3.1) + 0.0)
Out[36]: <tf.Tensor: id=222, shape=(), dtype=float32, numpy=3.1>
现在,您可以将logistic
Bijector直接传递给Parameter构造函数。
In [45]: p = gpflow.Parameter(3.1, transform=logistic, dtype=tf.float32)
In [46]: p
Out[46]: <tf.Tensor: id=307, shape=(), dtype=float32, numpy=3.1>
In [47]: p.unconstrained_variable
Out[47]: <tf.Variable 'Variable:0' shape=() dtype=float32, numpy=-2.9444401>