A-卷积网络压缩方法总结( 二 )


基于此方法,有学者尝试将剪枝的粒度提升到整个滤波器级别,即丢弃整个滤波器,但是如何衡量滤波器的重要程度是一个问题,其中一种策略是基于滤波器权重本身的统计量,如分别计算每个滤波器的 L1 或 L2 值,将相应数值大小作为衡量重要程度标准 。
利用稀疏约束来对网络进行剪枝也是一个研究方向,其思路是在网络的优化目标中加入权重的稀疏正则项,使得训练时网络的部分权重趋向于 0 ,而这些 0 值就是剪枝的对象 。
2.1,总结总体而言,剪枝是一项有效减小模型复杂度的通用压缩技术,其关键之处在于如何衡量个别权重对于整体模型的重要程度 。剪枝操作对网络结构的破坏程度极小,将剪枝与其他后端压缩技术相结合,能够达到网络模型最大程度压缩,目前工业界有使用剪枝方法进行模型压缩的案例 。
三,参数量化相比于剪枝操作,参数量化则是一种常用的后端压缩技术 。所谓“量化”,是指从权重中归纳出若干“代表”,由这些“代表”来表示某一类权重的具体数值 。“代表”被存储在码本(codebook)之中,而原权重矩阵只需记录各自“代表”的索引即可,从而极大地降低了存储开销 。这种思想可类比于经典的词包模型(bag-of-words model) 。常用量化算法如下:

  1. 标量量化(scalar quantization) 。
  2. 标量量化会在一定程度上降低网络的精度,为避免这个弊端,很多算法考虑结构化的向量方法,其中一种是乘积向量(Product Quantization, PQ),详情咨询查阅论文 。
  3. 以PQ方法为基础,Wu等人设计了一种通用的网络量化算法:QCNN(quantized CNN),主要思想在于Wu等人认为最小化每一层网络输出的重构误差,比最小化量化误差更有效 。
标量量化算法基本思路是,对于每一个权重矩阵 \(W\in \mathbb{R}^{m\times n}\),首先将其转化为向量形式:\(w\in \mathbb{R}^{1\times mn}\) 。之后对该权重向量的元素进行 \(k\) 个簇的聚类,这可借助于经典的 k-均值(k-means)聚类算法快速完成:
\[\underset{c}{arg min}\sum_{i}^{mn}\sum_{j}^{k}\begin{Vmatrix}?w_{i}-c_{j}\end{Vmatrix}_{2}^{2}\]这样,只需将 \(k\) 个聚类中心(\(c_{j}\),标量)存储在码本中,而原权重矩阵则只负责记录各自聚类中心在码本中索引 。如果不考虑码本的存储开销,该算法能将存储空间减少为原来的 \(log_{2}(k)/32\) 。基于 \(k\) 均值算法的标量量化在很多应用中非常有效 。参数量化与码本微调过程图如下:
A-卷积网络压缩方法总结

文章插图
这三类基于聚类的参数量化算法,其本质思想在于将多个权重映射到同一个数值,从而实现权重共享,降低存储开销的目的 。
3.1,总结参数量化是一种常用的后端压缩技术,能够以很小的性能损失实现模型体积的大幅下降,不足之处在于,量化的网络是“固定”的,很难对其做任何改变,同时这种方法通用性差,需要配套专门的深度学习库来运行网络 。
这里,权重参数从浮点转定点、二值化等方法都是是试图避免浮点计算耗时而引入的方法,这些方法能加快运算速率,同时减少内存和存储空间的占用,并保证模型的精度损失在可接受的范围内,因此这些方法的应用是有其现实价值的 。更多参数量化知识,请参考此 github仓库 。
四,二值化网络
  1. 二值化网络可以视为量化方法的一种极端情况:所有的权重参数取值只能为 \(\pm 1\) ,也就是使用 1bit来存储WeightFeature 。在普通神经网络中,一个参数是由单精度浮点数来表示的,参数的二值化能将存储开销降低为原来的

    经验总结扩展阅读