翻译自http://weibo.com/p/1001603913581535062112,作者是CMU邢波教授的高徒。
目前有很多开源的分布式机器学习和深度学习系统,例如DMLC,Spark,MLlib,Petuum,parameter server,Caffe,Torch,Theano和TensorFlow等等。然而,如何在集群上高效的执行分布式机器学习过程呢?
这要从机器学习算法的特点说起,机器学习算法与排序或数据库查询等算法不同,它是基于爬山(hill-climbing)的算法,通过多个计算步骤到达最优解(对应山顶或谷底,此时机器学习模型具有最高的预测准确度)。在计算过程中,算法每次计算出距离最近的山顶或谷底方向,并向该方向移动一小步。当算法靠近山顶时,移动的步长越来越小,直到最后收敛。
上述爬山算法具有以下特征:
1)容错性(error tolerance)。即便是在爬山过程中有多次方向错误,但最终仍然能够达到最优解。因此可利用算法的容错性,在计算过程中引入某种程度上的误差(例如在worker间采用异步通信模式,而不是mapreduce式的严格同步模式),提高计算效率。
2)结构依赖性(dependency structure)。爬山的路径可能会比较复杂,到达山顶或谷底的过程比较复杂,然而大部分并行机器学习算法往往需要收集齐所有机器的计算结果才能确定最终的爬山方向,因此使用100台机器并行执行一个机器学习算法并不能达到100倍的加速比。
3)不均匀的收敛性(uneven convergence)。机器学习模型往往包含多个模型参数,每个模型参数相当于爬山方向的一个维度。通常有80~90%的样本在迭代计算初期已经收敛,然而绝大部分并行机器学习算法并没有利用这一特征,从而重复计算这些已收敛的参数,浪费计算资源。