Как избежать назначения массива в автограде - PullRequest
0 голосов
/ 27 апреля 2018

Я понимаю из учебника 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, но в конце я получаю градиенты со всеми нулями ...

Интересно, каково общее рекомендуемое решение в этой настройке?

1 Ответ

0 голосов
/ 27 апреля 2018

Вы можете использовать numpy.apply_along_axis, чтобы применить функцию для определенной оси в ваших данных.

def func(row):
    # return the computation result for "row"

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.apply_along_axis(func1d=func, axis=1, arr=a)

    return res
...