深度学习——模型的压缩和加速

1. 简介

随着深度学习发展,越来越多的模型被发现和应用,模型的体量也越来越大,出现了模型过于庞大和参数冗余的问题。同时,移动端对模型的需求也是越轻量越好,因此,模型压缩和加速技术应运而生。

模型压缩和加速的方案有4种:参数修剪和共享(去除不重要的参数)、低秩分解(使用矩阵/张量分解来估计深层CNN【应该适应于其他神经网络模型】中具有信息量的参数)、迁移/压缩卷积滤波器(通过设计特殊结构的卷积核以减少存储和计算成本)、知识精炼(设计教师模型和学生模型,即训练一个更加紧凑的神经网络模型以再现大型网络的输出结果)

模型压缩的方法分为前端和后端两种,后端的压缩方法会改变网络结构,压缩结果不可逆。

2. 入门级技术:量化

初级技术是通过量化或者牺牲精度来降低每一个权重所需要的占用的空间,从而压缩和加速深度神经网络模型。量化技术包括

  • 标量量化

对参数矩阵的所有标量值进行聚类,然后存储每一个矩阵值得索引和聚类中心

  • 乘积量化

把原始数据划分为若干个子空间,在每个子空间分别进行聚类

  • 残差量化

首先对原始的参数矩阵W进行聚类,得到Wc,计算残差W'=W-Wc,然后对残差继续聚类。

  • 二值化

设定一个阈值,若权重大于该阈值,将该权重量化为1,否则,量化为-1。

3. 初级技术:修剪

初级技术是修剪法,修剪不重要的连接或者通道来减少模型冗余。主要分为非结构化修剪和结构化修剪。

  • 非结构化修剪

为了学习更加复杂的数据集,模型有两方面的趋势,一方面是进行大型矩阵相乘运算来训练数据集,另一方面是把深度网络部署到低能耗、嵌入式设备。常见的方法有

  1. 静态阈值法:给网络参数设定阈值,低于阈值的都丢弃掉
  2. Dropout:以等概率性丢弃一些节点
  3. Adaptive Dropout:使用伯努利分布,取样的概率正比于激活值
  4. Winner-Take-All:只保留隐藏层排名前k%的激活值
  5. 随机性哈希法:采用局部敏感性哈希来提高最大内积搜索效率,从而快速选择激活值最大的那些节点
  • 结构化修剪

常见方法有:

  1. 滤波器修剪:分为HFP和SFP,HFP(Hard Filter Pruning)是一种粗粒度修剪方法,寻找一些指标对卷积核进行排序,对不符合指标的卷积全部删除,然后再对网络进行微调,SFP(Soft Filter Pruning)是在每一个epoch训练结束之后将被修剪的卷积核的值置为0,但是会参与到下一次迭代。
  2. 通道修剪:两个步骤:第一步是通道选择,使用L1范数约束,将权重置为0,使得权重稀疏,并减掉稀疏的通道,第二步是重建,用最小二乘法进行约束,使得修剪前后特征图一致。

4. 中级技术:稀疏化技术

  • 正则化

正则化是修改目标函数和学习问题,从而得到一个参数较少的神经网络,分为结构正则化和非结构正则化,非结构正则化是L0,L1,L2;结构化正则化是group-lasso范式和L2.1范式。

  • 知识精炼(Knowledge Distillation,KD)

知识精炼可以将深度和宽度的网络压缩为千层模型,该压缩模型模仿了复杂模型所能实现的功能。基本思想是通过软目标学习教师输出的类别分布而将大兴教师模型的知识精炼为较小的模型。

  • 张量分解

张量分解也叫低秩分解或者低秩近似,方法有SVD分解、Tucker分解。

是度量矩阵行列之间的相关性,如果矩阵的各行和各列都是线性无关的,矩阵就是满秩,秩等于行数,低秩是矩阵的行列可以用其他行列代替,存在一定的数据冗余。

5. 高级技术:轻量级模型设计

相较于在已经训练好的模型上进行压缩处理,轻量化模型设计主要思想是设计更搞笑的网络计算方式,从而使得网络参数减少的同时,不损失网络性能。

5.1 SqueezeNet

SqueezeNet提出了一种fire module来进行卷积操作,它分为两个部分:squeeze层和expand层,squeeze层是压缩层,使用1*1的卷积核来减少通道数量,其卷积核数要少于上一层feature map数。expand是扩展层,分别使用1*1和3*3的卷积,并将分别得到的结果进行合并。

5.2 深度可分离卷积

深度可分离卷积(Depthwise Separable Convolution)是将标准卷积分解成深度卷积(Depthwise Convolution)以及一个1*1的卷积即逐点卷积(Pointwise Convolution),DC是对输入的特征图的每一个通道分别使用一个卷积核,然后所有卷积核的输出再进行拼接。

 PC是1*1的卷积,可以自由改变输出通道的数量,也可以对DC的结果进行通道融合。特殊的结构使DSC的效率较高,常用在轻量化模型中。 

(1)MobileNet

MobileNet是Google针对手机等嵌入式设备提出的一种轻量级的深层神经网络。MobileNet基于一个流线型的架构,使用DSC来构建,还引入了Width Multiplier和Resolution Multiplier两个超参数,WM是宽度因子,用于控制输入和输出的通道数,RM是分辨率因子,用于控制输入和内部层表示,即控制输入的分辨率。

MobileNet有三个版本:

V1:基于深度可分离卷积而构建的模型

V2:基于倒置残差​​结构

V3:使用NAS搜索

详解回头补充吧!!!

(2)ShuffleNet

ShuffleNet是通道洗牌(channel shuffle),是将各部分特征图的通道进行有序地打乱,构成新的特征图,以解决分组卷积带来的信息流通不畅的问题。

(3)Inception和Xception

Inception模型是GoogleNet提出的一种为解决卷积核选择困难的问题的方案,使用3个不同大小的卷积核对输入图片进行卷积操作,并附加最大池化,将这4个操作的输出沿着通道这一维度进行拼接,构成的输出特征图将会包含经过不同大小的卷积核提取出来的特征,从而达到捕捉不同尺度信息的效果。

Inception模块采用多通路(multi-path)的设计形式,每个支路使用不同大小的卷积核,最终输出特征图的通道数是每个支路输出通道数的总和,这将会导致输出通道数变得很大,尤其是使用多个Inception模块串联操作的时候,模型参数量会变得非常大。为了减小参数量,Inception模块在每个3x3和5x5的卷积层之前,增加1x1的卷积层来控制输出通道数;在最大池化层后面增加1x1卷积层减小输出通道数。

 Xception的X是extreme,是基于Inception V3来改进的,采用了DSC模型,目的不在于模型压缩,而是提高性能。

6. 自动化工具

6.1. PaddleSlim

PaddleSlim是一种深度学习模型压缩的工具库,提供剪裁、量化、蒸馏模型结构搜索等模型压缩策略,帮助用户快速实现模型的小型化。(百度公司提出的)

具体细节参考:

简介 — PaddleSlim 文档

6.2. PocketFlow

PocketFlow是一个开源框架,用于以最少的人力压缩和加速深度学习模型。深度学习广泛应用于计算机视觉、语音识别和自然语言翻译等各个领域。(腾讯公司提出的)

Home - PocketFlow Docs

参考:

《深入理解AutoML和AutoDL》——王健宗,瞿晓阳

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466600.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

干货,记一次解决录音杂音问题

最近在项目上遇到一个问题,也不能说是最近项目上的问题了,是之前一直存在的问题,但是对项目没什么影响,所以我就不怎么理会,直到最近,同事说这个杂音已经影响到了项目的开发,所以今天花了一天时…

3.5.2 冒泡排序类

那么,我们就以冒泡排序为例,把它改造成一个类。首先,单击菜单,“项目”-“添加类”,添加一个BubbleSort.cs类文件。IDE自动为我们创建如下代码: usingSystem;usingSystem.Collections.Generic;u…

STM32——串口通信

STM32——串口通信 宗旨:技术的学习是有限的,分享的精神是无限的。 一、异步串口通信协议 STM32 的串口非常强大,它不仅支持最基本的通用串口同步、异步通信,还具有 LIN 总线功能(局域互联网)、IRDA 功能&…

操作系统——死锁(银行家算法)

1、概述 1.1 死锁 死锁是多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。 1.2 死锁产生的原因和条件 原因:(1)竞争资源;(2&…

操作系统——内存管理

1、内存基本概念 1.1 主要功能 内存空间的分配与回收;地址转换内存保护:使用上下限寄存器或者重定位寄存器和界地址寄存器内存扩充:交换和覆盖内容共享 2、内存的分配与回收 2.1 连续分配方式 连续分配方式是指为一个用户程序分配一个连续…

解决一个驱动代码解耦合问题

之前解决的项目LCD设备兼容问题,在 a.c 文件里面定义了一个变量,然后在 b.c 里面使用 extern声明引用这个变量,通过这种方法可以在b.c中使用在a.c 里面初始化的变量。但是这中情况就会引起一个问题,就是驱动代码之间耦合了&#x…

STM32——DMA

STM32——DMA 宗旨:技术的学习是有限的,分享的精神是无限的。 DMA 是为CPU分担数据转移的工作。因为DMA的存在CPU才被解放出来,它可以在 DMA 转移数据的过程中同时进行数据运算、响应中断,大大提高效率。 1、DMA工作分析 数据传…

YOLOv8改进 | 主干篇 | 利用SENetV1改进网络结构 (ILSVRC冠军得主)

一、本文介绍 本文给大家带来的改进机制是SENet(Squeeze-and-Excitation Networks)其是一种通过调整卷积网络中的通道关系来提升性能的网络结构。SENet并不是一个独立的网络模型,而是一个可以和现有的任何一个模型相结合的模块(可以看作是一…

搭建Servlet在线视频

这个视频flash上传及在线播放,搞了我一天了,总算有点成果,但还有一些疑问没有解决,现在发这篇随笔,为的就是交流视频在线上传和观看的一些问题。 在线编辑器使用FCKEditor,首先是修改FCKEditor的配置文件&a…

操作系统——内存管理例题

1、关于分配策略例题 case1:某系统的空闲分区见下表,如有下列作业:96KB,20KB,200KB,分别采用首次适应算法和最佳适应算法来处理这些作业序列,哪种算法能满足该作业序列请求? 分区号…

STM32中C语言知识点:初学者必看,老鸟复习(长文总结)

说在前面的话一位初学单片机的小伙伴让我推荐C语言书籍,因为C语言基础比较差,想把C语言重新学一遍,再去学单片机,我以前刚学单片机的时候也有这样子的想法。其实C语言是可以边学单片机边学的,学单片机的一些例程中&…

STM32——ADC

STM32——ADC 宗旨:技术的学习是有限的,分享的精神是无限的。 一、ADC指标 有 18 个通道,可测量 16 个外部和 2 个内部信号源。各通道的 A/D 转换可以单次、连续、扫描或间断模式执行 ;ADC的结果可以左对齐或右对齐方式存储在 16…

时间复杂度和空间复杂度,一看就懂,面试前必过一遍

一、定义时间和空间是程序的一个硬性指标,一个用来衡量 代码执行的速度 ,一个用来衡量 存储空间的大小程序 数据结构 算法时间复杂度:就是执行程序的快慢,速度越快,时间复杂度就越好。空间复杂度:就是执…

数据结构——排序【仅用于考试】

1、简介 排序&#xff0c;是重新排列表中的元素&#xff0c;使表中的元素满足按关键字有序的过程 稳定性&#xff1a;选取两个元素Ri<Rj&#xff0c;经过排序算法之后&#xff0c;仍为Ri<Rj 不稳定的排序&#xff1a;【简单选择排序&#xff0c;快速排序&#xff0c;堆…

[UWP]做个调皮的BusyIndicator

1. 前言 最近突然想要个BusyIndicator。做过WPF开发的程序员对BusyIndicator应该不陌生&#xff0c;Extended WPF Toolkit 提供了BusyIndicator的开源实现&#xff0c;Silverlight Toolkit也有一个&#xff0c;这次想要把这个控件移植到UWP中。 2. 先说点正经的 2.1 BusyIndica…

STM32——I2C

STM32——I2C 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、I2C协议 I 2 C &#xff08;Inter-Integrated Circuit&#xff09;协议是由 Philips 公司开发的&#xff0c;由于它具备引脚少、硬件实现简单、可扩展性强、不需要如 USART、CAN 的外部…

C语言发展简史

1、起源C 语言最早的原型是 ALGOL 60 1963 年&#xff0c;剑桥大学将其发展成为 CPL(Combined Programing Language)。1967 年&#xff0c;剑桥大学的 Matin Richards 对 CPL 语言进行了简化&#xff0c;产生了 BCPL 语言。1970 年&#xff0c;美国贝尔实验室(Bell Labs)的 Ken…

STM32——EEPROM

STM32——EEPROM 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、I2C接口读写EEPROM&#xff08;AT24C02&#xff09; ——主模式&#xff0c;分别用作主发送器和主接收器。通过查询事件的方式来确保正常通信。 1、I 2C接口初始化 与其他对GPIO 复用…

Linus Torvalds谈ECC内存的重要性 痛斥英特尔正在扼杀它

新年假期&#xff0c;Linus Torvalds在邮件列表中发表的一篇火热的帖子引发技术社区关注&#xff0c;人们借此讨论ECC内存的重要性&#xff0c;Torvalds在文章中抨击了英特尔在这方面的”坏政策”&#xff0c;因为特定的市场细分使ECC内存不那么普及。Linus认为&#xff0c;纠错…