对于每个输入维度,您也可以有不同的先验分布:您只需要相应地定义先验。例如,
alpha_ard = np.array([3.0, 4.0, 3.0, 3.0, 7.0])
beta_ard = np.array([0.25, 0.4, 0.4, 0.25, 0.25])
kernel.lengthscales.prior = tfp.distributions.Gamma(alpha_ard, beta_ard)
请注意,先验现在有batch_shape
[5] 而不是之前的 []。
这确实改变了一些事情,您可以通过以下简单示例进行验证:
import gpflow
import numpy as np
import tensorflow_probability as tfp
import tensorflow as tf
num_data = 1
input_dim = 5
output_dim = 1
X_train = np.ones((num_data, input_dim))
Y_train = np.ones((num_data, output_dim))
single_prior = tfp.distributions.Gamma(np.float64(3.0), np.float64(0.25))
ard_equal_priors = tfp.distributions.Gamma(np.array([3.0]*5), np.array([0.25]*5))
ard_different_priors = tfp.distributions.Gamma(np.array([1.0, 2.0, 3.0, 4.0, 5.0]), np.array([0.25, 0.1, 0.5, 0.2, 0.3]))
def build_model(prior):
kernel = gpflow.kernels.SquaredExponential(lengthscales=([1.0] * input_dim))
kernel.lengthscales.prior = prior
model = gpflow.models.GPR((X_train, Y_train), kernel, noise_variance=0.01)
opt = gpflow.optimizers.Scipy()
opt.minimize(model.training_loss, model.trainable_variables)
m1 = build_model(single_prior)
m2 = build_model(ard_equal_priors)
m3 = build_model(ard_different_priors)
m1
最终m2
得到完全相同的长度尺度,而m3
不同。
在不使用 MCMC 的情况下,超参数只是点估计(最大似然 [MLE] 没有设置先验,或者最大后验 [MAP] 像你一样设置先验)。通常有几个局部最优值,所以你最终会选择哪一个取决于初始化。有关更多说明,请参阅这篇蒸馏文章。