1.背景:
问题:深度网络 计算和内存密集(大存储开销,能量消耗),很难部署到硬件资源有限的嵌入式系统/移动系统
解决方案:通过 pruning, trained quantization and Huffman coding 压缩模型,不影响正确率
2.介绍
去掉不太重要的权值 ----> 压缩权值本身的大小
-
pruning:学习重要的connections,去除冗余连接.
(1)过程:
输入:原始网络
第一步:通过正常的网络训练学习连接
第二步:修剪 小权重 的连接(权重低于阈值)
第三步:重新训练网络,学习剩余稀疏连接的权重
第四步:再修剪连接,训练网络,直到不影响原始正确率
(2)存储修剪后的稀疏结构:
稀疏矩阵用compressed sparse row(CSR)和compressed sparse column(CSC)的格式进行压缩
存储需要 2a+n+1 存储单元 (a:非零元素 , n:行/列)
为了进一步压缩,存储索引差值而不是绝对位置( index的字节数就可以被压缩),
减少存储元素位置index所带来的额外存储开销
( conv layer:8 bits ,fc:5 bits 差值大于界限用零填充)
一个4*4的矩阵可以用一维16数组表示,剪枝时候,只保留 权值大于指定阈值的数,用相对距离来表示,例如idx=4和idx=1之间的位置差为3,如果位置差大于设定的span,那么就在span位置插入0。例如15和4之间距离为11大于span(8),所以在4+8的位置插入0,idx=15相对idx=12为3。这里span阈值在卷积层设置为8,全连接层为5。 -
trained quantization:用共享权重来量化网络。(量化:降低表示数据所用的位数)
(1)过程
假设有一个层,它有4个输入神经元,4个输出神经元,那么它的权值就是4*4的矩阵;
图中左上是weight矩阵,左下是gradient矩阵。可以看到,图中作者把 weight矩阵
聚类成了4个cluster(由4种颜色表示)。属于同一类的weight共享同一个权值大小(看中间的白色矩形部分,每种颜色权值对应一个cluster index);
由于同一cluster的weight共享一个权值大小,所以我们只需要存储权值的index。用4个权值和16个索引就可以计算得到4
4权重矩阵连接的权值。 在 权值更新 的时候,对不同层求导,所有的gradients按照weight矩阵的颜色来分组(同样量化为4类),同一组的gradient求和(得到每类的偏置),得到是sum乘上learning rate再减去共享的centroids(和量化中心一起更新得到新的权值。),得到一个fine-tuned centroids,聚类得到k个聚类中心, 并记录对应index.
再训练, 得到梯度值.
累加同一聚类簇的梯度值, 并乘以学习率
更新聚类中心.(2)原理
通过 减少代表每个权重所需的bits 进一步压缩修剪之后的网络
通过 共享权重 限制需要存储的有效权重数量(微调共享权重)
(3)权值共享:
对每一层 使用 K均值聚类 识别共享的权重,相同的cluster里共享权重,而不是通过layers共享
跨层的weight不进行共享权值
一维k均值聚类的 centroids(质心) 就是共享的权重
(4)初始化共享权重
K-means 聚类,初始点的选择对于结果有着非常大的影响
Centroid initialization 影响权重聚类的质量和网络预测的准确性
3种初始化方法:随机初始化、基于密度、线性初始化
大权重 比 小权重 更重要 。 (但是 随机初始化 和 基于密度 very few centroids 有大的绝对值 来代表大权重)
线性初始化表现结果更好。
(5)前向传播和反向传播
在前向传播和反向传播之间 在查找权重表 时有一个间接阶段 (共享权重的索引表)
存储codebook (有效权重) 和索引 -
Huffman coding:利用有效权重的偏置分布。
(1)霍夫曼编码 是 无损数据压缩最常用的 最优前缀编码
(2)使用变长的 codewords(密语) 来编码原始信号。经常出现的信号用 fewer bits 表示
(3)主要用于解决编码长短不一带来的冗余问题,卷积层统一采用8bit编码,而全连接层采用5bit,所以采用这种熵编码能够更好地使编码bit均衡,减少冗余。
3.实验和结论
- 实验:
(1)pruning:通过添加mask ,屏蔽被裁剪连接的更新
(2)quantization and weight sharing:
maintaining a codebook structure that stores the shared weight, and
group-by-index after calculating the gradient of each layer.
Each shared weight is updated with all the gradients that fall into that bucket
(3)Huffman coding :不要求训练 、 在所有微调完成后脱机实现. - 讨论
(1)pruning 和 trained quantization 分别单独工作 没有一起工作的效果好
(2)pruning 和 trained quantization 压缩网络时互补干扰
(3)不同压缩bit对精度的影响,表明conv层比fc层更敏感, 因此需要更多的bit表示。 - 结论
(1)pruning and quantization在压缩中贡献很大 (compressed 32x),哈夫曼编码贡献很小(compressed 40x)
Pruning:把连接数减少到原来的 1/13~1/9;
Quantization:每一个连接从原来的 32bits 减少到 5bits
(2)pruned network 在很多硬件中都成为了基准,但是quantized network并没有。
因为现成的库不支持间接矩阵条目查找,也不支持CSC或CSR格式的相对索引
(3)深度压缩 对 实时图形处理、快速目标检测 都很重要
4.补充
- (1)传统的神经网络需要在训练前确定与修正架构,因此训练过程并不会提升架构的性能。而若直接选择复杂的架构,那么过多的参数又会产生过拟合问题。因此,选择适当容量(capacity)的模型和消除冗余对计算效率和准确度的提升至关重要
- (2)目前每层权值修剪的比例仍然是预设的,这个比例需要迭代试验以实现在尽可能压缩权值的同时保证精度。所以如何自动化选取阈值就成为了后面一个继续深入的课题。