How would you use gradient descent variants, learning rate schedules, and regularization to prevent overfitting?