RNN градиент скрыт - PullRequest
       74

RNN градиент скрыт

0 голосов
/ 26 марта 2020

Я пытаюсь вычислить средний градиент потерь на последнем временном шаге относительно скрытого состояния на каждом временном шаге 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)

Это работает но все градиенты одинаковы, и это неверно. Что я должен сделать, чтобы решить это?

...