今天调研了神经网络剪枝相关的技术。
20200402
调研主要分为以下三部分:
为什么要剪枝?
剪枝的具体算法?
剪枝后如何评估?(不同剪枝的泛化性等)
一、神经网络压缩技术
当前的模型压缩方法主要有6类:网络剪枝、参数共享、量化、网络分解、网络蒸馏、紧凑网络设计。
1.网络剪枝
网络剪枝使用的比较广泛,将会在section II 进行介绍。
2.参数共享
主要思想是让网络中多个参数共享同一值,但具体实现方式不同。如利用k均值聚类、低秩分解、权重采样等。但可能会因为过分追求模型压缩比导致模型精度的下降。
3.量化
量化:降低权重所需要的比特数来压缩原始网络,主要包括低精度和重编码两类方法。如低精度就是用更低位数的浮点数或整型数表示权重参数进行训练、测试或存储;重编码则是对原始数据进行重编码,采用更少的位数对原有数据进行表示,代表有二值化权重/二值化神经网络。
牧田对于图像分类许多量化技术都可达到无损压缩;但进行较为复杂的如分割任务时使用量化通常会对模型精度带来巨大影响。
4.网络分解
网络分解主要将矩阵二维张量进行奇异值分解,推广到三维卷积核使用多个一维张量外积求和逼近来减少网络推断的时间。
5.网络蒸馏
网络蒸馏又叫知识蒸馏,目的是将教师模型学到的知识转化到学生模型中。比如将教师模型的softmax层作为学生模型的监督;但有些任务中直接使用教师模型的输出对学生模型进行监督会比较困难,因此可参考将教师模型的中间层输出作为对学生模型的中级监督信息等。
但知识蒸馏目前主要应用在分类任务中,对更加复杂的检测、分割任务还应用的较少;而且学生模型的设计缺少重要指导信息会导致学生模型较难训练成功。这些都导致知识蒸馏方法还无法成为模型压缩的主流方法。
6.轻量级网络设计
前述方法主要对已训练好的网络进行压缩,紧凑网络设计则旨在设计更加精简有效的网络。大致分为两大方向:紧凑卷积结构和网络结构搜索。
紧凑卷积结构:SqueezeNet,MobileNet,ShffleNet等轻量级网络系列,致力于设计出更加精简有效的网络;
网络结构搜索:Neural Architecture Search,NAS神经网络结构搜索的不同之处在于,传统的网络模型及参数均为人工设计,往往导致设计出的模型并非最优。NAS则通过搜索方法寻找最优的神经网络架构,一旦此类方法成熟,将很适合工业界应用;但目前NAS还有待发展,使用神经网络结构搜索需要很大的硬件和时间消耗。如何使用更少的资源、花费更少的时间来搜索出想要的网络是今后的重要目标。
二、神经网络剪枝技术
1.剪枝:在网络训练过程中寻求一种评判机制,剔除掉不重要的连接、节点甚至卷积核,达到精简网络结构的目的。很多实验表明卷积层到全连接层存在大量冗余参数,大多是神经元被激活后的输出值区域0,即使将这些神经元剔除也能够表达出模型特征。
2.剪枝的好处
(1)训练时间少。随着计算量的减少,网络中连接每次迭代的速度得到提升,网络模型可以更快的收敛到最优解。
(2)运行速度快。稀疏化后的网络卷积层数、卷积层中的卷积核个数都更少,更简单更轻便的模型意味着更高效、快速的权重更新。
(3)更可行的嵌入式部署。剪枝后的网络在移动设备及其他嵌入式设备上的应用提供了更广泛的可能。
3.剪枝有两类:
训练中约束:损失函数添加约束项诱导网络稀疏化 无需重训练
训练后剪枝:剔除网络中相对冗余、不重要的部分。根据剪枝粒度,有层间剪枝、特征图剪枝分别降低网络深度和宽度;细粒度的有核内剪枝。
4.从剪枝粒度可以分为:
单个权重剪枝(weight)
核内权重剪枝(intra kernel weight)
卷积核剪枝(kernel)
通道剪枝(channel/feature map/filter)
隐层剪枝(Layer)
其中单个权重剪枝属于非结构化剪枝,将会使得所有曾变为系数分布。这将会导致3个问题:仅对部分参数进行减值并不能显著降低计算量和参数量;剪枝部分参数将会得到系数网络,但目前对稀疏操作加速支持的库非常有限;得到的稀疏数据结构将会需要额外存储开销尤其对于低精度权重。
因此需要进行结构化剪枝(Anwar):结构化剪枝对整个卷积核或者通道进行剪枝从而没有破坏原有的卷积结构,更适合在通用的硬件上使用。与非结构化剪枝的区别在于是一个卷积核所有权重的绝对值之和。
提出核内定步长粒度将细粒度剪枝转化为粗粒度剪枝(如通道剪枝或卷积核剪枝)核心思想是作为在同一输入特征图上的卷积核必须采用相同的步长和偏置,作用在不同特征图上的卷积核步长与偏置可以不同。
卷积核剪枝和通道剪枝都属于粗粒度剪枝,剪枝后模型使用现有硬件与计算库即可进行训练,并且最终可以获得更高的压缩率与更短计算时间。(特征图与卷积核具对应关系,减去某特征图的同时与其相连的卷积核也将被一起移除)
5.这就涉及到一个问题:如何确定网络中哪些参数是冗余的?目前没有明确准则来解决此问题,只能通过反复试验来确定。
结构化剪枝vs非结构化剪枝
结构化剪枝:根据人为定义的条件,通过计算后裁减掉低于每个阈值的卷积核、连接或特征图中的某通道已达到模型压缩的目的。
非结构化剪枝:采用随机方式剪枝网络,前面已经说过这种裁剪方式不利于实现底层加速
具体方法:网络剪枝与稀疏化、张量分解、知识迁移和精细模块设计。
网络剪枝在提出网络中冗余的连接或神经元有可能会导致非结构化风险,这种Irregular的数据反而会不利于计算机的读取,阻碍模型的部署和网络进一步的加速。
另一方面存在的问题是评价体系的构建,主要聚焦于:准确率、运行时间、模型大小等构建的评估体系。为了更加全面有必要将乘累加次数、推断时间、数据吞吐量、硬件能耗等指标纳入评价体系。
三、Pruning Algorithm
1.随机剪枝:采用随机删除的方式进行网络剪枝。这种方法虽然一定程度上减小了网络模型的复杂度,但没有根据的丢弃神经元可能删除掉贡献度较高的神经元。从而导致两种后果:
(1)为了恢复网络模型的性能需要迭代更多次以产生其他神经元代替被删除的重要神经元的功能
(2)多次迭代后也无法恢复/替代原有神经元的功能,导致模型精度损失
非结构性、按照设定阈值,但计算效率低
2.SR算法:稀疏/抑制(Sparse/Restrain)优化训练方法时通过对网络模型中不同连接的重要性进行判断,随后对网络进行有针对性的剪枝,同时抑制权重较大连接的变化速度,以达到降低网络训练成本的目的。->DSD(SongHan,2017)
稀疏:
大端剪枝:删除网络中绝对值最大的部分连接
小端剪枝:删除网络中绝对值最小的部分连接
通过观察删除不同绝对值的连接后网络模型的正确率来判断不同绝对值权重对模型性能的影响程度。(绝对值较大的参数对网络模型的影响程度较大)
抑制:对网络中贡献度较大的连接的更新幅度加以控制,即反向传播中乘以已知稀疏,抑制系数的大小与连接的贡献度成反比。
3.基于梯度的剪枝:
基于权值剪枝本身缺乏理论依据,某些权重很小的神经元却对模型很重要,如人脸识别中眼睛颜色、大小、形状的细微变化却对识别结果有很大影响。梯度是计算损失函数对权值的偏导数,反映了损失对权值的敏感程度,可以作为评判权值重要性的理论依据。
即计算每一层的梯度矩阵,根据设定的阈值将梯度矩阵中绝对值低于阈值的进行裁剪。这种方法显示在FC层有较好的效果,在卷积层应用会导致正确率的部分下降。
4.主动逐步裁剪方法:ASP,Active Stepwise Pruning.使用Log函数控制整个裁剪过程,完成网络模型的主动逐步裁剪。看下来修剪的是卷积核
四、评估-泛化性
最好在大型通用数据集上测试,如ImageNet,CIFAR,SVHN等
测试不同剪枝率对模型准确率的影响
另一方面存在的问题是评价体系的构建,主要聚焦于:准确率、运行时间、模型大小等构建的评估体系。为了更加全面有必要将乘累加次数、推断时间、数据吞吐量、硬件能耗等指标纳入评价体系。
1.文献8研究训练集和测试集有差异时神经网络表现出的泛化能力,图片进行遮挡。实验结论:剪枝操作中dropout率下调会给模型带来负面影响