我目前正在使用共区域化的线性模型 (例如,参见alvarez注释https://arxiv.org/pdf/1106.6251.pdf) 通过SVGP进行了优化。
我注意到运行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.
内核矩阵的构造如下。 我不使用大Q或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
什么占用了这么多内存?来自额外内核的更多参数应该不会有太大变化。
谢谢。
答案 0 :(得分:2)
在计算Kuu矩阵时,共分区内核构造了一个M x M矩阵。因此,如果您有Q个Coregion
内核,tensorflow实际上需要分配Q x M x M内存。这不是数量级的增加,而是内核数量的线性关系,这似乎与可以容纳在计算机内存中的诱导点数量大致相符。
要更有效地实现内部共域化模型,请查看GPflow文档中的resample
。希望这会有所帮助!