模型压缩论文阅读列表

模型压缩,包括低秩分解、剪枝、量化、蒸馏等技术,旨在精度损失很小的前提下,获得参数更小、推理速度更快的模型

方法

低秩分解

学习可分离滤波器

Learning Separable Filters

本文提出,通过学习可分离卷积核的方法降低卷积运算的复杂度。 一种方法是,为卷积添加“可分离”的约束,但是作者发现先学习不可分离卷积,之后学习用可分离卷积线性组合得到不可分离卷积更好

可以抛开应用背景看,本文对卷积核的分解使用现在看来非常直观的方法:先在模型优化目标中引入卷积核矩阵的核范数,得到低秩的核之后,把核分解过程从模型优化过程解耦出来,找到次优的分解基和权重;

对于3D卷积,由于SVD只能分解2D矩阵,核范数的优化不能实现,因此,在分解的过程作者使用了Canonical Polyadic Decomposition(CPD)的分解方法;

探索卷积核的线性结构

Exploiting Linear Structure Within Convolutional Networks for Efficient Evaluation

见先前的文章

这篇文章的方法,在保持分类误差不超过1%的前提下,只是将1个卷积层进行分解并且获得了大约1.6倍的加速比;

用低秩扩展加速卷积神经网络

Speeding up convolutional neural networks with low rank expansions

详细分析见文章

在空间维度上使用rank-1分解,在通道维度上使用基的线性组合,通过调整基组成的子空间的维度(基的个数)来权衡加速比和精度;作者基于这样的思想设计了两种分解模式;并对比最小化卷积核重建损失和数据重建损失的效果;

非线性卷积层的高效和精确估计

Efficient and accurate approximations of nonlinear convolutional networks

本文的主要目标是加速CNN的推理。

剪枝

模型剪枝:学习网络的权重和连接

Learning both weights and connections for efficient neural network

我们知道,dropout过程是一种在训练阶段随机剪裁神经元之间的连接,但是在推理时恢复所有连接的技术;而剪枝则是在训练时减去的连接,推理时也不再恢复;

剪枝可以分为单步剪枝和迭代剪枝,本文使用迭代剪枝,减除更多参数;剪枝选择的策略也有很多,一种直观地策略是,去除那些绝对值小的神经元,本文的实验发现这种方法损害性能;本文中的一次迭代是:减去那些输入为0或者输出为0的神经元,之后微调模型;为了提高效率,以及避免网络在反向传播过程中梯度消失,如果做卷积层的剪枝则在微调时冻结全连接层,反之亦然;

是什么保证了存在输入或输出为0的神经元?正则项;L1正则项更具有使得模型参数稀疏化的能力,而在使用微调后,L2正则项的表现更好;

随着模型的稀疏,输出方差也在变小,这意味着减小过拟合,因此随着剪枝迭代的进行,dropout率应该减小;

模型压缩:剪枝+量化+Huffman

Deep compression: Compressing deep neural networks with pruning, trained quantization and huffman coding

一种结合剪枝、量化和霍夫曼编码的深度神经网络压缩技术,将AlexNet从240MB压缩到6.9MB,将VGG-16从552MB压缩到11.3MB;

剪枝方法沿用作者先前的无损剪枝操作;量化方法使用K均值聚类,根据训练好的模型权重建立codebook以及原始权重在codebook中的索引,探索了三种聚类中心的初始化方式;

观察到量化后的索引与聚类权重分布不均,使用霍夫曼编码进一步压缩存储;

剪枝卷积网络中的滤波器

Pruning filters for efficient convnets

使用简单的magnitude based策略来分析滤波器权重,剪裁滤波器与响应的特征图,具体的剪裁方法很简单,记卷积层参数\(F\in \mathbb R^{C_2\times C_1\times H\times W}\),其中\(C_2\)\(C_1\)分别为输出通道数和输入通道数,可以看成\(C_2\)个卷积核,现在希望从中去除\(m\)个卷积核:

  1. 计算\(C_2\)个卷积核各自的L1 norm,排序,选出最小的那几个卷积核,移除;
  2. 由于输出通道数变为\(C_2-m\),那么接下来的一个卷积层的卷积核的对应输入通道也要移除\(m\)个;

作者还在文中做了一些其他讨论,比如

  • 各个卷积层的剪枝会影响到后续卷积层,这里存在一个简单的组合优化问题,每一个卷积层,是先完成前面层对其输入通道数的影响,再根据前文的策略缩减输出特征维度;如果考虑前面的影响,又该考虑前面几层影响,是最优的?作者实验了两种方案,各自独立剪裁,后传播影响;以及贪心策略;后者稍好一些
  • 存在残差连接的情况下,shortcut上的1x1卷积和主干上的第二层卷积层只能二选一剪枝(一个会影响另一个),作者选择以shortcut上的剪枝为主,因为shortcut更重要一些;
  • 一次性全剪枝完再微调,还是迭代地剪枝、微调;后者效果稍好,但是对于更深的网络,后者微调的时间更长一些;
  • 使用什么样的norm来表示卷积核的重要性

量化

Compressing Deep Convolutional Networks using Vector Quantization

其他

频域压缩

Packing convolutional neural networks in the frequency domain

把卷积核视为图像,在频域中分解为公共部分和个体方差,之后丢弃这两者大部分的低频信号,同时不会带来严重的精度损失;作者还探索了数据驱动的消除冗余的方法;

在CNNPackv1中,主要步骤为:

  • 对所有卷积核使用DCT变换,之后剪裁到固定的维度\(d\),(卷积核的高频信息在该过程被抛弃);
  • 学习卷积核的k个聚类中心,并计算各个卷积核相对于聚类中心的残差,分别对聚类中心和残差进行稀疏化(L1 norm);
  • 固定已经完成剪枝和稀疏化的参数不变,微调网络,并量化残差,重复至收敛;最后再使用CSR保存参数的稀疏形式并使用Huffman编码;

在CNNPackv2中,压缩过程使用上了输入数据,修改了目标函数;对于这个目标函数,作者还用相当的篇幅描述了如何优化;

由于压缩、量化都是在频域中完成的,如果要在推理时使用原来空间域中卷积的方式,需要将频域中的卷积核转换回去,得到的空间域中的卷积核将不再稀疏,这就意味着,在推理时,模型参数在内存中的占用量远大于在磁盘上存储的大小;因此作者设计了在频域中完成卷积的加速方法;

本文数学推导较多,需要DCT相关的背景知识,笔者将来有空时也许会单独开一篇关于本文的论文阅读;

data-driven的CNNPackv2方法对AlexNet和VGG-16 Net实现了43.5和49.1倍的压缩率,以及26.2和10.2倍的理论加速比;对于ResNet-50,压缩率为14.0,理论加速比为5.0;对于ResNeXt-50,压缩率为14.3,理论加速比为5,1;以上压缩造成的在imagenet上的top-1 acc损失都在1%左右;

参考链接

腾讯云 - 闲话模型压缩之网络剪枝(Network Pruning)