Model optimization: Batch gradient descent