Optimization Algorithms for Distributed Machine Learning