浅谈分布式学习(SGD)中提高速率的方法

背景:

在分布式学习中,如下图所示,将深度学习中的梯度计算任务分成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.

以上内容只是个人的理解总结,如有错误还烦请大家批评指正。以后会不定时更新内容。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值