1. 概述
神经网络的模型是计算密集且内存密集的,这就制约了其在嵌入式设备上的使用。文章中的方法分为三个阶段:剪枝、量化训练、霍夫曼编码。量化阶段只会保留重要的filter;量化权重来强制权重共享;使用霍夫曼编码进一步减少模型占用。在前面的两步里面会进行finetune,剪枝会剪除9倍到13倍的连接(全连接?),量化把bit位规定到5。文章的方法将AlexNet从240MB压缩到了6.9Mb,VGG从552MB压缩到了11.3MB。
论文中提出的模型压缩方法可以使用下面这幅图来进行概括,分别表示pruning、quantization、Huffman Encoding三个阶段:
2. Pruning
总的来说是根据阈值来的,详细步骤如下:
(1)使用常规的网络训练方法学习网络的连接
(2)剪裁小权重的连接:将连接的权重小于某一个 阈值 的连接移除掉。
(3)使用剪裁之后的权重重新学习网络,使得网络连接稀疏
这里对pruning之后的稀疏结构使用压缩稀疏行(compressed sparse row,CSR)或压缩稀疏列(compressed sparse column,CSC)进行保存,这种格式需要
2
a
+
n
+
1
2a + n + 1
2a+n+1个数字,其中
a
a
a是非零元素的数量,
n
n
n是行或列的数量。为了更近一步压缩,这里存储的是位置偏移而不是绝对空间位置,对卷积层使用8 bits编码,全连接层使用5 bits编码。当需要一个比边界大的索引差时,使用零填充作为解决方案,见下图。以防偏移超过8,最大的3位使用无符号数,加一个补零。
3. 量化与权值共享
网络的量化与权值共享通过压缩每个权重的bit数更进一步压缩网络的大小。通过权值共享限制有用权值的个数,之后再次基础上进行finetune。
权值共享的示意图如图3所示。对于原始的权重大小为
4
∗
4
4*4
4∗4的,对应的梯度矩阵也是
4
∗
4
4*4
4∗4的,那么通过量化之后分别将其量化为
4
4
4个,是原来的
1
4
\frac{1}{4}
41,从而减少参数的数量。
在论文中给出了压缩比的计算公式,如下所示:
r
=
n
b
n
⋅
l
o
g
2
(
k
)
+
k
b
r=\frac{nb}{n\cdot log_2^{(k)}+kb}
r=n⋅log2(k)+kbnb
使用上图中的权值共享作为例子,对于原始给定的
4
∗
4
=
16
4*4=16
4∗4=16个权重用
4
4
4个权重去代表,也就是使用4个32位的数字与16个2bit来存储原来16个32位的数据,那么压缩比为:
16
∗
32
4
∗
32
+
2
∗
16
=
3.2
\frac{16*32}{4*32+2*16}=3.2
4∗32+2∗1616∗32=3.2。
3.1 权值共享
这里在每个层中使用k-means方法进行聚类,每个类中的数据使用其中心数值代表。若原始存在
n
n
n个权重
W
=
{
w
1
,
w
2
,
…
,
w
n
}
W=\{w_1,w_2,\dots,w_n\}
W={w1,w2,…,wn}聚类到
k
k
k个中心
C
=
{
c
1
,
c
2
,
…
,
c
k
}
C=\{c_1,c_2,\dots,c_k\}
C={c1,c2,…,ck},其中
k
k
k远小于
n
n
n,那么这个问题可以转化为下面的最优化问题:
3.2 共享权值的初始化
上一小节中讲到了使用聚类算法去实现权值聚类,从而实现参数共享。那么聚类中心的初始化就很重要了,论文中讨论了三种初始化方式:Forgy、Density-based、Linear。论文中使用AlexNet中的conv3层进行实验,得到下图中的结果:
3.3 前向与反向传播
通过前面的聚类压缩等,前向与反向按照对应的映射表来实现的。对于每个聚类之后的共享权值其梯度计算表示为:
4. 霍夫曼编码
对于AlexNet中的全连接层,其权值分布如下图所示,在得到其分布的情况下使用霍夫曼编码进一步编码,压缩空间:
5. 实验结论
论文中分别使用MINIST与ImageNet数据集进行实验,将AlexNet从240MB压缩到了6.9MB,详见下表。
作者在实现pruning的时候是在blob上使用mask来控制连接的;在量化与权值共享的时候,量化和权重共享是通过维护一个存储共享权重的码本结构,以及在计算每个层的梯度后按索引分组来实现的。每个共享的权重都被更新为该bucket中的所有梯度;对于霍夫曼编码是finetune完成之后离线完成的。
6. 讨论
6.1 网络量化与剪裁
这里论文对网络量化与剪裁它们的关系与组合的效果,下面这幅图是单独量化、剪裁、量化剪裁组合与矩阵分解对网络精度的影响:
在论文中指出在未剪裁网络上进行量化与剪裁之后网络再量化,对于网络精度的影响曲线,见下图
可以在图中看到在三个场景下实线部分都是较虚线部分略好的,论文中给出的解释是:剪裁和为剪裁的网络在参数量上肯定是不一样的,那么在相同的聚类中心数目下,剪裁之后的网络再进行量化得到的误差相对来说更小一些。
6.2 聚类初始化方法
在上面的内容中说到了三种聚类的初始化方法,论文这里对其进行了细致比较,见下图
从上图可以看出,uniform init初始化(Linear)好于其它的初始化方法,文中给出的解释是:这样的选择方式很好照顾到了权值中比较大的成分,从而有利于网络性能,给出的直观解释就是权值越大,越重要。
7. 个人感悟
这篇文章是一篇较为工程性质的文章,给出了如何实现model压缩的思路以及流程。剪枝、量化、编码都涉及到了,需要网络压缩比较厉害的可以仔细研究一下。