0

我正在尝试在 gpflow 中实现我自己的 MultioutputKernel (MOK),但是我被困在 Multiple Dispatch 的(Kernel, Inducing Variable)组合中。

根据docsMultioutputKernel ,组合 a with的后备方法InducingPoints应该是调用fully_correlated_conditional(via gpf.conditionals.multioutput.inducing_point_conditional)。

但是,我无法让任何 MOK 与非独立诱导变量一起工作,甚至是预先实现的变量。这是一个最低限度的不工作示例SharedIndependent

######################## toy data
d = 1
X = np.random.normal(0, 10, (100, d))
xx = np.linspace(-10, 10, 200).reshape(-1, 1)
f = lambda x: x ** 2
f_ = lambda x: 2 * x
Y = f(X)
Y_ = f_(X)

Y_combined = np.hstack((Y, Y_))
data = (X, Y_combined)

######################### gpflow stuff
kernel = gpf.kernels.RBF(lengthscales=[1.0] * d)
Z = X.copy()
# create multi-output inducing variables from Z
iv = gpf.inducing_variables.InducingPoints(Z)

MOK_K = gpf.kernels.SharedIndependent(kernel, output_dim=2)

m = gpf.models.SVGP(likelihood=gpf.likelihoods.Gaussian(), kernel=MOK_K, num_latent_gps=2,
                    inducing_variable=iv)

optimizer = gpf.optimizers.Scipy()
optimizer.minimize(
    m.training_loss_closure(data),
    variables=m.trainable_variables,
    method="l-bfgs-b",
    options={"disp": True, "maxiter": 1000},
)

这是行不通的,除非有人用

iv = gpf.inducing_variables.SharedIndependentInducingVariables(
    gpf.inducing_variables.InducingPoints(Z)
)

但是对于我的自定义非独立内核,我需要完全相关的条件。我得到的错误是

ValueError: base_conditional() arguments [Note that this check verifies the shape of an alternative representation of Kmn. See the docs for the actual expected shape.]

inducing_point_conditional将内核矩阵传递给base_conditional. 但是,我不明白哪里出了问题,因为形状应该没问题。它们就像文档中定义的那样。

我必须改变什么才能让它在完全相关的条件下运行?

4

1 回答 1

0

问题是变分分布参数的维度,q_mu以及q_sqrt

必须事先手动定义它们,以便它们分别具有形状[N*P, 1][1, N*P, N*P],其中 P 是输出维度(在我的示例中为 2)。

请注意,这与文档略有不同,他们说q_mu必须如此[1, N*P]

我的问题代码运行正确:

# [200, 1]    
q_mu = tf.zeros([200, 1], dtype=gpf.config.default_float())

# [1, 200, 200]
q_sqrt = tf.eye(200, dtype=gpf.config.default_float())[tf.newaxis, ...]

m = gpf.models.SVGP(likelihood=gpf.likelihoods.Gaussian(), kernel=MOK_K, num_latent_gps=2,
                    inducing_variable=iv, q_mu=q_mu, q_sqrt=q_sqrt)
于 2020-11-24T10:45:22.853 回答