分布式机器学习\分布式KMeans

1.分布式机器学习

        以线性回归模型的优化为例来展示在分布式机器学习中模型的训练过程。 模型表示为:

f(x)=x^{T} w

损失函数可以表示为:L(w)=\frac{1}{2} \sum_{i=1}^{n}\left(x_{i}^{T} w-y_{i}\right)^{2}

        利用梯度下降算法进行参数优化,先对损失函数求一阶偏导数,即

g(w) =\frac{\partial L(w)}{\partial w} =\sum_{i}^{n}\left(x_{i}^{T} w-y_{i}\right) x_{i}

得到所有样本的梯度的总和,从上述公式可以看出每个样本的对应的梯度为g_{i}(w)=\left(x_{i}^{T} w-y_{i}\right) x_{i},在第t步下的参数的更新:w_{t+1}=w_{t}-\alpha \cdot g\left(w_{t}\right), 由上述计算梯度的公式可知道,优化过程的效率与样本量n和参数\omega个数有关,因此如果将梯度计算并行化,优化效率将得到提升。

        在分布式系统中一般要考虑通信开销和同步开销。以client-server架构为例,通信开销分为成两个部分,通信的复杂度,即server与worker之间每次传输数据的开销,因此如果模型参数量越大通信的复杂度也就越高,如果增加worker的数量,也会增加复杂度;对于同步开销,即模型的参数的同步方式,在同步梯度下降算法中,需要等待所有worker计算完成后才开始同步参数,而异步梯度下降算法中,每个worker计算完之后,即可与server同步参数,开始下一轮计算。

1.1同步梯度下降

一种解决方式是数据并行化,在client-sever的系统架构中,通过将数据切分后分发到不同的worker上,各个worker完成各自的梯度计算后,在server上完成最终的聚合,下图展示了一种 MapReduce实现的同步梯度下降过程

分布式机器学习\分布式KMeans_第1张图片

算法流程:

worker端(重复以下步骤)
step1: 各个节点从server端得到最新的参数\omega;
step2: 对于各个worker, 利用本地的数据和参数\omega计算当前节点上样本的梯度\widetilde{g_{i}};
step3: 向server发送该梯度\widetilde{g_{i}};

server端(重复以下步骤)
step1: 等待所有的节点完成好本轮梯度计算,进行梯度聚合 g=\widetilde{g_{1}} + \widetilde{g_{2}} +... +\widetilde{g_{m}}
step2: 更新参数:w \leftarrow w-\alpha \cdot g

1.2异步梯度下降

对于异步梯度下降,跟同步算法的一个不同点在于每个worker在完成本轮计算之后立即马上与server端进行参数同步,开始下一轮的参数迭代,不要需要等待其他worker。

算法流程:

worker端(重复以下步骤)
step1: 各个节点从server端得到最新的参数\omega;
step2: 对于各个worker, 利用本地的数据和参数\omega计算当前节点上样本的梯度\widetilde{g_{i}};
step3: 向server发送该梯度\widetilde{g_{i}}

server端(重复以下步骤)
step1: 从worker上获得\widetilde{g_{i}}
step2: 更新参数:w \leftarrow w-\alpha \cdot \widetilde{g_{i}}

1.3分布式机器学习与联邦学习的比较

通过上面的两种梯度的计算方法,我们看到在worker与server之间并没有传输原始数据,传输的仅仅是样本的梯度,尽管利用传输梯度在某些情况下会存在隐私泄露,如果对梯度加密,加噪声之后再传输是不是问题就得到解决了呢,不再需要联邦学习了,其实不然。 在Google提出联邦学习的时候,就指出联邦学习的瓶颈在于:

1.通信的代价远高于计算的代价 成千上万的移动端设备进行训练的时候,由于设备所处的网络不一样,各个设备之间存在差异 因此上述同步算法还是异步算法都不适用。比如在异步算法中,一个一个设备出现了问题,而其他设备完成的轮数远远超过该设备,那么该设备计算的梯度将污染server端的梯度计算,对模型训练不利;
2.数据不是IID(独立同分布) 在一般意义上的分布式机器学习中各个worker上的数据基本满足独立同步的,而在联邦学习中,各设备之间的数据存在很大的差异,如存放的图片可能为风景类,自拍类,对于不同的人,常用的输入习惯等也不一样。多方联邦学习,各方拥有的X也不一样,因此联邦学习要解决非IID的数据;
3.数据不均衡性 每个设备的数据量是不一致的,这个很好理解

2.分布式KMeans

Saprk 实现分布式 KMeans 的基本流程:
(1) 构建 Application 的运行环境, Driver 创建一个 SparkContext; SparkContext 向资源管理器申请 Executor 资源,由资源管理器启动 Executor; Executor 向 SparkContext 注册并申请 Task; SparkContext 将应用程序分发给 Executor; SparkContext 构建成 DAG 图, DAGScheduler 将 DAG 图解析成 Stage,每个 Stage 有多个 task,形成 taskset;
(2) SparkContext 完成任务集合划分之后,会随机生成初始聚类中心,然后通过Broadcast 将初始聚类中心 cluster 分发给多个 excutor, 每个 excutor 会计算将当前节点分区中所有样本到每个聚类中心的距离,然后将其分配到距离最近的聚类中心, 并计算每个簇中样本点的矢量坐标和 sum,以及每个簇中样本点的个数 counts;
(3) 接着,通过 Accumulator 进行聚合操作,将多个 excutor 的(sum, counts)进行聚合,得到每个簇的所有(sum, counts), 然后用均值法更新各个簇的聚类中心,如此反复迭代直到聚类中心收敛即可。
 

你可能感兴趣的:(机器学习,分布式)