Я пытаюсь вычислить средний градиент потерь на последнем временном шаге относительно скрытого состояния на каждом временном шаге t. Я использую RNN с двумя слоями, используя pytorch. Я попробовал код, подобный этому простому:
h0=torch.rand(2,512,128)
h0.requires_grad_(True)
h=[h0.clone()]
w1=torch.rand(512,128)
w1.requires_grad_(True)
w2=torch.rand(512,128)
w2.requires_grad_(True)
h0[0]=h0[0]*w1+1
h0[1]=h0[0]*h0[1]*w2+1
h.append(h0.clone())
h0[0]=h0[0]*w1+1
h0[1]=h0[0]*h0[1]*w2+1
h.append(h0.clone())
z=h0[1]*h0[1]
z=z.mean()
g = torch.autograd.grad(z, h[1:], retain_graph=True)
, но я получил эту ошибку:
RuntimeError: One of the differentiated Tensors appears to not have been used in the graph. Set allow_unused=True if this is the desired behavior.
Я попробовал другой код:
h0=torch.rand(2,512,128)
h0.requires_grad_(True)
w1=torch.rand(512,128)
w1.requires_grad_(True)
w2=torch.rand(512,128)
w2.requires_grad_(True)
hidden=[torch.zeros_like(h0)]*3
hidden[0]=h0
hidden[1][0]=hidden[0][0]*w1+1
hidden[1][1]=hidden[0][0]*hidden[0][1]*w2+1
hidden[2][0]=hidden[1][0]*w1+1
hidden[2][1]=hidden[1][0]*hidden[1][1]*w2+1
z=hidden[2][1]*hidden[2][1]
z=z.mean()
g = torch.autograd.grad(z, hidden[1:], retain_graph=True)
Это работает но все градиенты одинаковы, и это неверно. Что я должен сделать, чтобы решить это?