Gradient descent algorithm.