Gradient Descent Algorithms and Variations