当模型过大,训练数据巨大的时候,就需要利用分布式机器学习对模型或者数据进行相应的划分,部署到不同的机器上,从而进行训练。
数据并行
如果训练数据的规模很大,无法存储于本地内存,我们就需要对数据集进行划分,分配到各个工作节点上, 然后工作节点依据各自分配的局部数据对模型进行训练。
数据划分的方法有如下两种:
- 基于随机采样:在原始的训练数据中进行有放回的随机采样,采取K个样本集合,并将样本集合放置在不同的工作节点上。随机采样的优点是可以保证每个工作节点上的局部训练数据和原训练数据是独立同分布的。其缺点是采样的复杂度高;且频数小的样本很难被采样到,因此会导致某些样本不能得到充分利用。
- 基于置乱切分:将训练数据进行随机置乱,然后将划分后的数据划分成相应的K个集合,放置在不同的工作节点上。随机置乱划分的优点是可以保证每个样本都能充分利用,但是缺点是需要频繁的进行随机置乱操作来满足独立同分布的假设。
模型并行
如果机器学习模型的规模比较大,无法存储于本地内存,则需要对模型进行划分。
对于线性可分的模型,由于参数之间的相互依存关系比较弱,因此可以将对应于不同数据维度的模型参数划分到不同的工作节点。
对于非线性可分的模型,如神经网络是高度非线性的,其参数之间的依赖关系非常强,因此不能简单的将其划分。常用的模型划分方法有横向按层跨分、纵向跨层划分以及模型随机划分。
横向按层划分
横向按层划分是将模型按层进行划分,可以是一个网络层为一个子网络模型,也可以是多个网络层为一个子网络模型。我们需要将子网络模型(包括模型参数、激活函数值、误差传播值等)存储于不同的工作节点。当需要其他辅助数据时(如前层网络的激活值、后层网络的误差传播值),向对应的工作节点发出请求并接收相应数据。
按层划分的结构图如图所示:
横向按层划分的算法如下:
纵向跨层划分
纵向跨层划分是将模型每一层的参数均等地划分为若干份,每个工作节点存储所有层的部分参数来构成一个子网络模型。若需要子网络模型之外的辅助数据,则向对应的工作节点发送请求并接收数据。
纵向跨层划分的示意图如下:
其算法描述如下:
模型随机划分
由于神经网络具有一定的冗余性,即一个复杂的网络中,往往存在一个规模更小的网络可以达到与当前网络类似的效果,我们将这个规模更小的网络称为骨架网络。可以利用骨架网络实现更高效的模型并行。
模型随机划分具体方法如下:
首先,由中央服务器挑选骨架网络,然后将骨架网络下发给每个工作节点;
每个工作节点存储骨架网络,除此之外还会挑选其他的网络节点存储,从而探索骨架网络之外的信息;
工作节点利用本地数据训练网络模型,并将其上传给服务器;
服务器进行聚合,并周期性的重新选择骨架网络。
注意的是,骨架网络的选择可以是周期性更新的,对全局拓扑结构的探索也是动态、随机的。 这样可以显著减小神经网络模型并行的通信代价,而且实验表明它有很好的训练效果。
模型随机划分的示意图如下:
随机模型划分的一个关键步骤是选取骨架网络。我们可以将神经网络中神经元的重 要性定义为它所连接的所有连边的重要性之和,然后可以利用贪心算法,依次选取当前网络中的重要节点构成骨架网络。
基于随机模型划分的算法如下: