我有一个示例,其中我必须顺序调用预测。在这种情况下,为什么SVGP预测会比SGPR更快?所有稀疏模型的预测时间复杂度是否相同,还是我错过了一些东西?这是我用于测试的代码:
from numpy.random import randn
import gpflow
sgpr = gpflow.models.SGPR(X=randn(70000,8), Y=randn(70000,1), kern=gpflow.kernels.SquaredExponential(8), Z=randn(200,8))
sgpr.predict_y(randn(1,8))
%timeit -n 100 -r 7 sgpr.predict_y(randn(1,8))
>>> 128 ms ± 696 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
svgp = gpflow.models.SVGP(X=randn(70000,8), Y=randn(70000,1), kern=gpflow.kernels.SquaredExponential(8), likelihood=gpflow.likelihoods.Gaussian(), Z=randn(200,8))
svgp.predict_y(randn(1,8))
%timeit -n 100 -r 7 svgp.predict_y(randn(1,8))
>>> 6.61 ms ± 913 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
答案 0 :(得分:0)
此答案是https://github.com/GPflow/GPflow/issues/1030的结果。 SGPR在每次迭代中精确地从整个数据集计算预测后验,而SVGP将信息存储在更小的q(u)分布中。一种解决方法是实现一种自定义预测方法,该方法将预先计算与训练相关的矩阵,然后在每次迭代中重复使用。