Deep Gradient Compression: Reducing the Communication Bandwidth for Distributed Training(DGC)论文解读

简介

Deep Gradient Compression: Reducing the Communication Bandwidth for Distributed Training (arxiv.org)

本文针对当前的分布式机器学习形式提出了以下待解决的困难:

  1. bandwidth,梯度信息在节点中传输,而网络带宽不足以满足频繁的传输需求
  2. redundant,绝大多数(99.9%)的梯度信息的传输是多余的

针对这两种困难形式,作者提出了Deep Gradient Compression (DGC),来有效的减少梯度信息交换所需要的网络带宽,在DGC过程中,由于梯度压缩会影响梯度所包含的信息量,进而影响模型准确率,作者提出了4个方法,来减轻梯度压缩对准确率带来的影响.

  1. momentum correction.
  2. local gradient clipping.
  3. momentum factor masking.
  4. warm-up training.

前两个方法保证了模型的表现,后两个方法克服了staleness陈旧数据对梯度下降的影响

Deep Gradient Compression (DGC)

Gradient Sparsification (梯度稀疏化)

只发送重要的梯度信息来减少通信所需要的带宽,即只发送大于某个阈值的梯度。为了避免信息的损失造成模型效果减弱,小于阈值的梯度会随着后续训练继续累加,直至超过阈值。

立即发送大梯度,小梯度累计发送

算法流程如下:

  1. 输入训练集dataset,每个minibatch的大小(每个节点的minibatch都相同),节点的个数,最优化方法SGD,初始化参数.
  2. (Line 1)初始化节点k的梯度为0
  3. (Line 2)对于每一轮循环,(Line 3)先将上一次更新所得的梯度值复制给这次即将需要更新的梯度值,(Line 4-7),对于minibatch中的每个元素x,利用Line 6的公式计算每个元素的梯度的1Nb倍加到总梯度中(Nb是每轮更新中所有N个节点的所有minibatch b中包含的所有数据点的个数)
  4. (Line8 - 13)对于参数w的每个维度,根据本轮梯度中第j的维度的大小,选择其一定的比例作为阈值. 并将大于阈值的部分保存到G~tk[j]中,小于阈值的保存到Gtk[j]
  5. (Line 14-15)最后,将大于阈值的部分通过编码后进行all-reduce操作保存到当前的全局梯度中,随后根据此全局梯度,使用SGD优化全局参数

如果不懂all-reduce是什么的话可以移步:

Broadcast,Scatter,Gather,Reduce,All-reduce分别是什么?_aiwanghuan5017的博客-CSDN博客

AllReduce_jony0917的博客-CSDN博客_allreduce

已经超过阈值的梯度会被全局模型用来更新,那么未超过阈值的梯度该如何累计呢?

我们定义F(w)为优化参数w的损失函数,通过SGD(随机梯度下降)对模型参数进行优化更新,公式如下:

(1)F(w)=1XxXf(x,w),wt+1=wtη1Nbk=1NxBk,tf(x,wt)

F(w)为训练数据集X中所有数据的损失的平均值,wt+1通过计算每个节点k上的每个minibatch的所有数据的平均值进行更新。

对于权重w(i),在第T轮迭代后,有

(2)wt+T(i)=wt(i)ηT1NbTk=1N(τ=0T1xBk,t(i)f(x,wt+τ))

从公式中可以看出局部梯度积累可以看作是将批次量的大小从Nb增加到NbT (对τ的二次求和), 其中T是两次迭代之间的稀疏更新间隔的长度,即每进行T次迭代就发送一次w(i)的梯度。学习率缩放是处理大量小批量下降的常用技术, ηTNbT中的T将会自动抵消

Improving The Local Gradient Accumulation

如果不注意稀疏性,当稀疏度极高时稀疏更新会极大地危害收敛

作者提出Momentum CorrectionLocal Gradient Clipping来解决这个问题

1. Momentum Correction

Momentum SGD经常被用来代替普通的SGD.但是算法1不直接适用于带有动量项的SGD,因为它忽略了稀疏更新间隔之间的折扣因子

Momentum :动量。模拟的是物理中物体运动的惯性,更新时需要保留一部分当前的运动信息,利用当前的梯度微调最终的更新方向,可以在一定程度上增加稳定性,从而学习地更快,并且还有一定摆脱局部最优的能力。

那我们如何将算法1改进为Momentum SGD呢?我们先从普通的momentumSGD来观察。N个节点的普通momentumSGD算法如下:

(3)ut=mut1+k=1N(k,t),wt+1=wtηuy

其中,k,t=1NbxBk,tf(x,wt),让我们考虑w(i)在T轮更新后的值:

(4)wt+T(i)=wt(i)η[+(τ=0T2mτ)k,t+1(i)+(τ=0T1mτ)k,t(i)]

如果上式直接应用到稀疏梯度场景下,即(Line 15 in Algorithm 1),则更新就不等价与公式3,如下:

(5)vk,t=vk,t1+k,t,ut=mut1+k=1Nsparse(vk,t),wt+1=wtηut

vk,t为节点k的local gradient accumulation,当vk,t大于阈值时,会通过sparse函数并encode后,通过第二个公式项计算梯度,并由第三个公式更新。更新公式为:

(6)wt+T(i)=wt(i)η(+k,t+1(i)+k,t(i))

较于公式(4)的区别在于取消掉了累积折扣因素 τT1mτ 导致收敛性能的损失,如图a所示,C为公式6的结果,B为公式4的结果

不使用动量修正的局部梯度梯度积累会导致改变最后的优化方向,为了避免这种错误,我们需要动量修正上方的公式(5), 确保稀疏更新等价于公式(3)中的密集更新,结果如B所示,公式如下:

(7)uk,t=muk,t1+k,t,vk,t=vk,t1+uk,t,wt+1=wtηk=1Nsparse(vk,t)

2. Local Gradient Clipping

为了避免梯度爆炸问题,使用梯度裁剪 gradient clipping. 该方法会在梯度的L2范数之和超过某一阈值时对梯度进行重缩放, 这一步通常在所有节点的梯度聚合之后执行。我们用当前梯度除以N12进行缩放.

Overcoming The Staleness Effect

因为我们延迟了小梯度的更新,当这些更新发生时,可能经过了几百至数千轮的训练过程,那么当时的数据对于现在来说就不具有时效性了,会降低收敛速度,降低模型性能。本文使用Momentum Factor MaskingWarm-up training来解决。

1. Momentum Factor Masking

对公式7中的累计梯度vk,t与momentum factor uk,t也使用Mask掩码.

Mask|vk,t|>thr,vk,tvk,t¬Mask,uk,tuk,t¬Mask

这个mask阻止stale梯度的动量,防止陈旧的动量携带权重(weight)在错误的方向

2. Warm-up training

在训练的早期阶段,网络正在迅速变化,梯度更加多样化,且梯度值非常大。稀疏梯度限制了模型的变化范围,从而延长了网络剧烈变化的周期。同时,前期剩余的大梯度在被选择为下一次更新之前被累积,因此可能会超过最新的梯度,从而误导优化方向。

在大型小批量训练中引入的热身训练方法是有帮助的。

在热身阶段,我们使用较低的学习率来减缓神经网络在训练开始时的变化速度,并使用较低的梯度稀疏性来减少被延迟的极端梯度的数量。

posted @   Aegsteh  阅读(620)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 分享4款.NET开源、免费、实用的商城系统
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库
· 5. Nginx 负载均衡配置案例(附有详细截图说明++)
点击右上角即可分享
微信分享提示