本次介绍的是一种压缩神经网络模型大小的方法,来自《2014 arxiv:Compressing Deep Convolutional Networks using Vector Quantization》。该方法和很多之前的神经网络压缩方法一样,基本只对全连接层有效,因此这里权作了解。
由论文名可以看出,主要是对密集权重矩阵进行量化编码来实现压缩。
论文做了很多种量化方法的对比试验,不过都只针对全连接层,至于为什么不处理卷积层,大家可以考虑一下。下面就简单介绍一下这些方法。
全连接层的权重矩阵记作 \(W\in R^{m\times n}\) ,首先对 \(W\) 进行 \(SVD\) 分解,如下:
\(W=USV^T\)
为了能够用两个较小的矩阵来表示 \(W\) ,我们可以取奇异值的前 \(K\) 个分量。于是,W可以通过下式重建:
\(\hat W=\hat U\hat S{\hat V}^{T} ,其中\hat U\in R^{m\times k}\quad \hat V\in R^{n\times k}\)
我们唯一需要保存的就是3个比较小的矩阵 \(U,S,V\) ,我们可以简单算一下压缩比为 \(mn/k(m+n+1)\)
这种量化方法的想法来自于Dropconnect,量化如下:
假设原来的 \(W\) 是 \(float\) 型数据,则压缩比为 32
首先把 \(W\in R^{m\times n}\) 整成标量 \(w\in R^{1\times mn}\),然后进行K均值,于是每一个 \(W_{ij}\) 都可以用距离其最近的聚类中心表示,于是我们需要存储的只有 \(m\times n\)个索引,以及 \(K\) 个聚类中心。
乘积量化就是把原始数据划分成若干个子空间,在每个子空间中分别进行K-Means。
比如原来的 \(W\) 是 \({m\times n}\) 维的,我们可以把列(or 行)分成S份,即 \(W=[W^1,…W^S] \) ,然后对每一个 \(W^s\) 进行K-Means。
残差量化可以看做是一种分层量化、迭代量化。
首先对原始的 \(W\) 使用K-Means的,然后用聚类中心对其进行表示 \(W_{c1}\) ,然后计算残差 \(W’=W-W_{c1}\)。对 \(W’\) 继续K-means,重复上述过程。于是, \(W_i\) 可以表示为多级聚类中心之和:
\(W_i=c_j^1+c_j^2+…+c_j^t\)
接下来就是大量的对比试验,这里只列举一部分:(试验都在AlexNet的全连接层进行操作)
下图的横坐标是PQ的子空间分割数,K代表子空间中聚类的个数。
下图是不同方法的对比,结果发现PQ较好。此外为了综合考量准确率与压缩比,这里PQ中K=8。
论文是Facebook投到2015ICLR的,估计是被拒了,因为通篇只有对比试验而没有自己原创内容。此外,我们唯一可以收获的是了解了一些简单的量化方法,而这些方法是可以作为其它高级方法的基础的。