一、背景
深度学习让计算机视觉任务的性能到达了一个前所未有的高度。但,复杂模型的同时,带来了高额的存储空间、计算资源消耗,使其很难落实到各个硬件平台。
为了解决这些问题,压缩模型以最大限度地减小模型对于计算空间和时间的消耗。
二、理论基础
必要性:目前主流的网络,如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.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系列:采用深度可分离卷积来构建卷积。
2、ShuffleNet:
3、SqueezeNet
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借助小波分解得思想,将原图分解成两个低分辨率图像,以达到网络加速的目。
原文地址:https://www.cnblogs.com/jimchen1218/p/11957885.html