2017《DEEP GRADUIENT COMPRESSION》

作者:Song Han

摘要:

1.DGC:DEEP GRADUIENT COMPRESSION

2.前提:99.9%的梯度都是没有用的

3.方法:动量修正、本地梯度缩放、动量因子遮蔽、热启动。

4.压缩倍数[270,600]->压缩率[0.003703704,0.001666667]。注意,是无损压缩。

5.对象:CNN、RNN。

1.介绍

1.动量修正、本地梯度缩放:保证了无损压缩。

2.动量因子遮蔽、热启动:缓解了参数陈旧的问题。

2.相关工作

1.For instance, asynchronous SGD accelerates the training by removing gradient synchronization and updating parameters immediately once a node has completed back-propagation(这个后续了解一下)

2.梯度量化:1—bit SGD、QSGD、TernGrad(3-level)、DoReFa-Net(1-bit weights with 2-bit gradients)

3.梯度稀疏化:主要思想是利用thresold进行裁剪。具体方法参加原文。

4.DGC:600倍压缩,无损,不需要额外的layer normalization,无需更改模型结构。

3.DGC

3.1梯度稀疏化

1.仅传输重要的梯度,简单认为绝对值大的梯度就重要(这个真的对吗?)。

2.要累积没有发送的梯度,在以后进行发送。保证到最后所有的梯度都被发送了。

3.使用encode方法进行发送(没有看懂encode方法:The encode() function packs the 32-bit nonzero gradient values and 16-bit run lengths of zeros.)

4.本质上就是将minibatch的大小由Nb增长为NbT。(具体见公式)

3.2增加本地累积的准确率

一旦单次传送梯度的稀疏度很高,就破坏了收敛。动量修正、本地梯度缩放可以减缓这个问题。

动量修正

当使用动量算法作为优化器时,直接传送裁剪后的梯度就忽略了discounting factor,破坏了收敛。

解决方法:由传输梯度改为传输动量:本地计算动量,裁剪动量(相应也是累积动量),传送动量。

(感觉逻辑上有问题,本地的动量和全局动量应该不是一回事儿吧)

本地梯度缩放

前人方法:梯度的L2范数总和超过阈值就进行缩放,步骤:收集各个节点梯度,求和,缩放,累加。

DGC:利用乘上sqrt(N)进行缩放;步骤:先计算本地梯度G(t),然后进行缩放,然后加上G(t-1)。(这里有一个疑问:如果先加和再缩放呢?)

3.3避免参数陈旧问题

当模型稀疏度达到99.9%时,T=[600,1000],因此参数陈旧问题很严重。

动量因子遮蔽

步骤见公式

在公式7中,动量和累积量使用相同的Mask,没有解释原因,但从上文看,好像这样就足够好了。

注意这里面的thresold应该是和“3.1梯度稀疏化”中的thresold不同。

(疑问:其实就是去除了绝对值比较大的累积量,但是绝对值大就一定是陈旧的吗?为什么不用遍历次数进行衡量?)

热启动训练

结论:训练早期不应该进行梯度稀疏化。原因:早期的梯度有多样性和攻击性,如果不让发送就会限制变化范围,从而减缓收敛;累积早期梯度可能会误导收敛方向。

采用的方法:对于神经网络,训练早期采用攻击性小的学习速率,以减缓网络的变化速度;早期减缓梯度的稀疏度;渐变过程:随着epoch的增加, 不是线性增加学习速率,而是指数增常梯度稀疏度,文章认为这样可以帮助训练更容易适应较大的梯度稀疏度(为什么?)。

4实验

5系统分析和性能

在梯度稀疏化时,确定thresold很耗时。因此采用采样方法确定阈值。

利用 Wen et al. (2017) 提出模型进行测试。

调整集群数量和网卡配置进行对比。

6结论

未来将要分层设置thresold,用来加速梯度稀疏化的速度。