deep compression 深度压缩 ICLR2016
论文地址:https://arxiv.org/abs/1510.00149
deep compression 分为三步,针对fully connected layer压缩:
(1) network pruning
(2) weight sharing
(3) huffman coding
1,network 剪枝
剪枝过程看作是最小化loss的过程:
这里的L是损失函数,里面是权重W和二值mask的点积,这里的二值mask表示的是参数w重要与否,比如w1是重要的权重参数,所以h1=1,反之h1=0.
那么怎么知道这个w的重要性呢?!
论文中说设置了threshold,这个阈值是w的绝对值平均值(the average absolute value), a=threshold, b=threshold+t ( t 是很小的实数 a small margin t ).
这个式子这样想比较容易理解:将a和b看成同一个阈值,实际上它们相差非常小,只是一个很小很小的t, 看成同一个threshold影响不大。所以这里实际上就两种情况,一种大于threshold, 表示这个w是重要的,另一种是小于threshold, 表示这个w不重要,可有可无,可以修剪掉。W采用拉格朗日和梯度下降机制来更新:
反复剪枝,观察loss的变化,如果loss上升,证明这个剪枝不明智,重新修剪,流程图如下:
修剪w之后, 权值分布分成大于零和小于零两部分,论文中没有解释为什么需要修剪成w这样分布,是不是大于零的表示这个w对loss有着正影响,小于零的表示负影响,但是为什么要这样分别考虑影响?说明吧负影响的剪掉?!
2,权值共享
论文中认为,权值相差很小的w没有必要单独使用不同的权重值,这些相差很小的w群体可以共享一个average weight。此处用k均值聚类算法,但是K均值算法有个bug是初始化会严重影响聚类效果,所以这里采用了Forgy, Density-based 和 Linear 三种方法来对比初始化权值的效果, 并且选择了13 聚类数。
3,Huffman 编码
用于最后的硬压缩,减小parameters memory
总体流程图:
experimental result