【嵌入式AI】CNN模型压缩(剪枝,量化)详解与tensorflow实验

【嵌⼊式AI】CNN模型压缩剪枝,量化)详解与tensorflow
实验
1,CNN模型压缩综述
1 模型压缩的必要性及可⾏性
(1)必要性:⾸先是资源受限,其次在许多⽹络结构中,如VGG-16⽹络,参数数量1亿3千多万,占⽤500MB空间,需要进⾏309亿次浮点运算才能完成⼀次图像识别任务;
(2)可⾏性:模型的参数在⼀定程度上能够表达其复杂性,相关研究表明,并不是所有的参数都在模型中发挥作⽤,部分参数作⽤有限、表达冗余,甚⾄会降低模型的性能。论⽂提出,很多的深度神经⽹络仅仅使⽤很少⼀部分(5%)权值就⾜以预测剩余的权值。该论⽂还提出这些剩下的权值甚⾄可以直接不⽤被学习。也就是说,仅仅训练⼀⼩部分原来的权值参数就有可能达到和原来⽹络相近甚⾄超过原来⽹络的性能;
(3)最终⽬的:最⼤程度的减⼩模型复杂度,减少模型存储需要的空间,也致⼒于加速模型的训练和推测。
2 常见模型压缩⽅法
⽬前模型压缩⽅法主要分为五⼤类:⽹络剪枝(network pruning)、⽹络量化(network quantization)、知识蒸馏(knowledge distillation)、低秩近似(low-rank Approximation)和紧凑⽹络设计(compact Network design),⽽这些⽅法⼜可分为前端压缩和后端压缩。
表1 前端压缩和后端压缩对⽐
对⽐项⽬前端压缩后端压缩
含义不会改变原始⽹络结构的压缩
技术
会⼤程度上改变原始⽹络结构的
压缩技术
主要⽅法知识蒸馏、紧凑的模型结构设
计、滤波器层⾯的剪枝
低秩近似、未加限制的剪枝、参
数量化、⼆值⽹络
实现难度较简单较难
赵铭胸围是否可逆可逆不可逆
成熟应⽤剪枝低秩近似、参数量化
待发展应
知识蒸馏⼆值⽹络
2.1 ⽹络剪枝
2.1.1 ⽹络剪枝分类
深度学习模型因其稀疏性,可以被裁剪为结构精简的⽹络模型,具体包括结构性剪枝与⾮结构性剪枝。
表2 结构性剪枝与⾮结构性剪枝对⽐
事项特点举例
⾮结构化剪枝通常是连接级、细粒
度的剪枝⽅法,精度
相对较⾼,但依赖于
特定算法库或硬件平
台的⽀持;
1)Deep Compression;
2)Sparse-Winograd算法等;
台的⽀持;
结构化剪枝是filter级或layer
级、粗粒度的剪枝⽅
法,精度相对较低,
但剪枝策略更为有
效,不需要特定算法
库或硬件平台
的⽀持,能够直接在
成熟深度学习框架上
运⾏。
1)局部⽅式的、通过layer by layer⽅式
的、最⼩化输出FM重建误差的
ChannelPruning, ThiNet,
Discrimination-aware Channel Pruning
等;
2)全局⽅式的、通过训练期间对BN层
Gamma系数施加L1正则约束的Network
Slimming;
3)全局⽅式的、按Taylor准则对Filter作
重要性排序的Neuron Pruning;
4)全局⽅式的、可动态重新更新pruned
filters参数的剪枝⽅法。
如果按剪枝粒度分,从粗到细,可分为中间隐含层剪枝、通道剪枝、卷积核剪枝、核内剪枝、单个权重剪枝。下⾯按照剪枝粒度的分类从粗
(左)到细(右)。
表3 按剪枝粒度分类
事项特点
单个权重粒
度早期Le Cun提出的OBD(optimal brain damage)将⽹络中的任意权重参数都看作单个参数,能够有效地提⾼预测准确率,却不能减⼩运⾏时间;同时,剪枝代价过⾼,只适⽤于⼩⽹络;
核内权重粒
度⽹络中的任意权重被看作是单个参数并进⾏随机⾮结构化剪枝,该粒度的剪枝导致⽹络连接不规整,
需要通过稀疏表达来减少内存占⽤,进⽽导致在前向传播预测时,需要⼤量的条件判断和额外空间来标明零或⾮零参数的位置,因此不适⽤于并⾏计算;
卷积核粒度与同道粒度卷积核粒度与通道粒度属于粗粒度剪枝,不依赖任何稀疏卷积计算库及专⽤硬件;同时,能够在获得⾼压缩率的同时⼤量减⼩测试阶段的计算时间。
从剪枝⽬标上分类,可分为减少参数/⽹络复杂度、减少过拟合/增加泛化能⼒/提⾼准确率、减⼩部署运⾏时间/提⾼⽹络效率及减⼩训练时间等。
2.2 模型量化
2.2.1 参数量化
神经⽹络的参数类型⼀般是32位浮点型,使⽤较⼩的精度代替32位所表⽰的精度。或者是将多个权重映射到同⼀数值,权重共享。量化其实是⼀种权值共享的策略。量化后的权值张量是⼀个⾼度稀疏的有很多共享权值的矩阵,对⾮零参数,我们还可以进⾏定点压缩,以获得更⾼的压缩率。6⽐特或者8⽐特的数据已经⾜够保证测试的准确率,⽬前⼯业界对于8位整型或者16位半精度浮点数量化技术已经成熟,⽐如TensorFlow-lite和Nvidia的TensorRT均已经⽀持8位整型数据的⽹络训练以及存储。
(1)优点:模型性能损失很⼩,⼤⼩减少8-16倍;
(2)缺点:1)压缩率⼤时,性能显著下降;2)依赖专门的运⾏库,通⽤性较差。
2.2.2 ⼆值⽹络
相对参数量化更为极致,对于32bit浮点型数⽤1bit⼆进制数-1或者1表⽰,可⼤⼤减⼩模型尺⼨。
(1)优点:⽹络体积⼩,运算速度快,有时可避免部分⽹络的overfitting;
(2)缺点:1)⼆值神经⽹络损失的信息相对于浮点精度是⾮常⼤;2)粗糙的⼆值化近似导致训练时模型收敛速度⾮常慢;
(3)经典⼆值⽹络:XNORnet, ABCnet with Multiple Binary Bases, Bin-net with High-Order Residual Quantization, Bi-Real Net 等。
脉管舒2.2.3 三值⽹络
在⼆值⽹络符号函数(+1,-1)的基础上,认为需要显式地增加0这个量化值,使⽤ternary connect,反传的时候也加⼊了量化,认为3-4bits⾜够替代原⽹络精度。
(1)优点:相对于⼆值神经⽹络,三值神经⽹络(Ternary Weight Networks)在同样的模型结构下可以
达到成百上千倍的表达能⼒提升;并且,在计算时间复杂度上,三元⽹络和⼆元⽹络的计算复杂度是⼀样的。三元神经⽹络模型能够在保证计算复杂度很低的情况下⼤幅的
提⾼⽹络的表达能⼒,进⽽可以在精度上相对于⼆值神经⽹络有质的飞跃。另外,由于对中间信息的保存更多,三元神经⽹络可以极⼤的加快⽹络训练时的收敛速度,从⽽更快、更稳定的达到最优的结果;
(2)经典三值化⽹络:Ternary weight networks, Trained Ternary Quantization。
2.2.4 模型量化总结
最为典型就是⼆值⽹络、XNOR⽹络等。其主要原理就是采⽤1bit对⽹络的输⼊、权重、响应进⾏编码。减少模型⼤⼩的同时,原始⽹络的卷积操作可以被bit-wise运算代替,极⼤提升了模型的速度。但是,如果原始⽹络结果不够复杂(模型描述能⼒),由于⼆值⽹络会较⼤程度降低模型的表达能⼒。因此现阶段有相关的论⽂开始研究n-bit编码⽅式成为n值⽹络或者多值⽹络或者变bit、组合bit量化来克
服⼆值⽹络表达能⼒不⾜的缺点。
2 总体压缩效果评价指标
⽹络压缩评价指标包括运⾏效率、参数压缩率、准确率与基准模型⽐较衡量性能提升时,可以使⽤提升倍数(speedup)或提升⽐例(ratio)。
表5 模型压缩评价指标
评价指标特点
准确率⽬前⼤部分研究⼯作均会测量Top-1准确率,只有在ImageNet这类⼤型数据集上才会只⽤Top-5准确率;
参数压缩
率统计⽹络中所有可训练的参数,根据机器浮点精度转换为字节(byte)量纲,通常保留两位有效数字以作近似估计;
运⾏效率可以从⽹络所含浮点运算次数(FLOP)、⽹络所含乘法运算次数(MULTS)或随机实验测得的⽹络平均前向传播所需时间这3个⻆度来评价。
3 ⽹络模型压缩未来研究⽅向
⽹络剪枝、⽹络精馏和⽹络分解都能在⼀定程度上实现⽹络压缩的⽬的,回归到深度⽹络压缩的本质⽬的上,即提取⽹络中的有⽤信息,以下是⼀些值得研究和探寻的⽅向:
(1)权重参数对结果的影响度量。深度⽹络的最终结果是由全部的权重参数共同作⽤形成的,⽬前关于单个卷积核/卷积核权重的重要性的度量仍然是⽐较简单的⽅式,如何通过更有效的⽅式来近似度量单个参数对模型的影响,具有重要意义.
(2)知识蒸馏学⽣⽹络结构的构造。学⽣⽹络的结构构造⽬前仍然是由⼈⼯指定的,然⽽不同的学⽣⽹络结构的训练难度不同,最终能够达到的效果也有差异。因此,如何根据教师⽹络结构设计合理的⽹络结构在精简模型的条件下获取较⾼的模型性能,是未来的⼀个研究重点。
(3)参数重建的硬件架构⽀持。通过分解⽹络可以⽆损地获取压缩模型,在⼀些对性能要求⾼的场景中是⾮常重要的。然参数的重建步骤会拖累预测阶段的时间开销,如何通过硬件的⽀持加速这⼀重建过程,将是未来的⼀个研究⽅向。
(4)任务或使⽤场景层⾯的压缩。⼤型⽹络通常是在量级较⼤的数据集上训练完成的,⽐如在ImageNet上训练的模型具备对1000类物体的分类,但在⼀些具体场景的应⽤中,可能仅需要⼀个能识别其中⼏类的⼩型模型。因此,如何从⼀个全功能的⽹络压缩得到部分功能的⼦⽹络,能够适应很多实际应⽤场景的需求。
(5)⽹络压缩效⽤的评价。⽬前对各类深度⽹络压缩算法的评价是⽐较零碎的,侧重于和被压缩的⼤型⽹络在参数量和运⾏时间上
的⽐较。未来的研究可以从提出更加泛化的压缩评价标准出发,⼀⽅⾯平衡运⾏速度和模型⼤⼩在不同应⽤场景下的影响;另⼀⽅⾯,可以从模型本⾝的结构性出发,对压缩后的模型进⾏评价。
暮2
4、tensorflow model_pruning
手机回收系统其源代码位于tensorflow/tensorflow/contrib/model_pruning
tensorflow model_pruning使⽤的剪枝准则是根据每个神经元的L1绝对值的权重参数⼤⼩进⾏排序之后将低于某⼀个阈值threshold的权重参数全部直接置0,⽽其实现⽅法则是在图结构⾥添加剪枝Ops,设置有⼀个与权重形状⼀致的⼆进制掩模(mask)变量,在前向传播时该掩模的对应位与选中权重进⾏相与输出feature map,如果该掩模对应位为0则对应的权重相与后则为0,在反向传播时掩模对应位为0的权重参数则不参与更新,在保存模型时则可以通过去掉剪枝Ops的⽅式直接稀疏化权重,这样就起到了稀疏连接的作⽤。
下⾯ TensorFlow 代码创建了带有 mask 变量的 graph:
ib.model_pruning.python import pruning
with tf.variable_scope('conv1') as scope:
# 创建权值 variable
kernel = _variable_with_weight_decay(
'weights', shape=[5, 5, 3, 64], stddev=5e-2, wd=0.0)
# 创建 conv2d op,权值 variable 增加 mask
conv = v2d(
images, pruning.apply_mask(kernel, scope), [1, 1, 1, 1], padding='SAME')
下⾯代码给出了带剪枝的模型训练代码结构:
ib.model_pruning.python import pruning
# 命令⾏参数解析
pruning_hparams = _pruning_hparams().parse(FLAGS.pruning_hparams)
# 创建剪枝对象
pruning_obj=pruning.Pruning(pruning_hparams, global_step=global_step)
# 使⽤剪枝对象向训练图增加更新 mask 的运算符
# 当且仅当训练步骤位于 [begin_pruning_step, end_pruning_step] 之间时,
# conditional_mask_update_op 才会更新 mask
mask_update_op = ditional_mask_update_op()
# 使⽤剪枝对象写⼊ summaries,⽤于跟踪每层权值 sparsity 变化
pruning_obj.add_pruning_summaries()
ain.MonitoredTrainingSession() as mon_sess:
while not mon_sess.should_stop():
mon_sess.run(train_op)
# 更新 mask
mon_sess.run(mask_update_op)
模型剪枝的三个阶段为:
(1)第1阶段通过正常训练,学习重要的连接;
(2)第2阶段通过计算权值矩阵的范数,删除节点权重的范数值⼩于指定的阈值的连接,将原始的密集⽹络(densenetwork)变成稀
疏⽹络;
(3)第3阶段通过重新训练稀疏⽹络,恢复⽹络的识别精度。以上剪枝⽅法通常引⼊⾮结构化的稀疏连接,在计算过程中会引起不规则的内存获取,相反会影响⽹络的计算效率。
5,实验结果
全自动绗缝机tensorflow实验
实验条件设置
表6实验条件设置
欧洲药典项⽬名称实验参数
模型压缩⽅法剪枝、量化
实验模型LeNet5
数据集MNIST⼿写数字集
输⼊图⽚⼤⼩28×28
(1)迭代次数i<500,为正常训练过程;

本文发布于:2024-09-22 17:20:30,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/53841.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:模型   剪枝   参数   压缩   权重   训练
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议