Я понимаю из учебника autograd
, что присвоение массива не поддерживается, когда массив содержится в цели, которую необходимо дифференцировать. Тем не менее, в настоящее время в моем коде есть следующая целевая функция, которую я хотел бы выделить в отношении тета:
def obj(theta):
"""
Computes the objective function to be differentiated.
Args:
theta: np.array of shape (n, d)
Return:
res: np.array of shape (n,)
"""
theta = np.atleast_2d(theta)
n = theta.shape[0]
res = np.zeros(n) # Scores
for i in xrange(n):
res[i] = ... # Do some computations with theta[i, :]
return res
Обычно я могу избежать цикла for, векторизовав вычисления над тэтой; однако в этом случае в вычислении уже задействованы различные операции линейной алгебры (обратные и т. д.), заданные для определенной строки тэты (в виде гиперпараметров), и я обнаружил, что довольно трудно векторизовать операцию по всем строкам тэты. В этом случае я не знаю лучшего способа, чем заполнение массива res строка за строкой с помощью цикла for.
Я попробовал наивный способ избежать присвоения массивов, создав список и на каждой итерации добавляя результаты к этому списку, а затем, наконец, преобразовывая список в массив по возвращении res, но в конце я получаю градиенты со всеми нулями ...
Интересно, каково общее рекомендуемое решение в этой настройке?