2

GPflow 2.0 で GP 回帰を実行しているときに、長さスケールにハード バウンドを設定したい (つまり、長さスケールの最適化範囲を制限する)。このスレッド ( GPflow 2.0 でハイパーパラメーター最適化の境界を設定する) に従って、TensorFlow Bijector チェーンを構築しました (以下のbounded_lengthscale関数を参照)。ただし、以下の bijector チェーンは、モデルが想定された範囲外で最適化することを妨げません。bounded_lengthscale関数が最適化に厳しい境界を設定 するには、何を変更する必要がありますか?

以下は MRE です。

import gpflow 
import numpy as np
from gpflow.utilities import print_summary
import tensorflow as tf
from tensorflow_probability import bijectors as tfb

# Noisy training data
noise = 0.3
X = np.arange(-3, 4, 1).reshape(-1, 1).astype('float64')
Y = (np.sin(X) + noise * np.random.randn(*X.shape)).reshape(-1,1)

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

# build GPR model
k = gpflow.kernels.Matern52()
m = gpflow.models.GPR(data=(X, Y), kernel=k)

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

print_summary(m)

# train model
@tf.function(autograph=False)
def objective_closure():
    return - m.log_marginal_likelihood()

opt = gpflow.optimizers.Scipy()
opt_logs = opt.minimize(objective_closure,
                        m.trainable_variables)
print_summary(m)

ありがとう!

4

2 に答える 2

3

MWE では、既存の (ロジスティック変換を持たない) にassign新しいを追加します。Parameterこの値は、ロジスティック変換で構築されたパラメーターが持つ制約された空間の値ですが、変換は引き継がれません。代わりに、ロジスティック変換なしのパラメーターを、必要な変換を持つものに置き換えるm.kernel.lengthscale = bounded_lengthscale(0,1,0.5)必要があります。

kernel.lengthscale属性に割り当てるオブジェクトはインスタンスでなければならないことに注意してください。ParameterMWEで as の戻り値を代入するとtf.cast(parameter)、これは定数に相当し、実際には最適化されません!

この質問の MWE で単に tf.cast を移動しても、float32/float64 の不一致が原因ですぐには機能しません。これを修正するには、AffineScalar bijector を 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 は常に人々の支援に感謝しているため、これをプル リクエストに変えたい場合は、そうしてください!)

于 2019-12-27T23:08:10.693 に答える