Мне нужно решить уравнения в тензорном потоке в форме A (y) x = b, где A - матрица с большой разреженной зоной, а также функция некоторого другого тензора, скажем, y. Естественно, решение x также будет функцией тензора y. После решения для x я хочу взять градиент x по отношению к y.
Я рассмотрел два варианта: 1. Использовать разреженную внешнюю библиотеку для эффективного инвертирования A, такую как scipy.sparse
. Для этого мне нужно преобразовать тензоры в массив numpy, а затем обратно в тензоры. Проблема этого подхода в том, что я не могу использовать градиентную ленту с внешними библиотеками, такими как scipy.sparse
. 2. Используйте матричную инверсию Tensorflow, которая работает с градиентной лентой. Это очень медленно для больших матриц, так как оно не использует разреженность тензора. Мне не удалось найти редкую инвертированную реализацию в Tensorflow.
Небольшой упрощенный пример того, что мне нужно:
y = tf.constant(3.14)
A = my_sparse_tensor(shape=(1000, 1000)) # Arbitrary function that returns a sparse tensor
b = tf.ones(shape=(1000, 1))
with tf.GradientTape() as g:
g.watch(y)
A = A * y
x = tf.matmul(sparse_invert(A), b)
dx_dy = g.gradient(x, y)
Конечно, зависимость A от y намного сложнее, чем в этот пример. Есть ли способ сделать это в Tensorflow, или я должен ограничиться tf.linalg.inv
?