分布式深度学习系统one

精读了2012年的一篇《Large Scale Distributed Deep Networks》中了解到。分布式深度学习主要是对梯度的计算进行分布。目的为了处理数据量大,内存或硬盘开销大的任务或者为了提高训练效率,节省时间。目前的研究可分为模型分布和数据分布两种。数据分布最常见,数据分布在副本模型环境上分别训练部分数据的过程。经常用到的是ps参数服务器,例如有3个worker,实现数据分布,拿一层来看。Worker1计算完梯度后,传到ps参数服务器。其他的worker操作方式相同。等待3个worker 的梯度都传到参数服务器中,对这三个梯度进行求平均得到W。再将W广播到各个worker进行下次迭代。

该方法的短板:如果是不同的worker配置不一样,处理能力会不一样。传输到参数服务的时间会不同。那么平均计算的过程就需要等待。所以就像木桶原理一样,拉低了效率。从这个架构来看时间耗费主要包括梯度的计算时间+梯度上传的时间和ps服务器广播参数的时间+等待时间+计算参数均值时间。

为了解决这个问题,文章中提出了更新变化参数传到ps服务器的方法。这块我是这样考虑的。参数上传的速度,与带宽有关。参数规模越少,传输的速度越快。如果是符合在参数服务其中还是采用平均梯度的方式。就跟第一种方法相同。

另外看到了有把参数进行压缩在上传的,原理应该是认为参数矩阵是个稀疏矩阵。进行压缩后,能缩小参数上传时间。

异步梯度计算的方式,是初始梯度,根据不断上传的梯度变化值进行梯度的更新。主要节省了等待时间和最后梯度进行平均计算的时间。但是出现了过期梯度的问题,这个问题解决的方法设定个阈值。当过期的时间超过这个阈值就进行舍弃。

其中模型分布,可以看作将每一层或者每几层看作一个worker(这个是从深度方向来看),也可以从宽度方向看。(将一层中的神经元分为几个worker)。(这块还没深入了解)

个人观点:分布式的操作是模拟单机的过程。如果想要进行优化,且保证收敛的主要工作。需要从梯度更新策略、压缩参数等进行改进。

疑惑点:BP的过程是一个进行误差求偏导的过程。最大池化是取一个局部感受野中最大的那几个元素。反向传播后不一定是池化前元素的位置(卷积也类似)。我看这些分布式的论文里的图大多都是全连接,没有描述卷积或者池化方面的。

猜你喜欢

转载自blog.csdn.net/zhuiyunzhugang/article/details/106295680