Hey
Here is the standard approach
optimizer = optim.Adam(NN.parameters(), lr=1e-3)
  for i in range(train_steps):
       optimizer.zero_grad()
       loss = get_loss_fn()
        loss.backward()
       optimizer.step()

However; when I tried manually set up the gradients
     optimizer = optim.Adam(NN.parameters(), lr=1e-3)
     
     for i in range(train_steps):
           loss = get_loss_fn()
           grads = torch.autograd.grad(loss, NN.parameters())

           for p, g in zip(NN.parameters(), grads):
                  p.grad.fill_(g) # here shows that p.grad is None
            
        
            optimizer.step()

Can someone explain why there grad is None and what’s is the problem with the second approach?