optimization methods for training deep neural networks