PyTorch - ручное вычисление градиента отличается от обратного - PullRequest
0 голосов
/ 02 марта 2019

В настоящее время я использую градиенты политик в PyTorch.По какой-то причине, не относящейся к этому вопросу, я не могу напрямую рассчитать градиенты с помощью backward () следующим образом (этот код работает отлично):

n_episodes = len(states)
states = torch.tensor(np.array([state for episode in states for state in episode[:-1]])).float()
actions = torch.tensor(np.array([action for episode in actions for action in episode])).float()
advantages = torch.tensor(self.compute_advantages(rewards, normalize=True)).float()

std = torch.exp(self.log_std)
log_probs = torch.distributions.normal.Normal(self.forward(states), std).log_prob(actions).flatten()

loss = - torch.dot(log_probs, advantages)
loss.backward()

self.optimizer.step()

Я бы предпочел вычислять состояние градиентов вручную послегосударство.Я знаю, что это гораздо менее вычислительно эффективно, но это не главное.В моем понимании должен работать следующий код:

for i in range(len(actions)):
    state = states[i]
    action = actions[i]
    advantage = advantages[i]

    for name, param in self.named_parameters():
        std = torch.exp(self.log_std)
        dist = torch.distributions.normal.Normal(self.forward(torch.from_numpy(state).float()), std)
        param.grad -= grad(dist.log_prob(torch.from_numpy(action).float()), param)[0] * advantages[i]

self.optimizer.step()

Однако вычисленные градиенты полностью отличаются от полученных с помощью .backward ().Я что-то не так понял?

...