TensorFlow 中的 Cholesky 因子微分

Rui*_*Shu 5 python linear-algebra tensorflow

我想获得tf.cholesky关于其输入的梯度。截至目前,tf.cholesky还没有注册渐变:

LookupError: No gradient defined for operation 'Cholesky' (op type: Cholesky)
Run Code Online (Sandbox Code Playgroud)

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

import tensorflow as tf
A = tf.diag(tf.ones([3]))
chol = tf.cholesky(A)
cholgrad = tf.gradients(chol, A)
Run Code Online (Sandbox Code Playgroud)

虽然我可以自己计算梯度并注册它,但我见过计算 Cholesky 梯度的唯一现有方法涉及使用 for 循环并需要输入矩阵的形状。但是,据我所知,符号循环目前不适用于 TensorFlow。

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

[int(elem) for elem in list(A.get_shape())]
Run Code Online (Sandbox Code Playgroud)

但是,如果 的尺寸A依赖于具有 shape 的 TensorFlow 占位符对象,则此方法不起作用TensorShape([Dimension(None)])

如果有人对如何计算和注册 的梯度有任何想法tf.cholesky,我将非常感谢您了解它。

dga*_*dga 4

我们在这个问题的答案和评论中对此进行了一些讨论: TensorFlow cholesky 分解。可能(?)可以移植CholeskyGrad 的 Theano 实现,只要它的语义实际上是您想要的。Theano 是基于Smith 的“Cholesky 算法微分”

如果您将其实现为 Python 调用的 C++ 操作,则您可以不受限制地访问您想要的所有循环结构以及 Eigen 提供的任何内容。如果您想在纯张量流中执行此操作,则可以使用控制流操作,例如tf.control_flow_ops.While循环。

一旦您知道了要应用的实际公式,答案就在这里: 张量流中的矩阵行列式微分 展示了如何在张量流中实现和注册运算的梯度。

您也可以在 github 上创建一个问题来请求此功能,当然,如果您自己实现它然后发送拉取请求,您可能会更快地获得它。:)


归档时间:

查看次数:

752 次

最近记录:

9 年,11 月 前