首页 > 解决方案 > 如何在 TensorFlow 中构造矩阵的这些函数?

问题描述

我正在构建一个正式依赖于 2x2 矩阵的张量z。然而,组成张量的各个部分是由矩阵 S(z)、T(z) 和 U(z) 构成的z,我不知道如何进行。

以下是导出 S(z)、T(z) 和 U(z) 的步骤。每个矩阵 z 都可以分解为极坐标形式:z = RU 其中 R 是半正定矩阵,U 是酉矩阵。通过使用 R 和 U,我们定义:

1) S(z) = sech(R)

2) T(z) = tanh(R)U

3) U(z) = U

由于我必须执行反向传播来学习 z 中的参数,我如何以可微分的方式在 TensorFlow 中将 S、T 和 U 定义为 z 的函数?我可以利用它们只有 2x2 的事实(例如,明确使用特征值)吗?

注意:像 sech(R) 这样的矩阵函数不是按元素应用的函数 sech,而是 sech(R) = U' sech(D) U 其中 R = U'DU 是 R 的对角化。

标签: pythontensorflowmatrixlinear-algebra

解决方案


我找到了一种使用 SVD 的方法(在 TF 中可以区分!):

z = wsv' = (wsw')(wv')= RU

所以我们已经对 R 进行了对角化:

S = w sech(s) w'
T = (w tanh(s) w')(wv') = w tanh(s) v' U = wv'

在代码中:

s, w, v = tf.linalg.svd(z)

S = tf.matmul(w, tf.matmul(tf.linalg.diag(1/tf.math.cosh(s)), w, adjoint_b=True))
T = tf.matmul(w, tf.matmul(tf.linalg.diag(tf.math.tanh(s)), v, adjoint_b=True))
U = tf.matmul(w, v, adjoint_b=True)

在这里,我没有利用我的矩阵是 2x2 的事实,我可以这样做以避免使用 SVD...


推荐阅读