李宏毅机器学习第十三周


摘要

本周的学习内容涵盖了神经网络压缩技术的多个方面,包括网络剪枝、知识蒸馏、参数量化、架构设计以及动态计算。在网络剪枝部分,深入研究了基本方法,重点关注了权重剪枝和神经元剪枝的技术。知识蒸馏方面,学习了学生和教师模型的概念,以及如何通过蒸馏方法将大模型的知识传递给小模型,还讨论了集成和温度参数的重要性。参数量化部分,探讨了基本方法和二元权值的应用。在架构设计中,介绍了低秩近似和切除分离卷积的技术,包括方法和直观解释。最后,学习了动态计算的概念,了解了如何在运行时根据输入数据的特性来调整计算过程。


Abstract

This week’s learning encompassed various aspects of neural network compression techniques, including network pruning, knowledge distillation, parameter quantization, architecture design, and dynamic computation. In the section on network pruning, an in-depth exploration of fundamental methods was conducted, with a focus on techniques such as weight pruning and neuron pruning. Regarding knowledge distillation, the concept of student and teacher models was covered, along with the methodology for transferring knowledge from large models to smaller ones through distillation, along with discussions on ensemble methods and temperature parameters. In the parameter quantization section, discussions revolved around the fundamental methods and the application of binary weight quantization. In the domain of architecture design, techniques like low-rank approximation and depthwise separable convolution were introduced, along with both their methodologies and intuitive explanations. Lastly, the concept of dynamic computation was studied, understanding how computation processes can be adjusted at runtime based on input data characteristics.


1.Network Compression

未来有可能将深度学习技术应用于一些移动设备上,但是这些设备有可能存储空间或者资源受到限制,不能存放过深或者过大的模型,也或者受限于计算能力,network不能有太多层或者太多参数,所以说network compression这件事非常重要,下面章节就介绍一些常用的 network compression 的方法。

2.Network Pruning(剪枝)

2.1 Base method

网络剪枝怎么具体做呢?
如下图所示:

  1. 预先训练一个比较庞大的模型。
  2. 评估每个weight和neuron的重要性:比如计算L1和L2范数来衡量Weight的数值大小,观察neuron的输出变化。
  3. 按照参数重要性排序,Remove不重要的参数。不过这可能会导致准确率的下跌,所以一次不能移除太多,否则很难恢复。
  4. 将缩小的模型用训练资料再Fine-tune(微调)一次,这样可以减小Remove带来的损失。
  5. 如果缩小的模型没有达到要求,就重新从步骤2开始做一次。
    在这里插入图片描述
    为何不直接训练小模型,而要对大模型进行剪枝呢?
    如下图,初始化一个Random init红色网络,然后得到一个Trained网络,再对这个网络做剪枝,获得一个Pruned subnetwork。如果就仅仅以此subnetwork网络结构来重新随机初始化参数之后再训练得到绿色网络,效果就远不如之前的Pruned subnetwork。但是如果将Random init红色网络的初始参数用于subnetwork网络,那么最后效果又会和Pruned subnetwork相同:
    在这里插入图片描述
    可以理解:一个规模的大的网络模型相当于一系列小的网络模型的组合(有不同的初始参数),有的小模型可以训练起来,有的训练不起来,而剪枝操作是从中选择了一个最好的小模型,和买彩票一样,你买的越多中奖的概率就越大。

2.2 Weight Pruning

如果是weight pruning,那么这会使得模型不易实现,也不易用GPU加速
因为这样的话模型就不是一个矩阵的形式,那么无论是pytorch这种深度学习框架,还是依靠矩阵运算来加速的GPU,都无法实现
如果只是将prune的weight用0表示,那么模型参数的规模还是不变的,如下图所示。
在这里插入图片描述

2.3 Neuron Pruning

如果是neuron pruning,那么只是减掉矩阵的一定的维度,依然很方便地实现GPU加速
在这里插入图片描述

3.Knowledge Distillation(知识蒸馏)

3.1 Student and Teacher

训练一个大网络,用小网络(Student Net)学习大网络。并计算两者之间的cross-entropy,使其最小化,从而可以使两者的输出分布相近。
teacher提供了比label data更丰富的资料,比如teacher net不仅给出了输入图片和1很像的结果,还说明了1和7长得很像,1和9长得很像;所以,student跟着teacher net学习,是可以得到更多的information的。
为什么这样有用?因为小网络学的是一个基于大网络的 distillation 。不仅仅学到一个输出神经元的价值,而是多个神经元的输出,如下图所示。
在这里插入图片描述

3.2 Ensemble

在实际生活中,设备往往放不下太多的model,这时就可以使用Knowledge Distillation的思想,使用student net来对teacher进行学习,在实际的应用中,只需要student net的model就好。
将一些model 所得的结果平均起来当作teacher。
在这里插入图片描述

3.3 Temperature

如图所示左边算式,三个不同的输入输出的三个预测值有两个是近似的,进行改进,加入参数T,令其为100,再次输入三个初始值,得到的预测值是完全可以区分的。
要是按照下图左侧的输出(y‘1 y’2 y’3)学习,那和根据label data学习没有本质的不同,所以需要下图右边的操作,将其输出调整一下,并且不影响结果。
在这里插入图片描述

4.Parameter Quantization(参数量化)

4.1 Base Method

  • 使用更少的bit的来存储一个参数。

  • 权值聚类:使用聚类中心来代替整个类的值,这样可以减少参数的储存,如下图所示。
    在这里插入图片描述

  • 使用多的参数用比较少的bit来表示,使用少的参数用比较多的bit来表示,比如哈夫曼编码。

4.2 Binary Weight(二元权值)

Binary Weights是以一种更加极致的思路来对模型进行压缩,即每个节点只用1或-1来表示,即只用+1,-1表示一个Weight。
下面简单介绍一下Binary Connect的思路,如下图示,灰色节点表示使用binary weight的神经元,蓝色节点可以是随机初始化的参数,也可以是真实的权重参数。
在这里插入图片描述

第一步,先计算出和蓝色节点最接近的二元节点,并计算出其梯度方向(红色箭头)
第二步,蓝色节点的更新方向则是按照红色箭头方向更新,而不是按照他自身的梯度方向更新。
最后,在满足一定条件后(例如训练之最大次数),用离得最近的Binary Weight(二元权重)作为结果即可。

5.Architecture Design(架构设计)

调整network的结构使得其只需要较少的参数,李宏毅老师认为这是实际中最有效的做法。

5.1 Low Rank Appropriation(低秩近似)

下图是低秩近似的简单示意图,左边是一个普通的全连接层,可以看到权重矩阵大小为M×NM×N,而低秩近似的原理就是在两个全连接层之间再插入一层K。是不是很反直观?插入一层后,参数还能变少?
在这里插入图片描述

可以用发现这个新插入一层后的参数数量为: N×K+K×M=K×(M+N),因为K<M,K<N,并且原来的参数量是M×N,所以参数减少了。

注意:低秩近似之所以叫低秩,是因为原来的矩阵的秩最大可能是min(M,N),而新增一层后可以看到矩阵U和V的秩都是小于等于K 的,知道有矩阵秩运算公式 rank(AB)≤min(rank(A),rank(B)),所以相乘之后的矩阵的秩一定是小于等于K 。
那么这样会带来什么影响呢?那就是原先全连接层能表示更大的空间,而现在只能表示小一些的空间,会限制原来的NN能做的事情。

5.2 Depthwise Separable Convolution(切除分离卷积)

5.2.1 Method

在介绍这个方法前先回顾一下标准CNN一个卷积层需要多少参数。如下图所示,Input feature map是2通道的数据,这里使用了4组2通道的33的Filter,来得到了4组44的output feature map。因为Filer实际等价于权值W,所以参数就是计算Filter的参数,一共72个。
在这里插入图片描述
第一步是Depthwise Convolution(切除卷积),如下图所示:使用同样的2通道Input feature map,但是Filer仅设为单层;Input feature map是多少通道,则使用多少个Filer,用1个Filter去配对Input feature map的1个通道做卷积,最终会获得2组44的output feature map。
在这里插入图片描述
因为第一步没有考虑Filer之间的关系,所以第二步就需要考虑进来。
第二步是Pointwise Convolution(逐点卷积),如下图所示:第二步和一般的卷积操作是一样的。这里对第一步的输出的2组4
4的output feature map做卷积,但是仅使用11的Filer,最后可以获得4组44的output feature map。
在这里插入图片描述
Depthwise Separable Convolution的输入输出与标准CNN的是一样的,但是由上图计算得到最终该方法使用的参数仅为:18+8=26个。

5.2.2 Intuitive Explanation

更直观的解释一下Depthwise Separable Convolution与标准CNN有什么关系。如下图,对一般的卷积操作来说,output feature map上的一个点等于Input feature map上2层3*3的矩阵Dot Product(点乘)92个参数之后的结果。而Depthwise Separable Convolution的output feature map上的一个点来源是中间的“hidden layer”来的,那该方法可以类比上文全连接神经网络的Low rank approximation的做法,核心就是将计算进行拆分,共用部分参数。
在这里插入图片描述
计算这两种方法之间参数规模的比例,如下图所示。参数规模会缩小到1/kernel size。
在这里插入图片描述

6.Dynamic Computation(动态计算)

该方法的主要思路是如果目前的资源充足(比如你的手机电量充足),那么算法就尽量做到最好,比如训练更久,或者训练更多模型等;反之,如果当前资源不够(如电量只剩10%),那么就先算出一个过得去的结果。
在这里插入图片描述
方式1:训练很多个network模型,根据需求选择不同的network模型。
方式2:训练一个network模型,但是将每一个Hidden Layer 上加一个Classifier,如下图所示。
在这里插入图片描述
可以根据运算资源来选择用哪个层输出,资源多则可以用的层数多,反之则少。或者也可以让对简单可识别的图片使用一层输出,对不容易识别的图片使用多层network,进行动态调整。


总结

本周的学习内容涵盖了神经网络压缩技术的多个方面,强调了如何通过剪枝、知识蒸馏、参数量化、架构设计和动态计算等方法来减小模型的计算和存储开销,同时保持模型性能。这些技术对于在资源受限的环境中部署深度学习模型具有重要意义,为提高模型的效率和可部署性提供了有力支持。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值