gradient descent pytorch implementation