Существует ли эффективный способ решения разреженных линейных уравнений в Tensorflow, совместимый с градиентной лентой? - PullRequest
1 голос
/ 22 февраля 2020

Мне нужно решить уравнения в тензорном потоке в форме 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?

...