关于贝叶斯GP-LVM实现细节的问题

Questions about Bayesian GP-LVM implementation details

我想了解贝叶斯 GPLVM 实现在 GPflow 中的工作原理,但我对几行代码感到吃力。如果您能帮助我解决以下问题,我将不胜感激:

  1. 我了解到 gplvm.py 的第 178 行中的矩阵 B:

B = AAT + tf.eye(num_inducing, dtype=default_float())

对应等式中的$\beta\Psi_2+K_{MM}$。 Titsias and Lawrence 2010 中的 14 个。但是,我不明白代码是如何实现这个表达式的。

  1. 关于上一个问题,我看不懂gplvm.py第175-181行的A,tmp,AAT,c是什么意思?
A = tf.linalg.triangular_solve(L, tf.transpose(psi1), lower=True) / sigma
tmp = tf.linalg.triangular_solve(L, psi2, lower=True)
AAT = tf.linalg.triangular_solve(L, tf.transpose(tmp), lower=True) / sigma2
B = AAT + tf.eye(num_inducing, dtype=default_float())
LB = tf.linalg.cholesky(B)
log_det_B = 2.0 * tf.reduce_sum(tf.math.log(tf.linalg.diag_part(LB)))
c = tf.linalg.triangular_solve(LB, tf.linalg.matmul(A, Y_data), lower=True) / sigma

我猜代码正在使用矩阵求逆引理,但我看不出是如何使用的。

  1. 在等式中。 Titsias and Lawrence 2010 中的 14,有 3 个项我无法理解它们在 gplvm.py 中的计算方式:

    • 0.5 \beta^2 y_d^T \Psi_1 (\beta\Psi_2+K_{MM})^{-1} \Psi_1^T y_d(此公式出现在方程14下方W的表达式中)
    • 0.5 D \beta Tr(K_{MM}^{-1} \Psi_2)
    • 0.5 D \log |K_{MM}|

如有任何提示,我将不胜感激。

诚挚的,华金

计算 elbo gplvm.py 的代码非常优雅和高效。如果有人想了解它,我会在下面回复我之前的问题并进一步发布 notes

  1. I understand that matrix B in line gplvm.py:182:

B = AAT + tf.eye(num_inducing, dtype=default_float())

corresponds to $\beta\Psi_2 + K_{MM}$ in Eq. 14 of Titsias and Lawrence 2010. However, I don't understand how the the gplvm code implements the expression in the paper.

方程式中的调用矩阵 $\beta\Psi_2 + K_{MM}$ Titsias 和 Lawrence 2010 的 14(即 TL10)作为 D。在 gplvm.py 中,该矩阵计算为 D=LBL,其中 B 是上面给出的矩阵(即 B=AAT+I),L 是 Choleskly 因子K_{MM}.

  1. Related to the previous question, I cannot understand what A, tmp, AAT and c mean in the code?

A = tf.linalg.triangular_solve(L, tf.transpose(psi1), lower=True) / sigma tmp = tf.linalg.triangular_solve(L, psi2, lower=True) AAT = tf.linalg.triangular_solve(L, tf.transpose(tmp), lower=True) / sigma2 B = AAT + tf.eye(num_inducing, dtype=default_float()) LB = tf.linalg.cholesky(B) log_det_B = 2.0 * tf.reduce_sum(tf.math.log(tf.linalg.diag_part(LB))) c = tf.linalg.triangular_solve(LB, tf.linalg.matmul(A, Y_data), lower=True) / sigma

I am guessing the code is using the matrix inversion lemma, but I cannot see how.

代码没有使用矩阵求逆引理。

等式中的数据项。 TL10 的 14,(即指数中的项)是通过对向量 c.

的 norm2 的平方进行计算的

AAT 是出现在 TL10 中 Eq.~14 中最后一项的迹内的矩阵(即 $K_{MM}^{-1)\Psi_2)$)。

  1. In Eq. 14 from Titsias and Lawrence, 2010, there are three terms that I cannot understand how they are calculated: >
    • 0.5 \beta^2 y_d^T \Psi_1 (\beta\Psi_2+K_{MM})^{-1} \Psi_1^T y_d

    • 0.5 D \beta Tr(K_{MM}^{-1} \Psi_2)

    • 0.5 D \log |K_{MM}|

如上所述,第一项是通过向量c的norm2的平方计算得到的,第二项是通过AAT的迹计算得到的。方程式中两个对数行列式的减法。 TL10 的 14(和第三项)是通过对数 |B| 计算的。

一段漂亮的代码。谢谢