Hello, I am trying to implement the function below and compute its gradient using backward()
, but I have an in-place operation that I cannot solve, below I show an option I tried and didn’t work.
def modified_gram_schmidt(A):
m, n = A.shape
Q = torch.zeros((m, n), requires_grad=True).clone()
R = torch.zeros((n, n), requires_grad=True).clone()
for j in range(n):
v = A[:, j].clone()
for i in range(j):
R[i, j] = torch.dot(Q[:, i], v)
v_prev = v.clone()
v = v_prev - torch.dot(Q[:, i], v_prev) * Q[:, i]
R[j, j] = torch.norm(v)
v = v / torch.norm(v)
Q[:, j] = v.clone()
return Q, R
The operation which is causing the issue is v = v_prev - torch.dot(Q[:, i], v_prev) * Q[:, i]
, when I try to compute the gradient by Q.sum().backward()
I have the error: RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation
. I would appreciate any help.