深度网络模型压缩DEEP COMPRESSION

DEEP COMPRESSION


主要流程:

  1. pruning(剪枝)
  2. trained quantization(量化训练)
  3. Huffman coding(霍夫曼编码)

首先通过学习重要的连接来修剪网络;接下来,量化权重以实施权重共享;最后,应用霍夫曼编码。实际效果可以将AlexNet 无准确率损失压缩35倍,240MB到6.9MB,VGG-16压缩49倍,552MB到11.3MB。
深度网络模型压缩DEEP COMPRESSION_第1张图片

Network Pruning


首先通过正常的网络训练学习连接。接下来,修剪小重量连接:从网络中删除重量低于阈值的所有连接。 最后,我们重新训练网络来学习剩余稀疏连接的最终权重。

使用压缩稀疏列(CSR)或压缩稀疏列(CSC)格式存储从剪枝产生的稀疏结构,这需要(2a + n + 1)个数字,其中a是非零元素的数量,n是 行或列。
关于这种压缩方式,wiki上有很好的解释,这是对稀疏矩阵的一种编码方式。
深度网络模型压缩DEEP COMPRESSION_第2张图片
为了进一步压缩,剪枝时候,只保留权值大于指定阈值的数,用存储索引差(diff)而不是原始的绝对位置(inx)来表示,对于索引差大于设定的span值,还会进行补零处理。例如设置span=8,idx=4和idx=1之间的位置差为3,无需补0。例如15和4之间距离为11大于span=8,所以在4+8=12的位置插入0,idx=15相对idx=12为3。span值在卷积层设置为8,全连接层为5。
深度网络模型压缩DEEP COMPRESSION_第3张图片

Trained Quantization And Weight Sharing


权重分享是一个比较重要的操作。如图所示,首先通过使多个连接共享相同权重来限制需要存储的有效权重的数量(上面),然后微调这些共享权重(下面)。

深度网络模型压缩DEEP COMPRESSION_第4张图片

原来的权重值可以用索引值和量化值替代,从而大大减小网络的规模。
压缩率计算方法如下公式所示:

深度网络模型压缩DEEP COMPRESSION_第5张图片
n代表连接数,b代表每一个连接需要b bits表示,k表示量化k个类,k类只需要用log2(k)个bit表示,n个连接需要nlog2(k)索引,还需要用kb表示量化中心的数值。 最初有4×4 = 16个权重,但只有4个共享权重:类似的权重被分组在一起以共享相同的值。 原来我们需要存储16个权重,每个都有32位,现在我们只需要存储4个有效权重(蓝色,绿色,红色和橙色),每个都有32位,连同16个2位索引,压缩率为16 * 32 /(4 * 32 + 2 * 16)= 3.2。

Weight Shearing


作者采用了K-means聚类方法,把权值量化为k个类。原始的n个权重 W=w1,w2,......,wn 使用聚类算法变为k个聚类中心 C=c1,c2,......,ck 。聚类算法最小化类内误差,目标函数如下所示:

深度网络模型压缩DEEP COMPRESSION_第6张图片

Initialization of Shared Weights


聚类中心C的初始化影响着量化方式,作者也采用了不同的初始化方法:随机初始化,基于密度初始化,线性初始化。
绝对值较大的权重比较小的重量更重要,但是这些权重的数目较少。 因此,对于随机初始化和基于密度的初始化,很少的质心具有很大的绝对值。 线性初始化不会受到此问题的困扰。 实验部分比较了聚类和微调后不同初始化方法的准确性,表明线性初始化效果最好。

Feed-forward and Back-propagation


一维k均值聚类的质心是共享的权重。 在前馈阶段和反向传播阶段中查找重量表有一个间接级别。 为每个连接存储共享权重表中的索引。 在反向传播期间,计算每个共享权重的梯度并用于更新共享权重。
深度网络模型压缩DEEP COMPRESSION_第7张图片

Huffman Coding


霍夫曼编码是常见的无损编码方式,最后使用这种方式进一步压缩模型。

深度网络模型压缩DEEP COMPRESSION_第8张图片

总结


整个流程较为清晰:稀疏编码,量化共享,概率编码,达到的效果也不错:

深度网络模型压缩DEEP COMPRESSION_第9张图片

更值得注意的是速度和功耗上:

深度网络模型压缩DEEP COMPRESSION_第10张图片

但是我也好奇这个东西解码出来有多大= =
在Github Demo上解码出来是232.57MB,跟原始的大小没什么区别,那么使用的时候还是需要再解码吧,所以感觉还是和理想的差一点。

你可能感兴趣的:(机器学习)