一、背景
深度学习让计算机视觉任务的性能到达了一个前所未有的高度。但,复杂模型的同时,带来了高额的存储空间、计算资源消耗,使其很难落实到各个硬件平台。
为了解决这些问题,压缩模型以最大限度地减小模型对于计算空间和时间的消耗。
二、理论基础
必要性:目前主流的网络,如VGG16,参数量1亿3千多万,占用500多MB空间,需要进行300多亿次浮点运算才能完成一次图像识别任务。
可行性:在深度卷积网络中,存在着大量冗余地节点,仅仅只有少部分(5-10%)权值参与着主要的计算,也就是说,仅仅训练小部分的权值参数就可以达到和原来网络相近的性能。
三、目前方法
从数据,模型和硬件多维度的层面来分析,压缩和加速模型的方法
1、压缩已有的网络,包含:张量分解,模型剪枝,模型量化;(针对既有模型)
1.1、张量分解
定义:将网络权值当满秩矩阵,可以用多个低秩矩阵来逼近该矩阵。
目的:降低时间复杂度。
优点:适合模型压缩
缺点:实现并不容易,涉及计算成本高昂的分解操作,且需要大量的重新训练来达到收敛。
对于二维矩阵运算,SVD是个好方法。
SVD分解:
- [2016,Zhang]Accelerating very deep convolutional networks for classification and detection:对参数矩阵进行张量SVD分解进行非线性问题的求解,同时不需要通过随机梯度下降过程进行优化,并在非对称重构中考虑前一网络层的累计重构误差,在不需要随机梯度下降(SGD)的情况下,开发了一种有效的非线性优化问题求解方法
- [2015,Jaderberg,BMVC]Speeding up convolutional neural networks with low rank expansions:使用秩为1(可以分解为行向量与列向量乘积)的卷积核作用在输入图上产生相互独立的M个基本特征图,卷积神经网络大小为k×k 的卷积核分解为1×k 和k×1的卷积核, 然后通过学习到的字典权重利用线性组合重构出输出特征图。
- [2017,Tai]Convolutional neural networks with low-rank regularization. (Princeton University, etc.):提出从零开始训练低秩约束卷积神经网络模型的方法,不仅速度得到提升,而且在一些情况下模型性能也有所提高.作者提出一种低阶张量分解的新算法,用于消除卷积核中的冗余.该算法找 到 矩阵分解 的精神的全局优化器,比迭代方法更有效。
对于多维矩阵运算,涉及到Tensor,主要是CP分解,Tucker分解,Tensor Train分解,Block Term分解。
CP分解:
- [2014,JADERBER]Speeding up convolutional neural networks using fine-tuned CP-decomposition:采用CP分解法将一层网络分解为五层低复杂度的网络层,但在基于随机梯度下降法的模型权重微调过程中难以获取张量分解的优化解.作者利用两个卷积神经网络模 型对该方法进行评估,结果表明该方法以较低的性能损失实现更高的计算速度
- [2014,Denton,NIPS]Exploiting linear structure within convolutional netowrks for efficient evalution:探索多种张量分解方法,例如二维张量分解可采用奇异值分解法,三维张量可转化为二维张量进行分解,以及单色卷积分解和聚类法低秩分解等.作者利用 卷 积 参 数 的冗余性获得 近似计算过程,较大的减少所需的计算量,在保持原始模型浮动1%精度的条件下,基于 CPU和GPU的计算过程均取得近2倍的加速。
1.2、模型剪枝
将权重矩阵中相对不重要的权值剔除,然后再重新精修(finetune)网络进行微调。
1.2.1 广义修剪
1、正则化:修改目标函数,得到一个参数较少的网络,如添加L1Norm在损失函数;
2、修剪:删除冗余的特征和参数
1.2.2 基本流程
1、分析神经元重要程度
2、移除不重要的神经元
3、对网络进行微调
4、重新执行第一步,下一轮迭代
1.2.3 核心问题
1.2.3.1 剪什么?
1、细粒度剪枝:保留模型精度,但依赖硬件设备
2、粗粒度剪枝:模型速度和大小都有效提升,但精度会大幅下降。
1.2.3.2 怎么剪?
1、权重衰减法:属正则化方法
1.2.3.3 什么时候剪?
迭代式剪枝:训练权重----》剪枝-----》训练权重
1.2.4 单个权重(Weight)剪枝——非结构化
任意权重被看作是单个参数并进行随机非结构化剪枝
[2017,Molchanov,ICLR]Pruning Convolutional Neural Networks for Resource Efficient Transfer Learning Inference:从众多的权重参数中选择一个最优的组合(组合优化问题),使得被裁剪的模型的代价函数的损失最小。结合贪婪剪枝和基于反向传播的微调来确保剪枝后的网络的泛化性。提出了一种基于泰勒展开来近似计算去除部分参数后网络的损失函数的变化。
[2017,Wang,ICLR]Training Compressed Fully-Connected Networks with a Density-Diversity Penalty:Density指的是模型参数的冗余度,就是零和极小值的多少;Diversity指的是参数的多样性,即如果参数能够聚类成为少数几个类别,那么就是多样性低,反之就是多样性丰富。实际上论文的目的不是通过加入惩罚项直接训练一个很小的模型,而是通过这么一个惩罚,使得模型在训练时能够尽可能冗余,尽可能多样性低,这样在后续就可以更大程度低剪枝和量化编码。
缺点:
导致网络连接不规整,需要通过稀疏表达来减少内存占用,进而导致在前向传播时,需要大量条件判断和额外空间来标明0或非0参数位置,因此不适合并行计算。
非结构化的稀疏性需要使用专门的软件计算库或者硬件。
1.2.5 核内权重(Intra Kernel Weight)剪枝/核的稀疏化——结构化
对权重的更新加以正则项进行限制,使其更加稀疏,使大部分的权值都为0。
[2016,JIN]Training Skinny Deep Neural Networks with Iterative Hard Thresholding Methods:通过在目标函数中增加参数的L0范数约束,实现模型的稀疏化,但L0范数求解较困难,因此提出一种阶段迭代算法,首先仅更新权值较大的参数,然后恢复所有网络连接,迭代更新所有参数,在训练中可实现模型裁剪
[2017,Anwar,JETC]Structured pruning of deep convolutional neural networks:
1、定义显著性变量并进行贪婪剪枝。
核内定步长粒度,将细粒度剪枝转化为粗粒度剪枝。
全连接或稠密连接:一般作用到同一输入特征图上的Kernel必须采用相同的步长和偏置
卷积层不是稠密连接:作用在不同特征图上的kernel步长与偏置可以不同
2、使用进化粒子滤波器决定网络连接重要性
1.2.6 卷积核(Kernel)/特征图(Feature Map)/通道(Channel/ Filter)剪枝——结构化
定义:减去第i层的filter,进而减去第i层产生的部分特征图和第i+1层的部分kernel。
kernel粒度的显著性度量可以采用kernel的权重和来判断,采用Filter的权重和来判断
[2017,Hu,ICLR]Network Trimming: A Data-Driven Neuron Pruning Approach towards Efficient Deep Architectures:激活值为0的神经元是冗余的,基于统计的方法删除对大部分不同输入都输出零值的单元,并进行交替重新训练。
1.2.7 中间隐层(Layer)剪枝
定义:删除一些层,即改变网络结构
[2017,Rueda,GCRP]Neron Pruning for Compressing Deep Networks using Maxout Architectures:提出一种最大化输出单元将多个神经元合并为更复杂的凸函数表达,并根据各个神经元再训练集上的响应的局部相关性进行选择。
DeepRebirth: A General Approach for Accelerating Deep Neural Network Execution on Mobile Devices:将网络层分为权重层(如卷积层和全连接层)和非权重层(如Pooling层、ReLU层等),非权重层的理论计算量较小,但由于内存数据访问速度等原因,其计算耗时较多,提出将非权重层与权重层进行合并的方法,去除独立的非权重层后,运行时间显著减少 。
1.3、网络量化
一般,神经网络模型的参数都是32bit长度的浮点数表示。很多时侯不需要这么高的精度,可以通过量化,用如用8bit来表示。通过牺牲精度来降低每个权值所需要的空间。SGD所需要的精度仅为6-8bit,合理的量化可保证精度的情况下减小模型的存储体积。根据量化方法不同,可分为2值量化,3值量化,多值量化。
3个问题:如何量化?如何计算梯度?如何保证准确率?
1.3.1、二值量化
将权值矩阵中的单精度浮点数用两个值来表示。一般使用符号函数或加入线性化的符号函数来近似。
[2017,Zhou,ICLR]Incremental network quantization:Towards lossless cnns with low-precision weights:给定任意结构的全精度浮点神经网络模型,能将其转换成无损的低比特二进制模型。增量式网络量化方法,三种独立操作:权重划分、分组量化、再训练。
1.3.2、 三值量化
改进的二值量化,在二值网络函数(-1,+1)的基础上,显式地增加0这个量化值。
2016,Fengfu,CVPR]Ternary weight networks:三值化
1.3.3、 多值量化
使用8big或16bit定点数来表示。
[2016,DETTMERS]8-bit approximations for parallelism in deep learning:开发并测试8bit近似算法,将32bit的梯度和激活值压缩到8bit,通过 GPU集群测试模型和数据的并行化性能,在保证模型预测精度的条件下,提出的方法取得两倍的数据传输加速。
2、构建新的小型网络,包含:知识蒸馏,紧凑网络设计;(针对新模型)
2.1、迁移学习/知识蒸馏
- 迁移学习:将一个模型的性能迁移到另一个模型上
- 网络精馏:在同一个域上迁移学习的一种特例
采用预训练好的复杂模型的输出作为监督信号去训练另外一个简单的网络。
2017,Romero,ICLR]Hints for the deep nets:设计了更深的更窄的学生模型,同时保证两者的网络参数相同,采用Hints方式。
2.2、紧凑网络设计
1、MobileNet系列:采用深度可分离卷积来构建卷积。
Efficient Convolutional Neural Networks for Mobile Vision Applications:借鉴factorized convolution的思想,将普通卷积操作分成两部分
- Depthwise Convolution:每个卷积核滤波器只针对特定的输入通道进行卷积操作
- Pointwise Convolution:采用1x1大小的卷积核将depthwise convolution层的多通道输出进行结合
2、ShuffleNet:
ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices:基于MobileNet的group思想,将卷积操作限制到特定的输入通道。而与之不同的是,ShuffleNet将输入的group进行打散,从而保证每个卷积核的感受野能够分散到不同group的输入中,增加了模型的学习能力。
3、SqueezeNet:
[2016,Iandola,]SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size
- 将3x3卷积核替换为1x1卷积核(1个1x1卷积核的参数是3x3卷积核参数的1/9,这一改动理论上可以将模型尺寸压缩9倍)
- 减小输入到3x3卷积核的输入通道数
- 尽可能的将降采样放在网络后面的层中
- 借鉴ResNet思想,对原始网络结构做了修改,增加了旁路分支,将分类精度提升了约3%。
- 作者提出了一个类似inception的网络单元结构,取名为fire module。一个fire module 包含一个squeeze 卷积层(只包含1x1卷积核)和一个expand卷积层(包含1x1和3x3卷积核)。其中,squeeze层借鉴了inception的思想,利用1x1卷积核来降低输入到expand层中3x3卷积核的输入通道数。
3、计算加速(针对硬件)
Faster CNNs with direct sparse convolutions and guided pruning:提出一种基于向量形式的乘法,实现密集矩阵与稀疏矩阵之间的高效乘法运算。
[2017,ICML]MEC: Memory-efficient Convolution for Deep Neural Network:内存利用率高且速度较快的卷积计算方法
4、对数据进行变换(针对数据源)
WAE-Learning a Wavelet-like Auto-Encoder to Accelerate Deep Neural Networks:WAE借助小波分解得思想,将原图分解成两个低分辨率图像,以达到网络加速的目。
参考链接:
1、https://blog.csdn.net/wspba/article/details/75671573
2、https://blog.csdn.net/qiu931110/article/details/80189905
3、https://blog.csdn.net/shentanyue/article/details/83508497