首先,我们能够增加分布式系统的数据吞吐量:工作节点能把更多的时间用于数据计算,而不是等待参数平均步骤的完成
其次,相比于同步更新的方式(每隔N步),各个节点能够更快地从其它节点获取信息(参数的更新量)。
但是,这些优势也不是没带来开销。随着引入参数向量的异步更新,我们带来了一个新的问题,即梯度值过时问题。梯度值过时问题也很简单:计算梯度(更新量)需要消耗时间。当某个节点算完了梯度值并且将其与全局参数向量合并时,全局参数可能已经被刷新了多次。用图片来解释这个问题就是如下:
异步SGD的简单实现可能会导致非常严重的梯度值过时。举个例子,Gupta et al. 2015 [3]证明了梯度值的平均过时量等于执行单元的个数。假设有N个执行单元,也就是说梯度值被用于计算全局参数向量时,平均会延迟N个计算步骤。这会在现实场景中带来问题:严重的梯度值过时会明显减慢网络模型的收敛速度,甚至完全停止了收敛。早期的异步SGD实现(例如Google的DistBelief系统[2])并没有考虑到这些问题,因此学习的效率远不如它原本应有状态。
异步随机梯度下降方法还有多种形式的变种,但采取了各种策略来减弱梯度过时所造成的影响,同时保持集群的高可用率。解决梯度值过时的方法包括以下几种:
基于梯度值的过时量,对每次更新?Wi,j 分别缩放λ的值
采用‘软’的同步策略soft synchronization([9])
使用同步策略来限制过时量。例如,[4]提到的系统在必要时会延迟速度较快的节点,以保证最大的过时量控制在某个阈值以下。
所有这些方法相比简单的异步SGD算法都本证明能提升收敛的性能。尤其是前两条方法效果更为显著。soft synchronization的方法很简单:相对于立即更新全局参数向量,参数服务器等待收集n个节点产生的s次更新?Wj(1 ≤ s ≤ n)。参数随之进行更新:
其中
λ
(
Δ
W
j
)
表示缩放因子。
注意,我们设置s=1并且λ(·) = 常数,就得到了简单版的异步SGD算法([2]);同样的,若设置s = n,我们得到了类似(不完全相同)同步参数平均的算法。
去中心化异步随机梯度下降
文献[7]给出了一种分布式训练神经网络模型的方法。我将这种方法称为去中心化的异步随机梯度下降算法(尽管作者并不使用这一术语)。这篇文章有两大特色:
系统中不存在位于中心地位的参数服务器(而是采用平等的通信方式在节点之间传递模型更新量)
更新量被高度压缩,网络通信的数据量可以减少大约3个数量级。
在标准的数据并行化实现中(采用参数平均或者异步SGD),网络的传输量等于参数向量的大小(因为我们要不传输整个参数向量的副本,要不每个向量的梯度值)。尽管压缩参数或者更新量的想法并不算很新,它的实现方法比其它简单的压缩机制更胜一筹(例如采用压缩编码或是转换为16位浮点数表示)。
这个设计的优点在于更新向量δi,j 是:
稀疏向量:在每个向量δi,j 中只有一部分梯度值需要传播(剩余的值默认为0)—— 使用整数索引来对稀疏元素进行编码
量化为一个比特:稀疏更新向量的每一个元素取值+τ 或 ?τ。τ的值对向量的所有元素都相同,因此只需要用一个bit来区分这两种取值。
整数索引值(用于识别稀疏向量中的元素索引)也可以采取熵编码来进一步降低数据量(作者提到增加这些额外的计算之后还能压缩三倍,尽管换来的收益并不值这些额外的开销)
这里引出了两个问题:(a)这些工作对减少网络传输究竟有多大的帮助?(b)它对准确率有何影响?答案分别是 很大 和 比你想象的要少 。
举个例子,假设一个模型有14.6个参数,如Strom的论文中所描述的:
CompressionUpdate SizeReductionNone (32-bit floating point)58.4 MB-16-bit floating point29.2 MB50%Quantized,