背景:
在分布式学习中,如下图所示,将深度学习中的梯度计算任务分成n份,交给n个从机进行计算,再将计算后的梯度返还到主机,用于模型的更新,这样计算的速度相比于单个主机进行计算,速率得到大大提升。尤其是面对大量数据集,神经网络深度比较深的情况。但是,这种方法也同样存在问题,假设在分布式系统上使用SGD(随机梯度下降),从机每次输入一个样本数据(xi,yi),就需要将梯度计算出来送入主机进行更新,主机与从机的交流损耗就会大幅度增加。所以为了解决这个问题,常用的算法有以下几种类型。
核心思想:将传输过程中的梯度进行压缩,取值,从而减小传输过程中的时间损耗。
Related work:
Stochastic Gradient Descent(SGD):
每次仅仅选用一个样本数据进行计算梯度,并将梯度用来更新
Batch Gradient Descent(BGD):
将全部的数据输入到模型中进行梯度计算
SGD相比于BGD,优势在于它的更新波动大一些,不容易陷入局部最优点,并且内存的损耗相对较小,所以SGD算法也经常在机器学习上使用
常见对于梯度(gradient)的处理方法:
1、quantize gradient(biased):
将梯度进行分桶,以桶中的平均值、中位数作为梯度的代表值,从而减少损耗(reduction)。
如下图所示:
我们将Values中的梯度值根据大小分成桶,大小相近的分到一块,然后我们以,得到分桶的数据,我们以桶的中位数代表该桶中的梯度值,例如:0.08和0.02分到第三个桶中,因此这俩数据的值都被记为[0.1,0.3]区间的中位数0.2,从而达到数据压缩的目的,而我们在分布式学习中只需要将桶中的数据传输,大大减少了主机和从机之间的传输损耗。
2、sparsify gradient(unbiased)
在大部分场景应用中,神经网络模型的梯度往往呈现稀疏性(大部分值为零),如下图所示(鸢尾花数据集迭代20000次梯度分布图)也就意味着,我们在更新时,只有部分权值W进行更新,大部分的权值更新要么更新变化不大,要么不进行更新。所以我们可以只选用最大的k个梯度值进行传输更新,而其他的梯度我们认为是零。所以代表性的方法是只取出梯度值中的Topk来进行权值更新,提高速度,减少损耗(reduction)
算法一:
Sketched-SGD(类型:sparsify gradient):
该算法是上述算法分类中的sparsify gradient(unbiased)方法,取出Topk的梯度来进行更新,只取Topk进行更新存在一个问题:不能保证算法的收敛特性(no convergence guarantees),所以该算法为了克服该问题引入了误差计算。核心思想是:通过每次计算更新累积误差来实现 convergence guarantees。
下图是该算法的伪代码:
REFERENCES:
[1]SketchML: Accelerating Distributed Machine Learning
with Data Sketches
[2]Communication-efficient Distributed SGD with
Sketching
[3]Sebastian U Stich, Jean-Baptiste Cordonnier, and Martin Jaggi. Sparsified sgd with memory. In
Advances in Neural Information Processing Systems, pages 4452–4463, 2018.
以上内容只是个人的理解总结,如有错误还烦请大家批评指正。以后会不定时更新内容。