【论文笔记】神经网络压缩调研
神经网络压缩调研
- 背景
- 现有的深度模型压缩方法
- NetWork Prunning 网络剪枝
- 设计结构化矩阵
- 知识蒸馏
- 权值共享
- Parameter Quantization(参数量化)
- 量化和二进制化
- 伪量化
- Architecture Design(Depth Separable Convolution)
- 分解卷积
背景
小模型,参数少,容易将ML模型部署在资源有限的设备上,但是直接训练一个好的小网络比较困难
现有的深度模型压缩方法
- 基于参数修建和共享的方法针对模型参数的冗余性 试图取出冗余和不重要的项
- 基于低秩因子分解的技术使用矩阵/张量分解来估计深度学习模型的信息参数
- 基于传输/紧凑卷积滤波器的方法设计页数的卷积滤波器来降低存储和计算复杂度
- 知识蒸馏方法通过学习一个蒸馏模型,训练一个更紧凑的神经网络来重现一个更大的网络输出
综述论文 :A Survey of Model Compression and Acceleration for Deep Neural Networks

- 转移层和参数修剪和共享可以一起使用
- 模型量化和二值化可以与低秩近似一起使用以实现进一步的加速
NetWork Prunning 网络剪枝
删减神经网络没有用的参数
- 过程如下(PPT)叙述一遍
- 训练一个网络
- 针对网络的每一个参数评估一下重要性 每一个神经元的重要性
- 移除不重要的参数或者神经元
- 微调 重新训练一下 Fine-tune
- 反复进行多次

修剪的单位 参数或者神经元
- 移除若干个权重参数,但是实际操作不好定义 因为结构不对称,而且当Network不规则,不方便使用GPU进行加速
- 评价weight重要性,我们可以用绝对值衡量,即绝对值越大,weight越重要,或者采用之前介绍的life long learning的想法
- 评价neuron重要性,我们可以用其输出的结果为0的次数衡量,即输出0越多越不重要。

- neuron pruning
一神经元为单位进行剪枝,通过去除冗余的神经元,简化网络结构。这样得到的网络结构是规则的,相比于Weight pruning,这种方式更好实现,也更容易通过GPU加速。

训练一个大的模型,保留比较有用的模型参数 然后得到一个小的模型,这样得到的小模型效果和原始的大模型效果差不多,而不是直接训练一个小的模型

设计结构化矩阵
如果一个Mxn矩阵可以使用一个少于mxn的参数来描述,就是一个结构化的矩阵,通常这样的结构不仅能减少内存消耗,还可以通过快速的矩阵-向量乘法和梯度计算显著加快推理和训练的速度
但是问题是结构的约束会导致精确度的损失,因为约束可能给模型带来偏差,另外一个方面如何找到一个合适的矩阵结构是很困难的,没有理论来支持推导。
知识蒸馏
首先定义一个比较大的网络Teacher Net,然后训练,那么训练后的网络,比如手写数字识别任务,预测1的结果概率是 1:0.7 7:0.2 9:0.1,在定义一个小的网络Student Net ,然后让他学习Teacher Net,如果让比较小的网络得到和比较大的网络一样的效果比较难train,所以直接按照大的network的训练结果训练小的网络,跟容易train。

这个Teacher Net不一定是一个巨大的network,也有可能是将多个network组合(ensemble)得到的。但是多个network组合的模型往往比较复杂,在实际应用中,我们可以训练一个Student Net,让结果逼近N Networks的结果,使得模型准确度差不多的情况下,复杂度大大减少。
关于只是蒸馏的一个小技巧,就算是在softmax函数的基础上对每一个输出的结果加上一个temperature,这样会对最后最后的预测结果进行一个平滑的处理,使得Student Net更好训练
基于知识蒸馏方法可以令更深的模型降低计算成本,但是只能用于具有Softmax损失函数分类任务,这阻碍应用,但是另一个缺点是太严格,性能比不上其他方法,老师和学生可以是不同的网络结构,比如BERT蒸馏到BiLSTM网络,但是一般相似网络结构,蒸馏的效果会更好。
权值共享
ALBert,十二层共用一套参数,从而使得参数量降低到原来的1/12.这个方案对于模型压缩得作用很大,但是对于推理加速则收效甚微,因为共享权值并没有带来计算量得减少
Parameter Quantization(参数量化)
参数量化,称之为参数压缩,这种方法主要是对weigth在存储量上减少的一类方法,
-
对于weight的精度可能不需要太高就可以获得一个比较好的效果,比如从64->32 其实就是减少减少数据的存储位数
-
权重聚类:将神经网络所有的weight按照值得大小进行划分,数值差不多的聚集在一起,然后对每一个类取一个值,替换里面所有的权值,相当于每一个堆只用一个值就可以存储,这样存储得数据量大大减少
-
采用哈夫曼编码,比较常见得东西使用比较少的bit描述,不常见得东西使用比较多得bit描述,但是平均起来存储得数据量大大减少。

量化和二进制化

网络量化通过减少表示每一个权重所需要的比特数目来压缩原始网络
- Vanhoucke使用8比特参数量化可以在准确率损失极小的同时实现大幅加速
- Han S提出了一整套完整的深度网络的压缩流程:
- 首先修建不重要的连接,重新训练稀疏连接的网络
- 然后使用权重共享量化连接的权重,
- 再对量化之后的权重和码本进行霍夫曼编码,以进一步降低压缩率
- 修剪、量化、和霍夫曼编码
修建减少了需要编码的权重数量,量化和霍夫曼编码减少了用于对每个权重编码的比特数。对于大部分元素为0的矩阵可以使用稀疏表示,进一步降低空间冗余,且这种压缩机制不会带来任何准确率
伪量化
保存模型每一层的时候,使用低精度来保存每一个网络参数,同时保存拉伸比例scale和对应的浮点数zeroPoint,然后在推理阶段,使用如下公式来还原网络参数32bit

存储的时候使用低精度进行量化,但是推理的时候还原为正常的高精度,为量化只能实现模型压缩,但是不能加速模型
Architecture Design(Depth Separable Convolution)
CNN减少参数量得结构化设计,深度可分离卷积 PPT 介绍这部分 逐层卷积 逐点卷积
对于CNN,假设输入有两个channel,对应的filter也就是两个channel,假设有四个filter,每一个filter都是3 *3 的,那么输出也有四个channel,卷积层一共包含3 * 3 * 2 * 4 = 72个参数

深度可分离卷积:Depthwise Convolution
- 有几个channel 就有几个filter
- 每一个filter只管一个channel
- 每一个filter在一个channel上进行convolution 卷积操作 生成一个channel
- channel和channel之间的关系没法体现出来
Depthwise Convolution首先经过第一次卷积运算,DW完全是在二维平面内进行。卷积核的数量与上一层的通道数相同(通道和卷积核一一对应)。所以一个三通道的图像经过运算后生成了3个Feature map(如果有same padding则尺寸与输入层相同为5×5),

PointWise Convolution

- 每一个filter扫描所有的channel 得到一个新的channel
Pointwise Convolution的运算与常规卷积运算非常相似,它的卷积核的尺寸为 1×1×M,M为上一层的通道数。所以这里的卷积运算会将上一步的map在深度方向上进行加权组合,生成新的Feature map

对于深度可分离卷积DepthWise Separable Convolution 使用DepthWise Convolution和 PointWise Convlution 进行结合 ,用来提取特征feature map
相比常规的卷积操作,它的参数数量和运算成本比较低
神经网络压缩的几种方法,并不是互斥的,可以先使用一个方法,再接着使用剩余的一个或者几个方法,直到满足压缩条件
分解卷积
- 使用两个串联得小卷积核来代替一个大的卷积核。inceptionV2中创造性的提出了两个3x3的卷积核代替一个5x5的卷积核,在效果相同的情况下,参数量仅为原先的3x3x2/5x5 = 18/25
- 使用两个并联的非对称卷积核来代替一个正常卷积核,inceptionV3中将一个7x7的卷积拆分成一个1x7和一个7x1的卷积,卷积效果相同的情况下,大大减少了参数量,同时还提高了卷积的多样性
相关文章:
【论文笔记】神经网络压缩调研
神经网络压缩调研 背景现有的深度模型压缩方法NetWork Prunning 网络剪枝设计结构化矩阵知识蒸馏权值共享Parameter Quantization(参数量化)量化和二进制化伪量化Architecture Design(Depth Separable Convolution)分解卷积 背景 …...
红外NEC通信协议
一、NEC简介 红外(Infrared,IR)遥控是一种无线、非接触控制技术,常用于遥控器、无线键盘、鼠标等设备之间的通信。IR协议的工作原理是,发送方通过红外线发送一个特定的编码,接收方通过识别该编码来执行相应的操作。 IR协议是指红外…...
数据分析DAY1
数据分析 引言 这一周:学习了python的numpy和matplotlib以及在飞桨paddle上面做了几个小项目 发现numpy和matplotlib里面有很多api,要全部记住是不可能的,也是不可能全部学完的,所以我们要知道并且熟悉一些常用的api࿰…...
算法通关村—迭代实现二叉树的前序,中序,后序遍历
1. 前序中序后序递归写法 前序 public void preorder(TreeNode root, List<Integer> res) {if (root null) {return;}res.add(root.val);preorder(root.left, res);preorder(root.right, res);}后序 public static void postOrderRecur(TreeNode head) {if (head nu…...
二叉搜索树(BST)的模拟实现
序言: 构造一棵二叉排序树的目的并不是为了排序,而是为了提高查找效率、插入和删除关键字的速度,同时二叉搜索树的这种非线性结构也有利于插入和删除的实现。 目录 (一)BST的定义 (二)二叉搜…...
【MFC】01.MFC框架-笔记
基本概念 MFC Microsoft Fundation class 微软基础类库 框架 基于Win32 SDK进行的封装 属性:缓解库关闭 属性->C/C/代码生成/运行库/MTD 属性->常规->MFC的使用:在静态库中使用MFC,默认是使用的共享DLL,运行时库 SD…...
基于ArcGIS污染物浓度及风险的时空分布
在GIS发展的早期,专业人士主要关注于数据编辑或者集中于应用工程,以及主要把精力花费在创建GIS数据库并构造地理信息和知识。慢慢的,GIS的专业人士开始在大量的GIS应用中使用这些知识信息库。用户应用功能全面的GIS工作站来编辑地理数据集&am…...
【项目开发计划制定工作经验之谈】
一、背景介绍 随着信息技术的发展,项目管理越来越受到企业和组织的重视。项目管理是一项旨在规划、组织、管理和控制项目的活动,以达到特定目标的过程。项目开发计划是项目管理的一个重要组成部分,它是指定项目目标、工作范围、进度、质量、…...
基于STM32的格力空调红外控制
基于STM32的格力空调红外控制 1.红外线简介 在光谱中波长自760nm至400um的电磁波称为红外线,它是一种不可见光。目前几乎所有的视频和音频设备都可以通过红外遥控的方式进行遥控,比如电视机、空调、影碟机等,都可以见到红外遥控的影子。这种技…...
rust中thiserror怎么使用呢?
thiserror 是一个Rust库,可以帮助你更方便地定义自己的错误类型。它提供了一个类似于 macro_rules 的宏,可以帮助你快速地定义错误类型,并为错误添加上下文信息。下面是一个使用 thiserror 的示例: 首先,在你的Rust项…...
ceph tier和bcache区别
作者:吴业亮 博客:wuyeliang.blog.csdn.net Ceph tier(SSD POOL HDD POOL)不推荐的原因: 数据在两个资源池之间迁移代价太大,存在粒度问题(对象级别),且需要进行write…...
Idea 2023.2 maven 打包时提示 waring 问题解决
Version idea 2023.2 问题 使用 Maven 打包 ,控制台输出 Waring 信息 [WARNING] [WARNING] Plugin validation issues were detected in 7 plugin(s) [WARNING] [WARNING] * org.apache.maven.plugins:maven-dependency-plugin:3.3.0 [WARNING] * org.apache.…...
docker数据持久化
在Docker中若要想实现容器数据的持久化(所谓的数据持久化即数据不随着Container的结束而销毁),需要将数据从宿主机挂载到容器中。目前Docker提供了三种不同的方式将数据从宿主机挂载到容器中。 (1)Volumes:…...
安全防护,保障企业图文档安全的有效方法
随着企业现在数据量的不断增加和数据泄露事件的频发,图文档的安全性成为了企业必须高度关注的问题。传统的纸质文件存储方式已不适应现代企业的需求,而在线图文档管理成为了更加安全可靠的数字化解决方案。那么在在线图文档管理中,如何采取有…...
Open3D (C++) 基于拟合平面的点云地面点提取
目录 一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示1、原始点云2、提取结果四、相关链接本文由CSDN点云侠原创,原文链接。爬虫网站自重,把自己当个人,爬些不完整的误导别人有意思吗???? 一、算法原理...
【Linux】Kali Linux 渗透安全学习笔记(2) - OneForAll 简单应用
OneForAll (以下简称“OFA”)是一个非常好用的子域收集工具,可以通过一级域名找到旗下的所有层级域名,通过递归的方式我们很容易就能够知道此域名下的所有域名层级结构,对于进一步通过域名推测站点功能起到非常重要的作…...
DAY56:单调栈(二)下一个最大元素Ⅱ(环形数组处理思路)
文章目录 思路写法1完整版环形数组处理:i取模,遍历两遍写法2完整版(环形数组推荐写法)debug测试:逻辑运算符短路特性result数组在栈口取元素,是否会覆盖原有数值? 给定一个循环数组 nums &#…...
kafka简介
kafka是什么? Kafka最初采用Scala语言开发的一个多分区、多副本并且基于ZooKeeper协调的分布式消息系统。目前Kafka已经定位为一个分布式流式处理平台,它的特性有高吞吐、可持久化、可水平扩展、支持流处理。 Apache Kafka是一个分布式的发布-订阅消息系…...
Kafka-消费者组消费流程
消费者向kafka集群发送消费请求,消费者客户端默认每次从kafka集群拉取50M数据,放到缓冲队列中,消费者从缓冲队列中每次拉取500条数据进行消费。...
FFmepg视频解码
1 前言 上一篇文章<FFmpeg下载安装及Windows开发环境设置>介绍了FFmpeg的下载安装及环境配置,本文介绍最简单的FFmpeg视频解码示例。 2 视频解码过程 本文只讨论视频解码。 FFmpeg视频解码的过程比较简单,实际就4步: 打开媒体流获取…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
