0

我目前正在使用通过 SVGP 优化的共区域化线性模型(参见例如 alvarez notes https://arxiv.org/pdf/1106.6251.pdf )。

我注意到在运行 OOM 之前诱导点数量的上限大大减少(现在大约 5k 诱导点而不是不使用共区域化内核时的 8k)。据我了解,限制瓶颈应该是相同的(仍然是 MxM 内核矩阵),但它似乎发生了更多变化。

此外,我现在收到警告:

.../lib/python3.6/site-packages/tensorflow/python/ops/gradients_impl.py:112: UserWarning:

Converting sparse IndexedSlices to a dense Tensor of unknown shape. This may consume a large amount of memory.

内核矩阵的构造如下。我不使用大 Qs 或 Rs (Q=3, R=3)。

    def coreg_k(Q, R, output_dim, active_dims):
        # create Q different kernels with rank R
        coreg = []
        k_q = []

        # lengthscales = np.logspace(-1, 3, 5)
        lengthscales = [0.1, 1, 5]
        for q in range(Q):
            coreg_tmp = gpflow.kernels.Coregion(input_dim=1, output_dim=output_dim, rank=R, active_dims=active_dims)
            coreg_tmp.W = np.random.randn(output_dim, R)
            coreg.append(coreg_tmp)

            k_tmp = []
            k_tmp.append(Matern52(input_dim=len(kernel_idxs["coords"]), active_dims=kernel_idxs["coords"],
                                  lengthscales=lengthscales[q], ARD=False))
            k_tmp.append(RBF(input_dim=len(kernel_idxs["rest"]), active_dims=kernel_idxs["rest"],
                             ARD=True, lengthscales=lengthscales[q]))

            k = k_tmp[0]
            for i in range(1, len(k_tmp)):
                k += k_tmp[i]

            k_q.append(k)

        # combine all those kernels
        kern_lcm = coreg[0] * k_q[0]
        for q in range(1, Q):
            kern_lcm += coreg[q] * k_q[q]

        return kern_lcm

是什么占用了这么多内存?来自额外内核的更多参数不应该改变那么多。

谢谢。

4

1 回答 1

2

在 Kuu 矩阵的计算中,共区域化内核构造了一个 M x M 矩阵。所以如果你有 QCoregion个内核,tensorflow 实际上需要分配 Q x M x M 内存。这不是更多数量级,而是与内核数量呈线性关系,这似乎与您机器内存中可以容纳的诱导点少了多少相匹配。

为了更有效地实现内在共区域化模型,请查看 GPflow 文档中的多输出框架笔记本。希望这可以帮助!

于 2019-08-22T10:30:16.083 回答