градиент, приличный для вычисления cp-разложения тензора третьего порядка - PullRequest
0 голосов
/ 28 марта 2020

Я пытаюсь сделать градиент приличным, чтобы вычислить CP-разложение тензора третьего порядка. Я использую тензоры, и я новичок в этом. И я не знаю, как вычислить градиент.

Итак, вот что мы имеем:

def CP_GD(T, rank, epsilon=1e-5,max_iters=100,lr=1e-2,verbose=True,errors_at_iterations=[]):
    # Initialize A, B and C

    dim1= T.shape[0]
    dim2= T.shape[1]
    dim3= T.shape[2]
    A= tl.tensor(np.random.normal(0,1,[dim1,rank]))
    B= tl.tensor(np.random.normal(0,1,[dim2,rank]))
    C= tl.tensor(np.random.normal(0,1,[dim3,rank]))


    T_approx_old = tl.kruskal_to_tensor((np.ones(rank),[A,B,C]))# YOUR CODE HERE #
    it = 1
    while True: # repeat until convergence
        # compute gradients wrt A B and C and do a gradient step




        # check for convergence:
        T_approx_new = tl.kruskal_to_tensor((np.ones(rank),[A,B,C]))
        reconstruction_error =  tl.norm(T_approx_new-T)
        errors_at_iterations.append(reconstruction_error)


        if tl.norm(T_approx_old - T_approx_new)/tl.norm(T_approx_old) < epsilon or it > max_iters:
            return (A,B,C)
        if verbose:
            print(it, " - reconstruction error: ",reconstruction_error, "convergence: ", tl.norm(T_approx_old - T_approx_new)/tl.norm(T_approx_old))

        T_approx_old = T_approx_new
        it += 1

1 Ответ

0 голосов
/ 23 апреля 2020

Вы можете либо вычислить градиенты вручную, либо, альтернативно, использовать автоград. TensorLy имеет бэкэнд-систему, которая позволяет запускать вычисления, используя NumPy, PyTorch, TensorFlow и др. c. Если вы используете какой-либо из бэкэндов, которые поддерживают автоград, вы можете использовать автоматическое дифференцирование для прямого получения градиентов. Оформить заказ ноутбуков например. Например, здесь , выполняющий декомпозицию Такера посредством градиентного спуска с TensorLy и PyTorch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...