def _kl_multivariatenormal_multivariatenormal(dist1, dist2): diag = diagonal.diagonal(dist1.scale_tril, axis1=-2, axis2=-1) logdet1 = sum_mod.sum(exponential.log(abs(diag)), axis=-1) diag = diagonal.diagonal(dist2.scale_tril, axis1=-2, axis2=-1) logdet2 = sum_mod.sum(exponential.log(abs(diag)), axis=-1) scale_tril_inv2 = _batch_triangular_inv(dist2.scale_tril.reshape( -1, dist2.d, dist2.d)) trace = sum_mod.sum(matmul.matmul( scale_tril_inv2, dist1.scale_tril.reshape(-1, dist2.d, dist2.d)) ** 2, axis=(-1, -2)).reshape(dist1.batch_shape) mu = dist1.loc - dist2.loc mah = matmul.matmul(scale_tril_inv2, mu.reshape(-1, dist1.d, 1)) mah = sum_mod.sum(mah ** 2, axis=-2).reshape(dist1.batch_shape) return logdet2 - logdet1 + 0.5 * trace + 0.5 * mah - 0.5 * dist1.d
def _kl_multivariatenormal_multivariatenormal(dist1, dist2): diag = diagonal.diagonal(dist1.scale_tril, axis1=-2, axis2=-1) logdet1 = sum_mod.sum(exponential.log(abs(diag)), axis=-1) diag = diagonal.diagonal(dist2.scale_tril, axis1=-2, axis2=-1) logdet2 = sum_mod.sum(exponential.log(abs(diag)), axis=-1) scale_tril_inv2 = _batch_triangular_inv(dist2.scale_tril.reshape( -1, dist2.d, dist2.d)) trace = sum_mod.sum(matmul.matmul( scale_tril_inv2, dist1.scale_tril.reshape(-1, dist2.d, dist2.d)) ** 2, axis=(-1, -2)).reshape(dist1.batch_shape) mu = dist1.loc - dist2.loc mah = matmul.matmul(scale_tril_inv2, mu.reshape(-1, dist1.d, 1)) mah = sum_mod.sum(mah ** 2, axis=-2).reshape(dist1.batch_shape) return logdet2 - logdet1 + 0.5 * trace + 0.5 * mah - 0.5 * dist1.d
def _logdet(self, x): diag = diagonal.diagonal(x, axis1=-2, axis2=-1) logdet = sum_mod.sum( exponential.log(abs(diag)), axis=-1) return logdet
def _triangular_logdet(x): diag = diagonal.diagonal(x, axis1=-2, axis2=-1) return sum_mod.sum(exponential.log(abs(diag)), axis=-1)
def _logdet(self, x): diag = diagonal.diagonal(x, axis1=-2, axis2=-1) logdet = sum_mod.sum( exponential.log(abs(diag)), axis=-1) return logdet
def _triangular_logdet(x): diag = diagonal.diagonal(x, axis1=-2, axis2=-1) return sum_mod.sum(exponential.log(abs(diag)), axis=-1)