问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

模型压缩理论简介及剪枝与稀疏化在征程5上的实践

创作时间:
作者:
@小白创作中心

模型压缩理论简介及剪枝与稀疏化在征程5上的实践

引用
1
来源
1.
https://www.cnblogs.com/horizondeveloper/p/18561727

本文主要探讨开源网络剪枝(结构化剪枝与稀疏化置零)技术在地平线征程5芯片上的可行性和有效性。实验结果表明,在不使用数据增强、蒸馏、嫁接等主流且有效提升精度的方法下,结构化剪枝与稀疏化在精度损失较小的情况下,均可以在征程5上提升性能(latency、FPS)。

实验结果解读

表中涉及到结构化剪枝两种(ABCPruner_2020、HRankPlus_2020)、结构化稀疏两种(CHEX_2022、1XN_2022),从实验数据可以看出:

  • 在分类任务中,在不使用数据增强、蒸馏、嫁接等主流且有效提升精度的方法下,结构化剪枝与稀疏化在精度损失较小的情况下,在征程5上均可以提升性能(latency、FPS)。
  • 结构化稀疏比结构化剪枝,精度上表现更好,但性能表现弱于后者。
  • 网络稀疏化应用于轻量型网络结构,如mobilenet,压缩百分比相对较小,精度损失相比resnet较大,侧面说明轻量型网络中冗余结构相对较少。

模型压缩技术概述

模型压缩常用的方案包括量化、蒸馏、紧凑型网络设计以及网络剪枝(稀疏化)。下面分别对这些技术进行简单的介绍。

量化

将网络参数从32位浮点数据映射到更低位数(int16/int8/int4等)的数据,这个过程称之为量化。反之,称之为反量化。

反量化一般没有信息损失,而量化一般会有精度损失。这是由于float32能保存的数值范围比uint8多,因此必定有大量数值无法用uint8表示,只能四舍五入成uint8类型的数值,继而引起量化误差。

量化的可行性依据:神经网络具有良好的鲁棒性,将高精度模型量化到低精度模型,这个过程可以认为是引入了噪声,而模型对噪声相对不敏感,因此量化后的模型也能保持较好的精度。

知识蒸馏

知识蒸馏是一种基于"教师—学生网络"的方法,属于迁移学习的一个分支,教师网络通常是精度更高的大网络,学生网络通常是结构相对简单的小网络。

主要思想:在网络训练期间,将教师网络的输出信息作为监督信号(知识、软标签),用于指导学生网络去模仿教师网络学习到的信息,继而达到提升学生网络精度的目的。

紧凑型网络设计

紧凑型网络设计的原理是不使用传统的计算量较大的卷积方法进行特征提取,而是设计、选用一些计算量更小、特征提取能力较强的特殊卷积方法,例如深度可分离卷积。


传统卷积


深度可分离卷积

在特征提取能力大致相同的情况下,深度可分离卷积的实现方式,参数量大幅减少。紧凑型网络结构的设计需要大量实验驱动,以保证设计出的网络结构在不同应用场景下均有着良好的表现。

网络剪枝与稀疏化

网络剪枝的目的:在保证任务精度的同时,剪枝网络中更多的冗余结构,继而加快模型运行速度。

网络剪枝分为非结构化剪枝和结构化剪枝。非结构化剪枝通过剪枝网络每层的神经元来压缩网络,剪枝某个神经元就是将该神经元的值设置为0,本质上是一种稀疏化的过程。由于其可以通过算法深入到神经元进行剪枝,因此可以获得更高的压缩率。

这种方法可以通过稀疏化存储方式减少内存占用,较大程度上压缩网络存储体积,但并没有减少计算量。同时,这种剪枝方式也会导致不规则的内存访问,影响网络的在线推理效率,需要特殊设计的软硬件进行加速。

与之相对应的是结构化网络剪枝。结构化剪枝是一种移除网络中Vector或kernel或filter的剪枝方法,剪枝后的网络可以使用基础线性代数程序库,是一种软硬件友好型剪枝方式。尽管相对于非结构化剪枝而言,结构化剪枝压缩率较低,但结构化剪枝不仅可以降低模型在设备上的内存占用,还可以真正意义上减少网络的计算量,加速模型推理。

HRankPlus

CVPR 2020, Oral

灵感来自于一个发现:无论CNN接收的图像batch数是多少,由单个滤波器生成的多个特征图的平均秩总是相同的。作者提出一种针对低秩特征图所对应过滤器进行剪枝的算法。

剪枝原理:低秩特征图包含的信息较少。为什么秩可以作为衡量特征图信息丰富度的指标?作者通过两个理论、一个实验来证明。

什么是矩阵的秩(Rank):

一个矩阵可以看作多个列向量的组合,如果一个列向量可以被其它列向量的通过一定的线性运算表达出来,就说这些向量是线性相关的。倘若一组向量相互不能够被表达,那么这组向量就是线性无关。

一个矩阵的rank就是最大线性不相关的向量个数。一个矩阵的秩反应了矩阵所拥有的有效信息量,不相关的向量组合可以看作是有效的信息,而相关的向量可以用这些有效的信息来表达,它是冗余的。

理论1:

对特征图进行奇异值分解,特征图可以分解为包含大部分信息但比原始特征图的秩小一点的矩阵(秩为$r^{'}$的矩阵)和包含小部分额外信息的矩阵。这个过程表明矩阵的秩越高,信息量越大(因为大的可以一直分成小的,所以比小的信息量高)

理论2:

无论CNN看到多少数据,单个过滤器生成的feature map的平均秩总是相同的,这表明,只使用输入图像的一小部分就可以准确地估计CNN中特征图的秩,从而达到高效的目的。

  • x轴:某层多个特征图的indices
  • y轴:第几个batch喂入的数据

实验1:

  • HRank:剪low_rank
  • Edge:low_rank和high_rank都剪
  • Random:随机剪
  • Reverse:剪high_rank

多个输入feature map经过一个filter之后的feature map的平均rank几乎是不变的,这表明输出feature map的秩主要是由filter决定的(由输入feature map和filter共同决定)。

这给了作者启发:通过少量输入(feature map)就可以估算一个filter生成的feature map的秩的大小,这极大程度上减少了网络剪枝的计算开销,因为不用去计算更多的输入数据了。

生成秩的过程中:batch设置为128,使用5个batch来评估CNN卷积层的秩。

首先,将图像输入模型,生成特征图,获取每个特征图的平均秩并对这些秩进行降序排列。

然后,确定各卷积层过滤器的压缩率:经验设置(vgg是layer-by-layer,resnet是block-by-block)

最后,根据计算得到的秩,从filter中筛选出秩高的保留,从而得到剪枝后的模型,微调。

ABCPruner

IJCAI 2020

目前大多数方法是根据经验规则实现通道剪枝:一类是根据规则决定哪些filter(权重)"重要"。另一类是根据经验决定各层剪枝率。

ABCPruner是一种基于人工蜂群(artifical bee colony)算法的通道剪枝方法。目的是有效地找到最佳的剪枝结构,即每一层中的通道数,而不是选择"重要"的channel(启发于19年ICLR上的Rethinking),对最佳剪枝结构的搜索,公式化为一个优化问题,参考ABC算法以搜索策略解决这个问题(启发于18年CVPR上的Amc),减少人为干扰。

对于一个有L层卷积的网络,裁剪的可能性方案有$\prod _{j=1} ^{L} c_j$,这种可能性方案太多,需要进行限制。将每层的裁剪方案限制成十个,具体做法:假设该层的filter数目为c,取10%c,20%c,…,100%c十个数作为该层裁剪的选择空间。总结:将通道组合压缩到一个特定空间。

具体实现过程:

  1. 初始化一个structure set,set中的每个元素表示每层要保留的通道数目(实际上是初始化多个structure set,每个set代表一种剪枝方案)
  2. 根据这个集合对每层进行随机裁剪
  3. 训练少量epochs,测试精度fitness(减少计算资源消耗)
  4. 然后使用ABC来更新structure set
  5. 重复2,3,4
  6. 挑选出最优结构,进行微调

T:表示走多少圈ABC算法
α:保留率上限
n:被剪枝网络集合中的网络个数
ti:计数器
M:某个网络结构M次没变,重新初始化它
C′:被剪枝网络结构
fitC:网络结构C的fitness

1XN Pruning

TPAMI 2022

kernel级别剪枝:剪枝filter中的某个kernel
filter级别剪枝:剪枝filter中的所有kernel(该方案也会剪枝掉下一层filter中的对应kernel)
1XN Pruning:剪枝具有相同输入channel index的连续N个输出kernel(如:连续4个filter中的第1个kernel)

关于如何实现该方案,会涉及到过滤器重排,稀疏矩阵编解码等复杂操作,这里不再进行详述。

注意:

  • 该剪枝方案是一种稀疏化的操作,是将某些kernel全部置零,理论上属于结构化剪枝(稀疏),考虑到维度匹配问题,在网络搭建时,无法控制到内部kernel级别,故无法获取剪枝后的网络,需要支持稀疏化的硬件才能加速。

CHEX

CVPR 2022

在整个训练过程中,通过定期prune channels和regrow channels,降低过早修剪"重要"通道的风险。

  1. 原始模型:Conv-6-8-10,随机初始化子模型结构
  2. Channel pruning stage:根据目标稀疏度,剪枝不重要的channel,每一层的通道数会在这一步使用"sub-model structure exploration technique"进行重新生成,例如,图中step1中的conv-3-4-5,step2中的Conv-2-3-7。
  3. Channel regrowing stage:每一次pruning后,会regrow之前剪枝掉的一部分channel,这些恢复的channel weight,会使用被剪枝前最近一次的weight。
  4. 每进行一次2。3两步(成对出现),会训练一些epoch,这个过程重复N次,得到剪枝后的网络。

注意:

  • 该剪枝方案是一种稀疏化的操作,虽然是将某filter权重全部置零,理论上属于结构化剪枝,但由于剪枝通道位置是不定的,每一层剪枝率也不定,特别是对于具有shortcut的网络,无法获取剪枝后的网络,因此只能是结构化稀疏置零,故需要支持稀疏化的硬件才能加速。

总结和思考

  1. 结构化压缩方案(包括结构化剪枝和稀疏化置零)在地平线征程5上均可以实现加速。
  2. 未来地平线会支持稀疏化训练吗?会有标准的参考文档进行介绍吗?期待中~
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号