Недавно я столкнулся с некоторыми узкими местами производительности с производными символьных матриц в Sympy (в частности, одна строка кода, оценивающая символьные матрицы посредством подстановки с использованием лямбда-выражений, занимала около 90% времени выполнения программы), поэтому я решил попробовать Theano.
Его предыдущее приложение оценивало частные производные по гиперпараметрам гауссовского процесса, где использование матрицы размерности (1, k) символов Симпи (MatrixSymbol) хорошо работало с точки зрения итерации по этому списку и дифференцирования матрицы по каждому элементу.
Однако это не переносится в Theano, и в документации, похоже, не подробно описано, как это сделать. Индексирование символьного вектора в Theano возвращает тип Subtensor, который недопустим для вычисления градиента.
Ниже приведена простая (но полностью алгоритмически неверная - урезанная до функциональности, которую я пытаюсь получить) версия того, что я пытаюсь сделать.
РЕДАКТИРОВАТЬ: я изменил пример кода, чтобы включить данные в качестве тензора для передачи в функцию, как это предлагается ниже, и включил альтернативную попытку вместо этого использовать список отдельных скалярных тензоров, поскольку я не могу индексировать значения символического вектора Theano. , хотя тоже безрезультатно.
import theano
import numpy as np
# Sample data
data = np.array(10*np.random.rand(5, 3), dtype='int64')
# Not including data as tensor, incorrect/invalid indexing of symbolic vector
l_scales_sym = theano.tensor.dvector('l_scales')
x = theano.tensor.dmatrix('x')
f = x/l_scales_sym
f_eval = theano.function([x, l_scales_sym], f)
df_dl = theano.gradient.jacobian(f.flatten(), l_scales_sym[0])
df_dl_eval = theano.function([x, l_scales_sym], df_dl)
Во второй последней строке фрагмента кода я пытаюсь получить частную производную по одному из элементов в списке переменных «шкалы длин», но такая индексация неприменима к символическим векторам.
Любая помощь будет принята с благодарностью!