In code below output = w * x which is given for loss calculation. So after loss.backward(), change in weight should be " w = w - (lr * dL/dw) ". Now dL/dw = dL/d(output) * d(output)/dw= -1 * x = -4.

Putting this value it should update w = w - (lr * dL/dw) = 1 - (0.2* -4) = 1.8 but its 1.2 and update constant like 1.2,1.4.1.6 etc

```
import torch
import torch.nn as nn
class Net(torch.nn.Module):
def __init__(self):
super(Net, self).__init__()
self.w=torch.nn.Parameter(torch.ones(1))
def forward(self, x):
print("weight and its gradient is ",self.w,self.w.grad)
out = torch.mul(x,self.w)
return out
learning_rate = 0.2
model=Net()
criterion=torch.nn.L1Loss()
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
x=4*torch.ones((1),requires_grad=True)
target=torch.FloatTensor([36])
for i in range (1,3):
optimizer.zero_grad()
out=model(x)
loss= criterion(target,out)
print("output and loss is ",out,loss)
loss.backward(retain_graph=True)
optimizer.step()
```