模型剪枝和量化_人脸识别系统之模型压缩裁剪量化

news/2024/7/4 8:35:12

c3b2465f42565dfd15bfb1d0ba8d7d50.png

本文用途仅仅是在前人经验下,自我总结,以供以后学习使用,若有错误,敬请您批评指正。

应用背景:深度学习的应用加速了计算机视觉领域的发展,但是随着模型深度的加深,也带来了高额的存储空间、计算资源消耗等问题,很难落实平台。为解决此类问题,提出压缩模型这样的方法,此方法可最大限度地减少模型对计算空间与时间的消耗。可参考:深度学习之模型压缩 - jimchen1218 - 博客园

常用方法:(从数据,模型和硬件多维度的层面来分析,压缩和加速模型的方法。

  1. 压缩已有网络模型:张量分解、模型剪枝、模型量化

张量分解:

  • 定义:将网络权值当满秩矩阵,可以用多个低秩矩阵来逼近该矩阵。
  • 目的:降低时间复杂度。
  • 优点:适合模型压缩。
  • 缺点:实现并不容易,涉及计算成本高昂的分解操作,且需要大量的重新训练来达到收敛
  • 对二维矩阵运算,可选择SVD分解:
  • 对于多维矩阵运算,涉及到Tensor,主要是CP分解,Tucker分解,Tensor Train分解,Block Term分解。

模型剪枝:

将权重矩阵中相对不重要的权值剔除,然后再重新精修(finetune)网络进行微调。

广义修剪:

  • 正则化:修改目标函数,得到一个参数较少的网络,如添加L1Norm在损失函数;
  • 修剪:删除冗余的特征和参数

操作步骤:

分析神经元重要程度、移除不重要的神经元、对网络进行微调、重新执行第一步,下一轮迭代。

剪枝内容:

  • 细粒度剪枝:保留模型精度,但依赖硬件设备
  • 粗粒度剪枝:模型速度和大小都有效提升,但精度会大幅下降。

怎样剪枝:权重衰减法-正则化方法

剪枝方式:

1)单个权重剪枝(非结构化):任意权重被看作是单个参数并进行随机非结构化剪枝。

缺点:导致网络连接不规整,需要通过稀疏表达来减少内存占用,进而导致在前向传播时,需要大量条件判断和额外空间来标明0或非0参数位置,因此不适合并行计算。非结构化的稀疏性需要使用专门的软件计算库或者硬件。

2)核内权重剪枝/核的稀疏化(结构化):对权重的更新加以正则项进行限制,使其更加稀疏,使大部分的权值都为0。

3)卷积核/特征图/通道剪枝(结构化):减去第i层的filter,进而减去第i层产生的部分特征图和第i+1层的部分kernel。kernel粒度的显著性度量可以采用kernel的权重和来判断,采用Filter的权重和来判断。

4)中间隐层剪枝:删除一些层,改变网络结构。

模型量化:

一般,神经网络模型的参数都是32bit长度的浮点数表示。很多时侯不需要这么高的精度,可以通过量化,用如用8bit来表示。通过牺牲精度来降低每个权值所需要的空间。SGD所需要的精度仅为6-8bit,合理的量化可保证精度的情况下减小模型的存储体积。根据量化方法不同,可分为2值量化,3值量化,多值量化。

量化方式:

1)二值量化:将权值矩阵中的单精度浮点数用两个值来表示。一般使用符号函数或加入线性化的符号函数来近似。

2)三值量化:改进的二值量化,在二值网络函数(-1,+1)的基础上,显式地增加0这个量化值。

3)多值量化:使用8big或16bit定点数来表示。

2. 构建新的小型网络:知识蒸馏、紧凑网络设计

迁移学习/知识蒸馏:

(采用预训练好的复杂模型的输出作为监督信号去训练另外一个简单的网络。)

  • 迁移学习:将一个模型的性能迁移到另一个模型上
  • 网络精馏:在同一个域上迁移学习的一种特例

紧凑网络设计:

1、MobileNet系列:采用深度可分离卷积来构建卷积。

Efficient Convolutional Neural Networks for Mobile Vision Applications:借鉴factorized convolution的思想,将普通卷积操作分成两部分

  • Depthwise Convolution:每个卷积核滤波器只针对特定的输入通道进行卷积操作
  • Pointwise Convolution:采用1x1大小的卷积核将depthwise convolution层的多通道输出进行结合

2、ShuffleNet:

ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices:基于MobileNet的group思想,将卷积操作限制到特定的输入通道。而与之不同的是,ShuffleNet将输入的group进行打散,从而保证每个卷积核的感受野能够分散到不同group的输入中,增加了模型的学习能力。

3、SqueezeNet:

[2016,Iandola,]SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size

  • 将3x3卷积核替换为1x1卷积核(1个1x1卷积核的参数是3x3卷积核参数的1/9,这一改动理论上可以将模型尺寸压缩9倍)
  • 减小输入到3x3卷积核的输入通道数
  • 尽可能的将降采样放在网络后面的层中
  • 借鉴ResNet思想,对原始网络结构做了修改,增加了旁路分支,将分类精度提升了约3%。
  • 作者提出了一个类似inception的网络单元结构,取名为fire module。一个fire module 包含一个squeeze 卷积层(只包含1x1卷积核)和一个expand卷积层(包含1x1和3x3卷积核)。其中,squeeze层借鉴了inception的思想,利用1x1卷积核来降低输入到expand层中3x3卷积核的输入通道数。

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借助小波分解得思想,将原图分解成两个低分辨率图像,以达到网络加速的目。

关于知识蒸馏详细介绍可看:

yuanCruise:知识蒸馏 | 模型压缩利器_良心总结​zhuanlan.zhihu.com
4dcc14b5e218e8671fd3ecff688c720f.png

参考文献:

深度学习之模型压缩 - jimchen1218 - 博客园​www.cnblogs.com
25f7ea4b7cf9f473201c73900be00dc8.png

http://www.niftyadmin.cn/n/1895016.html

相关文章

代码生成器开发笔记(2)-数据库架构

代码生成器开发笔记(&#xff12;)&#xff0d;数据库架构 程序 2009-06-13 01:30:01 阅读55 评论0 字号&#xff1a;大中小 订阅 要完成代码生成器&#xff0c;第一个要解决的是完全解析数据库架构。 对SQL Server当然没什么问题&#xff0c;早在ADO时代就可以通过查询sy…

mysql on linux 安装_MySQL on Linux手动安装方法

MySQL on Linux手动安装方法发布时间:2007-06-05 11:44:45来源:红联作者:TecCTO1. 下载"mysql-standard-5.0.27-Linux-i686-icc-glibc23.tar.gz"&#xff0c;推荐ICC版本&#xff0c;据称比GCC性能提高10-20%2. 复制到/usr/local/&#xff0c;解压&#xff1a;tar zx…

MongoDB最新最佳连接工具:Robo 3T

MongoDB连接工具 像使用Mysql&#xff0c;喜欢用Navicat连接工具一样。 在使用MongoDB数据库的时候&#xff0c;同样可以使用Robo 3T图形化工具。 一、下载Robo 3T Robo 3T官网 Studio 3T&#xff1a;专业人士使用的&#xff0c;需要付费。 Robo 3T&#xff1a;虽然免费&…

mysql audit_mysql5.7添加日志审计插件audit-plugin

来自McAfee的MySQL插件&#xff0c;为MySQL提供审计功能&#xff0c;重点是安全性和审计要求。该插件可以用作独立的审核解决方案&#xff0c;也可以配置为将数据提供给外部监视工具。插件下载地址&#xff1a;首先查看mysql的插件保存目录&#xff1a;mysql> show global v…

代码生成器开发笔记(3)-界面设计

代码生成器开发笔记(3)&#xff0d;界面设计 程序 2009-06-13 13:48:34 阅读73 评论0 字号&#xff1a;大中小 订阅 解决了数据架构问题&#xff0c;开始正式动手写代码。 第一个问题当然是界面设计了。准备做成VS2005风格&#xff0c;也就是多文档、支持窗体停靠&#xf…

拓扑排序c语言代码_折半插入排序算法(C语言代码实现)

上一节介绍了直接插入排序算法的理论实现和具体的代码实现&#xff0c;如果你善于思考就会发现该算法在查找插入位置时&#xff0c;采用的是顺序查找的方式&#xff0c;而在查找表中数据本身有序的前提下&#xff0c;可以使用折半查找来代替顺序查找&#xff0c;这种排序的算法…

分布式数据库操作笔记

/*映射和删除远程服务器连接 */exec sp_addlinkedserver serverdemo, srvproduct,datasrc192.168.2.93,providerSQLOLEDB /* 不能再事务中执行存储过程*/ exec sp_dropserver demo select * from sys.servers /*查询此服务器中所有服务器映射记录 */ /*映射和删除远程服务器…

yii2安装mysql_linux 安装mysql5.6

Linux:Centos1.先查看系统上有没有安装了旧版本的MySQL &#xff0c;用下面的命令&#xff1a;rpm -qa | grep mysql如果有&#xff0c;用以下命令卸载rpm -e --nodeps 上步显示mysql名称安装编译mysql 需要的依赖包yum install libevent* libtool* autoconf* libstd* ncurse* …