机器心脏释放
来源:百度飞桨
从剪枝和量化到轻量级神经网络架构搜索和自动模型压缩,日益强大的paddle PaddleSlim为模型瘦身提供了一系列高效的工具。近年来,深度学习技术在多个方向取得了巨大成功。然而,由于深度神经网络计算复杂度高,模型参数量大,其在一些场景和设备中的部署受到限制,尤其是在移动嵌入式设备中。因此,模型小型化技术成为近年来学术界和工业界的研究热点。模型小型化技术也从最初的网络剪枝、知识提炼和参数量化发展到最新的神经网络架构搜索(NAS)和自动模型压缩技术。
螺旋桨的核心框架Paddle Fluid v1.5和PaddleSlim也发布了最新升级,增加了对基于模拟退火的自动切割策略和轻量模型结构(Light-NAS)自动搜索功能的支持。
PaddleSlim简介
PaddleSlim是百度Paddle和视觉技术部发布的模型压缩工具库。它不仅支持传统的网络剪枝、参数量化和知识提炼方法,还支持最新的神经网络结构搜索和自动模型压缩技术。
PaddleSlim工具库的特点
简单界面
可配置参数通过配置文件集中管理,便于实验管理。在常见的模型训练脚本上,添加一点代码就可以达到模型的压缩效果。
对于冗余信息较少的MobileNetV1和MobileNetV2模型,卷积核切割工具和自动网络结构搜索工具仍然可以降低模型规模,保持精度损失尽可能小。蒸馏策略可以明显提高原模型的精度。定量训练和提取相结合,可以在降低模型规模的同时提高模型精度。与传统的RL方法相比,网络搜索工具的速度提高了数倍。更加强大和灵活。
自动切割过程切割压缩策略支持更多的网络结构。蒸馏支持多种方式,用户可以自定义组合。loss支持多种压缩策略的快速配置。组合使用PaddleSlim刀具库的函数列表。
模型剪辑
它支持均匀剪枝、基于敏感度的剪枝和基于进化算法的自动剪枝。支持VGG、ResNet、MobileNet等多种类型的网络,支持用户自定义剪枝范围量化训练。
动态策略:支持动态和静态两种量化训练方法,在推理过程中动态统计激活的量化参数。在推理过程中,静态策略3360对不同的输入采用来自训练数据的相同量化参数。支持权重的全局量化和逐通道量化,模型提取以与Paddle Mobile兼容的格式保存。
在教师网络和学生网络的任意层添加组合损失,FSP损失,L2损失,带交叉熵损失的softmax,自动搜索轻量级神经网络结构。
百度自研Light-NAS自动模型压缩支持的基于模拟退火的轻量级模型结构自动搜索
支持其他基于模拟退火的自动网络剪枝功能。
支持profile管理,压缩任务超参数,支持多种压缩策略,使用PaddleSlim应用效果。
经典压缩基准测试
轻型NAS性能指标评测
百度业务的应用效果
轻量模型搜索的详细说明
1.自动网络结构搜索
网络结构的质量对最终模型的效果有着非常重要的影响。高效的网络结构可以用较少的计算量获得较高的精度增益,如MobileNet、ShuffleNet等。但是人工设计网络需要大量的经验和无数次的尝试,很多超参数和网络结构参数会产生爆炸性的组合,所以常规的随机搜索几乎不可行。因此,近年来,神经网络架构搜索技术已经成为研究热点。
与传统NAS不同的是,我们专注于具有高搜索精度和高速度的模型结构,我们统称之为Light-NAS。网络搜索的关键要素通常包括搜索策略,
搜索策略搜索策略定义了使用哪种算法可以快速准确地找到网络结构参数的最优配置。常见的搜索方法包括强化学习、贝叶斯优化、进化算法、基于梯度的算法等。
在早期的NAS方法中,强化学习被广泛使用。强化学习(RL)是机器学习的一个领域,强调如何根据环境采取行动,使预期收益最大化。强化学习是一个非常有趣的范式。几乎只要能提取出强化学习的四个要素,就能通过强化学习解决原问题。
《具有强化学习的神经架构搜索》一文将架构的生成视为智能体对动作的选择,回报是在训练集上训练一定历元后的精度。在具体实现过程中,用RNN作为控制器来表示策略函数,每次通过RNN生成一串代码,通过映射函数将代码映射到网络结构中,利用策略梯度来优化RNN控制器的参数,如图1所示。
图1
强化策略计算复杂且耗时,因此PaddleSlim选择经典的组合优化策略来模拟退火。模拟退火算法来源于固体退火的原理。固体被加热到足够高的温度,然后慢慢冷却。加热时,固体内部粒子随温度升高变得无序,内能增加。当缓慢冷却时,粒子逐渐变得有序,在各个温度下达到平衡态,最后在室温下达到基态,内能降到最低。鉴于物理学中固体物质的退火过程与一般组合优化问题的相似性,我们用它来搜索网络结构。
在PaddleSlim的NAS任务中,采用了百度自研的基于模拟退火的搜索策略,不同于RL每次都要重建一个完整的网络。我们把网络结构映射成一段代码,第一次随机初始化,然后每次随机修改一部分代码(对应于网络结构的一部分)生成一个新的代码,再把这个代码映射回网络结构。奖励是通过在训练集上训练一定精度的历元和网络时延融合来引导退火算法的收敛,如图2所示。
图2
与一般的网络搜索技术相比,搜索目标评估方法不仅要考虑模型的准确性,还要考虑模型向模型小型化方向的运行效率。论文《MnasNet》以模型的准确性和在手机上的运行时间作为最终奖励。
由于每次在手机上运行网络时延是非常繁琐和耗时的,论文“ChamNet”提出将网络结构分解成若干个穷举的OP,在手机上运行每个OP得到时延并建立查找表LUT,这样通过查表和每次累加每个OP的时间就可以快速得到模型的整体运行时间。PaddleSlim也在开发相关功能,即将开源,敬请期待。
搜索空间定义了优化问题的变量,变量的规模决定了搜索算法的难度和搜索时间。因此,为了加快搜索速度,定义一个合理的搜索空间是非常重要的。因为早期NAS的搜索空间没有限制,甚至需要800个GPU训练一个月才能收敛。
为了加快收敛速度,论文《可扩展图像识别的学习可转移建筑物》将网络划分为若干个法向单元和归约单元,只搜索这两个子模块中的拓扑结构,然后手动叠加成最终的网络结构,如图3所示。
图3
在模型小型化的方向上,为了使搜索到的结构尽可能高效,PaddleSlim参考了MobileNetV2中的线性瓶颈和倒残基结构,在每个倒残基中搜索具体的参数,包括kernelsize、通道扩展倍数、重复次数和通道数,如图4所示。
图4
搜索速度优化最后,在搜索速度优化中,为了减少采样的网络训练时间,一般采用提前终止的策略,只训练少量的历元,以获得它们在验证集上的准确率作为奖励。
最近的一些文章考虑使用参数共享的方案,例如论文“通过参数共享的高效神经架构搜索”来共享OP的参数和搜索拓扑。另外,论文《DARTS :可微架构搜索》基于可微搜索空间的方案也能加快搜索速度,如图5所示,但不能搜索通道数,限制了高效的网络结构设计。PaddleSlim也在探索这个方向。
图5
2.自动模型压缩
与NAS相比,自动模型压缩不是一个从无到有的过程,而是在一个已有模型(经过训练)的基础上进行压缩切割,可以保证精度,快速获得更快更小的模型。目前传统的手工压缩方法如剪枝、量化、提取等,一方面需要用户了解算法原理和实现细节,另一方面在使用时有大量繁琐的参数调整工作,尤其是对于模型剪枝,不同任务的最优参数差异很大。因此,用机器代替人工自动搜索出最合适的参数是非常重要的。
在众多压缩加速方法中,通道剪枝被证明是非常有效的,并在实际业务中得到广泛应用。经过通道剪枝压缩后,该模型不仅在规模上有利可图,而且可以不依赖于专门的预测库进行加速。然而,由于神经网络中不同层的容许度不同,以及不同层之间的相互依赖关系,确定每层的压缩比是非常困难的。论文《用于移动设备上模型压缩和加速的AMC 3360 AUML》提出使用强化学习来搜索各层的最优剪枝比。
搜索策略采用基于行动者-批评家体系结构的DDPG算法。从网络的第一层,行动者网络输入相关参数(输入_大小、内核_大小、过滤器_数量、步幅、flops等。)的剪枝率,并输出一个连续值(0~0.8)来表示该层直到模型最后一层的剪枝率。然后根据输出压缩比对网络进行切割,并在验证集上测试切割模型,得到切割网络精度作为奖励,指导ddpg收敛。整个过程如图6所示。
图6
PaddleSlim基于模拟退火算法实现类似功能,搜索速度明显提高。在具体实现方法中,我们将网络的压缩比编码成一个向量,向量中的每一维代表某一层的压缩比(取值范围为0~0.8)。初始状态下,随机生成一个向量,然后用向量中的压缩比切割整个网络。和强化学习一样,我们在验证集上测试切割网络,得到切割网络的精度,用延迟估计器得到切割网络的速度,然后融合延迟和精度。
每次结束时,我们会随机改变向量的一维(或多维)得到一个新的网络裁剪率,根据这个新的向量裁剪网络并得到奖励,根据当前奖励与前一个奖励的关系引导退火算法收敛。
类似于剪枝,在参数化量化的方向上,论文《HAQ :硬件感知自动量化》搜索每层最佳量化位宽的整体量化收益。整个框架类似于搜索修剪,如图7所示。
图7
PaddleSlim将来也会支持类似的功能。
经典模型压缩技术详解
PaddleSlim不仅支持新增加的基于模拟退火的自动剪切策略和轻量级模型结构(Light-NAS)的自动搜索功能,还支持以前版本中的经典模型压缩技术,如网络剪枝、参数量化和模型提取。
首先,修剪
网络剪枝就是去掉训练好的模型中允许的参数,从而减少模型参数和计算量。在众多剪枝方法中,根据剪枝后的参数是否具有结构化信息,可以分为细粒度剪枝和结构化剪枝。
1.细粒度修剪
细粒度修剪主要用于压缩模型的大小。韩松在论文中提出的著名方法【深度压缩3360用剪枝、训练量化、哈夫曼编码压缩深度神经网络】主要包括剪枝、量化、哈夫曼编码三个步骤。
具体思路是网络中权重越接近0的神经元对网络的贡献越小。剪枝的过程是将每层神经元的权重按照绝对值排序,按照一定的比例剪掉最小的部分,这样这些神经元就不会被激活。为了保证剪枝后网络的精度损失尽可能小,每次剪枝后都会对预留的非零权值进行微调,最终将模型规模缩小9~13倍。
为了进一步压缩模型的大小,对于剪枝后的稀疏神经元,通过量化编码将连续权值离散化,使浮点权值以较少的比特存储,如图8所示。最后通过霍夫曼编码进一步压缩模型大小,最终模型大小可以压缩35到49倍而不损失精度。
细粒度剪枝可以实现高压缩比,但稀疏权重没有结构化信息。如果不依赖于特定预测库或硬件的优化,模型在实际运行中无法加速,占用的内存与压缩前相同。因此,目前使用的细粒度剪枝方法相对较少,因此PaddleSlim中尚不支持。
图8
2.结构化剪枝
相比于细粒度剪枝随机切出网络中的一些神经元,结构化剪枝以某个结构为单位,比如在卷积层切出一些滤波器,如图9所示。与原模型相比,裁剪后的模型只有较少的通道,因此不需要额外的预测库支持就可以达到加速的目的。所以目前广泛使用的是结构化剪枝,也是PaddleSlim支持的剪枝方案。
图9
在剪枝过程中,如何确定每一层的最优剪枝比例和具体要修剪的滤波器,以达到整个模型的最优压缩比,是该方法要解决的问题。至于选择哪些过滤器进行修剪,常规方案类似于细粒度修剪。对不同滤波器的参数计算l1_norm,选择取值较小的滤波器进行剪枝。
对于各层切割的比例,常规的方法是网络中各层使用相同的比例,不考虑模型中不同层的参数容许度的差异。
《高效网络的剪枝过滤器》一文提出了一种基于灵敏度的剪枝策略。剪枝率由不同层对剪枝的敏感度决定。以不同的剪枝比例对层进行剪枝,计算每层的敏感度,并评估剪枝后模型在验证集上的精度损失。对于剪枝比例较大但精度损失较小的层,认为其敏感度越低,可以剪枝的比例越大,如图9所示。
由于剪枝后在验证集上的评估代价比较高,所以这种方法在计算灵敏度时,一次只剪枝一层,没有考虑不同层之间的相关性,所以实际的灵敏度不是很准确。
图10
第二,量化
许多嵌入式芯片设计有不同位宽的乘法器。通过将神经网络中的32位全精度数据处理成8位或16位定点,结合硬件规定的乘法规则,可以实现低内存带宽、低功耗、低计算资源占用和低模型存储要求。
1.8位量化
图11
低精度定点运算的硬件面积和能耗比高精度浮点运算小几个数量级,如图11所示。使用8-8位定点量化可以带来4倍的模型压缩,4倍的内存带宽提升,更高效的缓存利用(内存访问是很多硬件设备的主要能耗)。此外,计算速度通常会提高2~3倍。此外,在许多情况下,定点量化操作不会导致精度损失。
目前,量化方法主要分为两类:训练后量化和量化感知训练。训练后量化是指利用KL散度、移动平均等方法确定量化参数,量化过程不需要再训练。
量化感知训练是对量化后的模型进行微调,通过量化后的模型产生的梯度来更新模型参数,以恢复量化带来的精度损失。与训练后量化相比,它可以提供更高的预测精度。PaddleSlim实现了量化感知训练的量化。
2.二元神经网络
为了进一步降低网络的计算复杂度,在8-8位量化的基础上,论文“binary connect :在传播过程中用二进制权重训练深度神经网络”和“binary net 3360用权重训练深度神经网络”以及激活约束为1或1分别提出了二进制权重网络和二进制神经网络的概念。
二进制权重网络将网络的权重量化为1和-1,在预测过程中不量化激活值。一方面,权重可以用较低的位数(1bit)存储,达到压缩模型大小的目的;另一方面,可以用加法代替原来网络计算中的浮点运算,达到提速的目的。
因为计算机底层硬件在两个N位宽的数据相乘时必须完成2*n位宽的逻辑单元处理,而相同的数据相加时只需要N位宽的逻辑单元处理,所以理论上加速比可以是2倍。
二值神经网络是在二值权值网络的基础上,还对网络中间的激活值进行二进制量化,使网络中所有参与运算的数据都量化为1和-1数。权值和激活值均二值化后,原32位浮点数的乘加运算可以通过一次异或运算和一次popcnt(人口计数计数多少位为1)运算解决,大大减少了计算量,从而实现加速。
但大量实验表明,二进制权值网络和二进制神经网络的适应性不是很强,在很多任务中准确性损失较大,对硬件和预测库优化的要求比较高。所以这些方法目前都不是很流行,所以PaddleSlim暂时还不支持。
第四,知识的升华
一般模型参数越多,结构越复杂,性能越好,但允许的参数越多,计算和资源消耗也越多。知识提炼就是从复杂的网络中提取有用的信息,迁移到更小的网络中,达到模型压缩的效果。
1.传统方案
知识升华是由Hinton在2015年首次提出的。核心思想是用一个或多个训练有素的老师(大模特)来指导学生(小模特)训练。在《区分一个神经网络中的知识》一文中,对于分类任务中要学习的目标,一张图片的实际类别概率信息称为硬目标(只有对应真实类别的概率为1,其他为0),而模型输出的类别概率信息称为软目标(每个类别概率为大于0的值)。
由于类别之间的相关性,软目标比硬目标具有更高的信息熵,例如一只猫的图片。在软目标中,得到狗的概率一般大于得到车的概率,而不是在硬目标中把它们都设为0,导致没有区别。
用大模型代替硬目标生成软目标,可以获得更多的信息和更小的梯度方差,取得更好的性能。一般模型提炼的过程是这样的:首先训练一个大模型,然后让小模型拟合大模型生成的软目标。在提取之后,实际的标签信息通常将用于微调,如图12所示。
图12
另外,为了平滑软目标中各个类别的概率值,本文还引入了温度系数T的概念来平滑大模型输出的概率值,如下式所示。
一般t设置为大于1的数,值越大,输出概率值越平滑。
2.fsp方案
与传统的用小模型直接拟合大模型产生的软目标的蒸馏方法相比,论文《来自知识蒸馏的礼物3360快速优化、网络最小化和迁移学习》使用小模型来拟合大模型不同层的特征之间的求解过程的流程,并使用FSP矩阵(特征的内积)来表示不同层的特征之间的关系。计算公式如下:
在大模型和小模型的不同层之间分别获得多个FSP矩阵。对于Resnet网络结构,每一级可以生成一个FSP矩阵,然后用L2损失使小模型对应层的FSP矩阵和大模型对应层的FSP矩阵尽可能一致。
整个过程如图13所示。
图13
这种方法的优点,通俗的解释就是,比如说,把蒸馏比作老师(大模型)教学生(小模型)解决问题。传统的蒸馏是直接把问题的答案告诉小模型,让小模型学习。学习FSP矩阵是小模型学习解决问题的中间过程和方法,因此可以学习更多的信息,达到更好的最终结果。
项目地址:https://github.com/PaddlePaddle/models/tree/v1.5/PaddleSlim? fr=jqzx
要下载最新版本的桨液v1.5,请点击阅读原文或查看以下链接:
http://www.paddlepaddle.org.cn?fr=jqzx