TensorFlow中的Cholesky因子分化

时间:2015-11-27 18:22:17

标签: python linear-algebra tensorflow

我希望得到tf.cholesky关于其输入的渐变。截至目前,tf.cholesky没有注册的渐变:

LookupError: No gradient defined for operation 'Cholesky' (op type: Cholesky)

用于生成此错误的代码是:

import tensorflow as tf
A = tf.diag(tf.ones([3]))
chol = tf.cholesky(A)
cholgrad = tf.gradients(chol, A)

虽然我可以自己计算渐变并注册它,但是我已经看到Cholesky渐变计算的唯一现有方法涉及the use of for loops and needs the shape of the input matrix.但是,据我所知,{ {3}}

获取输入矩阵A的形状的一种可能的解决方法可能是使用:

[int(elem) for elem in list(A.get_shape())]

但如果A的维度依赖于形状为TensorShape([Dimension(None)])的TensorFlow占位符对象,则此方法不起作用。

如果有人知道如何计算和注册tf.cholesky的渐变,我将非常感谢您的了解。

1 个答案:

答案 0 :(得分:4)

我们在对这个问题的回答和评论中对此进行了一些讨论:TensorFlow cholesky decomposition。 它可能(?)可以移植Theano implementation of CholeskyGrad,只要它的语义实际上是你想要的。 Theano的基于Smith's "Differentiation of the Cholesky Algorithm"

如果将它实现为Python调用的C ++操作,则可以无限制地访问所需的所有循环结构,以及Eigen提供的任何内容。如果你想在纯张量流中做到这一点,你可以使用控制流操作,例如tf.control_flow_ops.While来循环。

一旦你知道你想申请的实际公式,答案就在这里:matrix determinant differentiation in tensorflow 展示了如何在张量流中实现和注册op的渐变。

您也可以create an issue on github申请此功能,但是,如果您自己实施此功能然后发送拉取请求,您可能会更快地获得此功能。 :)