深度神经网络压缩与加速技术

  //  

深度神经网络是深度学习的一种框架,它是一种具备至少一个隐层的神经网络。与浅层神经网络类似,深度神经网络也能够为复杂非线性系统提供建模,但多出的层次为模型提供了更高的抽象层次,因而提高了模型的能力。深度神经网络是一种判别模型,可以使用反向传播算法进行训练。随着深度神经网络使用的越来越多,相应的压缩和加速技术也孕育而生。LiveVideoStackCon 2023上海站邀请到了胡浩基教授为我们分享他们实验室的一些实践。

文/胡浩基

编辑/LiveVideoStack

大家好,我是来自浙江大学信息与电子工程学院的胡浩基。今天我分享的主题是《深度神经网络压缩与加速技术》。

88a7c01f3ffc646e33d734f5980222cf.png

首先一个问题是,为什么要做深度神经网络压缩?有两个原因:第一个原因是大型的深度神经网络很难部署在小型化的设备上。另一个原因是当深度模型越来越大,需要消耗的计算和存储资源越来越多,但是物理的计算资源跟不上需求增长的速度。

从右边的图可以看出,从2005年开始,硬件的计算资源增长趋于放缓,而随着深度学习领域的蓬勃发展,对算力的需求却是指数级增长,这就导致了矛盾。因此,对深度模型进行简化,降低其计算量,成了当务之急。近年来,以ChatGPT为代表的大模型诞生,将这个问题变得更加直接和迫切。如果想要应用大模型,必须有能够负担得起的相对低廉计算和存储资源,在寻找计算和存储资源的同时,降低大模型的计算量,将是对解决算力问题的有益补充。

ec8e1d1cb2a4eb6a1cb3c8af7dfd0a1b.png

例如2017年流行的VGG-16网络,在当时比较主流的CPU上处理一张图片,可能需要1.7秒的时间,这样的时间显然不太适合用部署在小型化的设备当中。

1886991784cee024441d08ea220f03de.png

深度神经网络的压缩用数学表述就是使用一个简单的函数来模拟复杂的函数。虽然这是一个已经研究了几百年的函数逼近问题,但是在当今的环境下,如何将几十亿甚至上千亿自由参数的模型缩小,是一个全新的挑战。这里有三个基本思想 -- 更少参数、更少计算和更少比特。在将参数变少的同时,用较为简单的计算来代替复杂的计算。用低精度量化的比特数来模拟高精度的数据,都可以让函数的计算复杂性大大降低。

107692eb23064b9975a962396b510880.png

深度模型压缩和加速领域开创人MIT的副教授韩松在2015年的一篇文章,将深度学习的模型压缩分成了如下的5个步骤。最左边输入了一个深度学习的模型,首先要经过分解(decomposition),即用少量的计算代替以前复杂的计算,例如可以把很大的矩阵拆成多个小矩阵,将大矩阵的乘法变成小矩阵的乘法和加法。第二个操作叫做剪枝(pruning),它是一个减少参数的流程,即将一些对整个计算不那么重要的参数找出来并把它们从原来的神经网络中去掉。第三个操作叫做量化(Quantization),即将多比特的数据变成少比特的数据,用少比特的加法和乘法模拟原来的多比特的加法乘法,从而减少计算量。做完以上三步操作之后,接下来需要编码(encoding),即用统一的标准将网络的参数和结构进行一定程度的编码,进一步降低网络的储存量。经过以上四步的操作,最后可以得到一个被压缩的模型。

017db461eda5de4313f14eb35dd7621c.png

我们团队提出了另外一种基于层次的模型压缩分类。最上面一个层级叫做网络结构搜索(network architecture design),即搜索一个计算量较少但对于某些特定任务很有效的网络,这也可以看作另一种压缩方式。第二个层级叫做分层压缩(Layer)。深度学习网络基本上是分层的结构,每一层有一些矩阵的加法和乘法,对每一层的这些加法和乘法进行约束,例如将矩阵进行分解等,这样可以进一步降低计算量。第三个压缩层级是参数(weight),将每一层不重要的参数去掉,这也就是剪枝。最下面的层级是比特(bit),用量化对每个参数做比特层级的压缩,变成量化的编码。

9daddb32b03db78ec863ed18ef7d569f.png

这里是各种压缩方式的介绍以及它们的挑战。剪枝(Pruning)减少模型的参数;低秩分解(Low rank factorization)将大矩阵拆成小矩阵;知识蒸馏(Knowledge Distillation)用大的网络教小的网络学习,从而使小的网络产生的结果跟大的网络类似;量化(Quantization将深度神经网络里的参数进行量化,变为低比特参数,降低计算量。

4e96a0f8bb1f6c4c5125341cc3216c2d.png

2018年BMVC会议,我们团队提出了一种基于概率的剪枝方法,叫做Structured Probabilistic Pruning。这种方法的核心思路是将神经网络里不重要的参数去掉。那么如何划分重要与不重要,是首要问题。最好的标准是去掉某个参数以后测试对于结果的影响。但是在整个网络中那么多的参数,如果每去掉一个参数都测试对结果的影响,时间就会非常漫长。所以需要用一些简单的标准,例如参数绝对值的大小来评判参数的重要性。但有一个矛盾是,简单标准对于衡量参数重要性来说并不准确。那么如何解决上述矛盾呢?我们提出的方案形象一点就是,用多次考试代替一次考试。我们将在训练到一定的地步之后,去掉不重要的参数,这个过程叫做一次考试。但是每次考试都有偏差。于是我们发明了这种基于概率的剪枝方法,将一次考试变成多次考试。即每训练一段时间测试参数重要性,如果在这段时间内它比较重要,就会给它一个较小的剪枝概率,如果在这一段时间内不那么重要,就会给它一个较大的剪枝概率。接下来继续训练一段时间,再进行第二次考试。在新的考试中,以前不重要的参数可能变得重要,以前重要的参数也可能变得不重要,把相应的概率进行累加,一直随着训练的过程累加下去,直到最后在训练结束时,根据累加的分数来决定哪些参数需要被剪枝。

37b16538065d7195d522e82babcf6f69.png

644ef70c23c0cbc2277b52336c533a72.png

这种方式叫做SPP——Structured Probabilistic Pruning。SPP算法相对于其他的算法有一定的优势,具体体现在左边的图片里。例如我们将AlexNet压缩两倍,识别准确率反而提高了0.7,说明对于AlexNet这样比较稀疏的网络效果很好。从别的图片也可以看到,相对于其他的算法也有一定优势,这里不详细展开介绍。

64792bff7d62d139cc3227317a895d8f.png

2020年我们又提出一种基于增量正则化的卷积神经网络剪枝算法。通过对网络的目标函数加入正则化项,并变换正则化参数,从而达到剪枝的效果。

a4113ade49245370aca302d3133f749a.png

我们通过严格的数学推导证明了一个命题,即如果网络函数是二阶可导,那么当我们增加每一个网络参数对应正则化系数时,该参数的绝对值会在训练过程中会减小。所以我们可以根据网络参数的重要程度,实时分配其对应正则化系数的增量,从而将一些不太重要的参数绝对值逐渐压缩到零。通过这种方式,可以将神经网络的训练和剪枝融合到一起,在训练过程中逐步压缩不重要参数的绝对值,最终去除它们。

5f6d4f5e59e7a6f080bfac577354df76.png

相比SPP, 增量正则化方法在AlexNet(ImageNet)上将推理速度提高到原来的4倍,也能够提高0.2%的识别率。在将网络推理速度提高5倍情况下,识别率也仅仅下降了0.8,这相比其他压缩算法也有很大的优势。

644b50bb6cc50f578d0fdf9576e12d6b.png

增量正则化方法对于三维卷积网络的也有一定的压缩效果,在3D-ResNet18上,将推理速度提高2倍,识别率下降了0.41%;将推理速度提高4倍,识别率下降2.87%。

956758fa048b9e772c89a71643b509a2.png

基于增量正则化方法,我们参与了AVS和IEEE标准的制定,提出的算法成功的写入到国家标准《信息技术 神经网络表示与模型压缩 第1部分 卷积神经网络》中,同时也被写入“IEEE Model Representation, Composition, Distribution and Management”标准中并获得今年的新兴标准技术奖。

ad8d7a41c44a645ca5950e577c4f3e4a.png

最近几年,我们还将深度模型压缩技术应用到图像风格迁移、图像超分辨率等底层视觉任务中。2020年的CVPR论文,我们利用知识蒸馏来压缩风格迁移网络。这里是风格迁移网络的例子,即输入两张图片,一张是内容图片,一张是风格图片。通过风格迁移网络生成一张图片,将内容和风格融合起来。我们需要做的事就是压缩风格迁移网络的大小。

5152082df94960ddfa179be0cba65d73.png

我们利用知识蒸馏来压缩风格迁移网络,即设计小的学生模型,用小的学生模型来模拟大的教师模型的输出,从而达到压缩大的教师模型的目的。我们也设计了针对风格迁移网络的损失函数,更好的完成了知识蒸馏的任务。我们提出的方法有很好的性能,例如在2020年效果比较好的WCT风格迁移网络,整个模型的大小是133m,经过压缩之后只有10m。一块GPU上使用WCT最多可以同时处理900×900的图片,压缩之后,同样的GPU上能够处理6000×6000的图片,在处理速度上,处理900×900的图片,WCT需要花费78秒,压缩之后只需要7秒,同时处理6000×6000的图片,在单卡的GPU也只要花费52秒的时间。

be606f6719f2da38df621199fe559fa7.png

8c7cebf98466afaf08a03f51f17ffce6.png

1ffc1fd410e7982b242d4cb359cf5ad8.png

6caea4619be4854dc51228ba45c6a83e.png

可以看到,通过我们的模型压缩技术,即便是4,000万像素图片的风格迁移,放大后的图像细节依然清晰。

c167bb945bdaff3c57a727d355fa480e.png

在人脸识别方面,我们也使用了知识蒸馏的方法。这是2019年发表在ICIP的论文,人脸识别中有个三元组的损失,即图片左上角。其中有一个超参数m。这个m是不可以变化的。通过改进,我们将m变成了一个可变的参数,这个参数能够由学生网络计算两个图之间的距离,用距离的方式将m确定下来。基于这种动态的超参数,我们规划了知识蒸馏算法,获得了不错的效果。

9937b052a030413aee62b11bb9a99db9.png

我们实现了可能是世界上第一个公开的2M左右的人脸识别模型,同时在LFW数据上达到99%以上的识别率。同时,我们将所做的小型化人脸识别模型嵌入到芯片中,让人脸识别获得了更多的应用。

29ae00f1bd35e3f3efc963102cf1a128.png

0bead0bf338b15f8652b47e41a8b6868.png

在瑞芯微RK3288上,原有的模型处理一张图片大概在0.31秒。而我们这个压缩后只有2M左右的模型,处理一张图片的时间在0.17秒左右。

25aba3944eecff8d6bef2d2195725bed.png

2020年开始,我们和华为合作,将深度压缩模型应用在图像超分辨率上。卷积神经网络是一个先处理局部,再处理全局的模型。而在超分辨率网络中,局部信息很重要,需要用跳线连接前面和后面的层。每一个跳线不仅把数据传送过去,还要同时将那一层的特征图传过去。后面的层不仅仅要处理自己那一层产生的特征图,还要处理前面传送过来的特征图。然而,不是每一个跳线都重要,都需要保留。于是我们规划算法,删除一些不重要的跳线,同时也删除了传送过来的特征图,从而降低了图像超分辨率网络的计算量。我们采用马尔科夫过程建模目标函数,消除冗余的跳线,从而完成对超分辨率网络的压缩。

f28219b58f961d002c5b9aecfadaa9ee.png

左边表格是一些定量的结果。FLOPs是网络中加法和乘法的次数。经过压缩之后的模型DCP-R-102的FLOPs只有102G,与计算量最大的网络D-DBPN相差50多倍的计算量,而图像的PSNR和SSIM基本不变。右边图片是定性结果,可见,我们的网络DCP-R可以很好的恢复图片的纹理和细节。

72d6a13fb188776e7aad8b1d32a6dfb5.png

这是关于图像超分辨率的另一个工作。这里我们将将蓝色的大网络拆成两块,通过互蒸馏(cross knowledge distillation)这种方式进一步完成对超分辨率网络的压缩。右图是具体的定性和定量的结果。

43d7ea6cca1e765520c1ed9e2701ba87.png

这篇发表在期刊Pattern Recognition上的文章所做的事情是对深度模型进行量化。最极致的量化叫做二值化(binarization),即对每个参数只用+1和-1两个值来表示。如果每个参数都只是+1和-1,那么网络计算中矩阵的乘法将可以变为加减法,这样就比较适用于类似FPGA这种对于乘法不友好的硬件系统中。但是二值化也会带来一定的坏处,由于每个参数取值范围变小,整个网络的性能会有极大的下降。我们在将网络二值化的同时,为网络加一些辅助的并行结构,这些并行结构是通过网络搜索出来的,也都是一些二值化的分支,即图中红色的部分。加入并行结构后一方面让二值化的性能有了提升,另一方面也让计算增量保持在可控的范围内。利用下方的公式,综合考量精度(accuracy)、特征图相似性(similarity)和复杂度(complexity)三个方面,构造目标函数,在提高精度的前提下尽量减小复杂度,从而达到模型精度和复杂度的平衡。最近我们也在尝试使用重参数化的方式,将这些增加的结构合并到以前的网络当中,从而使网络结构不发生改变的前提下,进一步增加网络二值化的效果。

5ec0192d2aad8e7e3442ad4b05db16cb.png

在ResNet-18上可以看到,使用上述方法可以把90.5%的识别准确度变成92.8%,同时计算量没有提升特别多。

214e1d7cbfbc14635a9ad92bb2611b41.png

我们也是比较早做Transformer压缩的实验室。Transformer压缩的第一步是用矩阵理论对Transformer中Q、K、V三个矩阵进行分解,用小的矩阵相乘和相加代替大矩阵的相乘。通过一些理论推导,证明在特定场合下相比原有的矩阵计算准确度上界会有一定提升。压缩的第二步是减掉Transformer网络里的跳线。通过这两个相对简单的压缩方式完成对Transformer网络的压缩,同时将其用在智能视觉问答任务中。

a62686db697434e9d892bbdb8b3cd5d1.png

这是一些定量和定性结果的比较,可以看到我们的算法在保留原来性能的同时大幅度减少了网络的计算量。

07201a475ec4ef09581918dfb1031889.png

8816dea64759113717762a1ebe4e6bf8.png

最后,讲一下我认为这个领域可能有前途的未来发展方向。

首先,利用神经网络压缩技术弥补大规模语言和视觉基础模型的不足是迫在眉睫的方向。大模型消耗过多的计算量和存储量,如何将大模型变小是一个重要的科学问题。一些具体的问题包括,如果大模型是可以做100种任务的通才,那么如何将其转变为只能做1种任务小模型,也就是专才?这里有很多空间,值得继续挖掘。

第二,针对流行的特定任务网络进行压缩,例如Nerf和扩散模型等。但是,如果我们不能在方法上有所创新,只是一昧追逐流行的网络进行压缩,也会陷入内卷的困境。

第三,我认为软硬结合的的网络压缩算法是值得深入研究的方向。将硬件参数和硬件结构作为优化函数的一部分写入到网络压缩算法中,这样压缩出来的网络就能够直接适配到专门的硬件上。

第四,神经网络压缩算法和通信领域的结合。例如增量压缩,即设计神经网络压缩算法,在发送端首先传输网络最重要的部分,接收端首先收到一个识别精度较低的模型;随着更多的传输,接收端能逐步接收到越来越精确的模型。这个想法与图像或视频的压缩类似,可以完成神经网络模型在不同环境和资源下的个性化部署。

最后,我比较关注的是理论方面的研究,我暂且把它称为深度神经网络的信息论。目前的模型压缩算法设计主要靠经验,欠缺理论基础。一个重大的理论问题是,对于特定的任务、数据和网络架构,实现特定的精度所需要的最小计算是多少?这个问题当然是有一个明确的答案,但目前我们离这个答案仍然非常遥远。就像香农的信息论在通信领域的基础地位一样,我们也期待深度神经网络的信息论早日诞生。

我的演讲就到这里,以下是我们实验室的网页、联系方式,以及一些开源的代码,欢迎有兴趣的听众和我们联系。谢谢大家。


83b76ff8737a3f51595cf8a50fc0a519.jpeg

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

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

相关文章

链表(3):双链表

引入 我们之前学的单向链表有什么缺点呢? 缺点:后一个节点无法看到前一个节点的内容 那我们就多设置一个格子prev用来存放前面一个节点的地址,第一个节点的prev存最后一个节点的地址(一般是null) 这样一个无头双向…

Golang 实现接口和继承

小猴子继承了老猴子,这样老猴子拥有的能力包括字段,方法就会自动的被老猴子继承。 小猴子不需要做任何处理就可以拿到老猴子的字段和它的方法,因为是继承关系。 但是小猴子还会其他的技能,比如还会像小鸟一样飞翔,希…

VR全景营销颠覆传统营销,让消费者身临其境

随着VR的普及,各种VR产品、功能开始层出不穷,并且在多个领域都有落地应用,例如文旅、景区、酒店、餐饮、工厂、地产、汽车等,在这个“内容为王”的时代,VR全景展示也是一种新的内容表达方式。 VR全景营销让消费者沉浸式…

计算机毕业设计选什么题目好?springboot 职业技术学院图书管理系统

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

【深度学习实验】卷积神经网络(八):使用深度残差神经网络ResNet完成图片多分类任务

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 构建数据集(CIFAR10Dataset) a. read_csv_labels() b. CIFAR10Dataset 2. 构建模型(FeedForward&#x…

SQL开发笔记之专栏介绍

Sql是用于访问和处理数据库的标准计算机语言,使用SQL访问和处理数据系统中的数据,这类数据库包括:Mysql、PostgresSql、Oracle、Sybase、DB2等等,数据库无非围绕着“增删改查”的核心业务进行开发。并且目前绝大多数的后端程序开发…

构建精致 Chrome 插件:开箱即用的 TypeScript 模板 | 开源日报 No.51

tonsky/FiraCode Stars: 72.7k License: OFL-1.1 Fira Code 是一种免费的等宽字体,具有编程连字符。 Fira Code 提供了丰富多样的箭头和标点符号调整功能。Fira Code 支持各种不同的字符变体、风格集和其他字体特性,以满足用户个性化需求。Fira Code …

【Hello Algorithm】暴力递归到动态规划(一)

暴力递归到动态规划(一) 斐波那契数列的动态规划机器人走路初级递归初级动态规划动态规划 先后选牌问题初级递归初级动态规划动态规划 我们可以一句话总结下动态规划 动态规划本质是一种以空间换时间的行为 如果你发现有重复调用的过程 在经过一次之后把…

Spring是什么?为什么要使用Spring?

目录 前言 一、Spring是什么? 1.1 轻量级 1.2 JavaEE的解决方案 二、为什么要使用Spring 2.1 传统方式完成业务逻辑 2.2 使用Spring模式完成业务逻辑 三、为什么使用Spring? 前言 本文主要介绍Spring是什么,并且解释为何要去使用Spring&…

c语言练习87:合并两个有序数组

合并两个有序数组 合并两个有序数组https://leetcode.cn/problems/merge-sorted-array/ 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff…

动态资源平衡:主流虚拟化 DRS 机制分析与 SmartX 超融合的实现优化

资源的动态调度是虚拟化软件(或超融合软件)中的一项重要功能,主要指在虚拟化集群中,通过动态改变虚拟机的分布,达到优化集群可用性的目标。这一功能以 VMware vSphere 发布的 Distributed Resource Scheduler&#xff…

day62:ARMday9,I2c总线通信

作业&#xff1a;按键中断实现LED1、蜂鸣器、风扇 key_in.c: #include "key_in.h"void gpio_init() {//RCC使能//GPIOERCC->MP_AHB4ENSETR | (0x1<<4);//GPIOBRCC->MP_AHB4ENSETR | (0x1<<1);//PE10、PB6、PE9输出模式GPIOE->MODER & ~(0…

AutoGPT:让 AI 帮你完成任务事情 | 开源日报 No.54

Significant-Gravitas/AutoGPT Stars: 150.4k License: MIT AutoGPT 是开源 AI 代理生态系统的核心工具包。它采用模块化和可扩展的框架&#xff0c;使您能够专注于以下方面&#xff1a; 构建 - 为惊人之作打下基础。测试 - 将您的代理调整到完美状态。查看 - 观察进展成果呈…

基于SpringBoot的网上订餐系统

基于SpringBoot的网上订餐系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 【主要功能】 角色&#xff1a;用户、管理员管理员&#xff1a;登录、个人中心、会员管理、…

TensorFlow入门(十二、分布式训练)

1、按照并行方式来分 ①模型并行 假设我们有n张GPU,不同的GPU被输入相同的数据,运行同一个模型的不同部分。 在实际训练过程中,如果遇到模型非常庞大,一张GPU不够存储的情况,可以使用模型并行的分布式训练,把模型的不同部分交给不同的GPU负责。这种方式存在一定的弊端:①这种方…

sklearn处理离散变量的问题——以决策树为例

最近做项目遇到的数据集中&#xff0c;有许多高维类别特征。catboost是可以直接指定categorical_columns的【直接进行ordered TS编码】&#xff0c;但是XGboost和随机森林甚至决策树都没有这个接口。但是在学习决策树的时候&#xff08;无论是ID3、C4.5还是CART&#xff09;&am…

嵌入式养成计划-40----C++菱形继承--虚继承--多态--模板--异常

九十四、菱形继承 94.1 概念 菱形继承又称为钻石继承&#xff0c;是由公共基类派生出多个中间子类&#xff0c;又由中间子类共同派生出汇聚子类&#xff0c;汇聚子类会得到多份中间子类从公共基类继承下来的数据成员&#xff0c;会造成空间浪费&#xff0c;没有必要。 所以存…

工程师必须记住的电路元件符号及英语翻译

很多电子小白第一次接触印刷电路板&#xff08;PCB&#xff09;时&#xff0c;总会头痛那些密密麻麻的元件字母符号&#xff0c;这些电路元件符号基本上都是采用英语缩写&#xff0c;下面我们来看看这些电路元件的英语符号有哪些&#xff1f; 电阻器&#xff08;Resistor&#…

C++入门指南:类和对象总结友元类笔记(下)

C入门指南:类和对象总结友元类笔记&#xff08;下&#xff09; 一、深度剖析构造函数1.1 构造函数体赋值1.2 初始化列表1.3 explicit关键字 二、static成员2.1 概念2.2 特性 三、友元3.1 友元函数3.2 友元类 四、 内部类4.1 概念4.2 特征 五、拷贝对象时的一些编译器优化六、深…

Linux进阶-加深进程印象

目录 进程 进程状态转换 进程状态 启动新进程 system()函数 system.c文件 Makefile文件 执行过程 fork()函数 函数原型 fork.c文件 Makefile文件 执行过程 exec系列函数 函数原型 execl.c文件 Makrfile文件 执行过程 终止进程 exit()函数和_exit()函数 头…