模型压缩-模型蒸馏、模型剪枝、模型量化

一、模型蒸馏

1.1 蒸馏简介

  知识蒸馏是指通过教师模型指导学生模型训练,通过蒸馏的方式让学生模型学习到教师模型的知识,最终使学生模型达到或媲美教师模型的准确度。

  在模型压缩中,教师模型是一个预训练好的复杂的模型,而学生模型是一个规模较小的模型。如分类任务中,由训练好的教师模型在相同的数据下,通过将教师模型对样本的预测值作为学生模型的预测目标,指导学生模型学习,这个预测值一般指教师网络输出的类概率。教师模型的参数规模大,能够表达更好的泛化能力,学生模型的参数规模比较小,如果用通常的方法直接训练,往往达不到教师模型的泛化能力,所以通过教师模型的指导,让学生模型学习教师模型的泛化能力,以达到或媲美教师模型的精准度。


1.2 知识种类

  • 输出特征知识:教师模型输出的相关内容,对于分类模型,输出特征知识可以是logits或者软目标,输出特征知识是以目标为导向,让学生模型学习教师模型提供的答案,以学习教师模型对目标的泛化能力;
  • 中间特征知识:指教师模型的中间层上输出的相关信息,如果将输出特征知识比做是问题的答案,那么中间特征知识可以看做问题的求解过程,将中间特征知识作为学习目标,可以让学生模型学习与教师模型类似的求解过程,也可以使用隔层、逐层和逐块等不同粒度大小,将教师模型的中间特征知识迁移给学生模型;
  • 关系特征知识:指教师模型不同层和不同样本数据之间的关系知识,关系特征知识中,学生模型所学习的内容,不局限模型的某一层,而是对模型多层的信息进行模仿,关系特征知识可以比做求解问题的方法;
  • 结构特征知识:结构特征知识是教师模型的完整知识体系,不仅包括上面提到的各种特征知识,还包括教师模型的区域特征分布等知识,结构特征知识通过多种知识的互补,促使学生模型达到与教师模型一样丰富的预测能力。

1.3 蒸馏分类

  • 离线蒸馏:可以理解为知识渊博的老师给学生传授知识。早期的知识蒸馏方法都属于离线蒸馏,将一个预训练好的教师模型的知识迁移到学生网络,通常包括两个阶段。第一阶段在蒸馏前,教师网络在训练集上进行训练;第二阶段,教师模型通过logits层信息或者中间信息提取知识引导学生网络进行训练。优点是实现起来比较简单,形式上通常是单向的知识迁移,即从教师网络到学生模型。缺点是教师网络通常比较庞大,模型复杂,需要大量的训练时间,需要注意教师网络和学生网络之间的差异,当差异过大时,学生网络可能很难学习好这些知识。
  • 在线蒸馏:可以理解为教师和学生一起学习。离线蒸馏方法虽然简单有效,但也存在上述一些问题,为了克服离线蒸馏的局限性,提出了在线蒸馏,以进一步改善学生模型的性能。在线蒸馏中,教师模型和学生模型同时更新,并且整个知识蒸馏框架是端到端可训练的,教师模型可以不是预训练模型,在没有现成的大教师网络模型的时候,可以考虑使用在线蒸馏。
  • 自蒸馏学生学习自己的知识。在自蒸馏中,教师和学生模型使用相同的网络,自蒸馏可以看作在线蒸馏的一种特殊情况,因为教师网络和学生网络使用的是相同的模型。自蒸馏分为两类,第一类是使用不同样本信息进行相互蒸馏,其他样本的软标签,可以避免网络过拟合,甚至能通过最小化不同样本间的预测分布来提高网络性能。另一类是单个网络的网络层间进行自蒸馏,通常的做法是使用深层网络的特征,去指导浅层网络的学习。

 

1.4 蒸馏架构

学生网络一般是:

  1.教师网络的简化版本,具有较少的层和每层中较少的信道。

  2.教师网络的量化版本,其中网络结构被保留。

  3.具有高效基本操作的小型网络。

  4.具有优化的整体网络结构的小型网络。

  5.与教师相同的网络。

 

1.5 蒸馏算法
  为了改进在更复杂的环境中传递知识的过程,已经出现许多不同的知识蒸馏算法。

  • 对抗蒸馏:对抗网络中的鉴别器用来估计样本来自训练数据分布的概率,而生成器试图使用生成的数据样本来欺骗鉴别器。受此启发,已经出现许多基于对抗的知识蒸馏方法,以使教师模型和学生模型能够更好的理解真实的数据分布。
  • 多教师蒸馏:不同的教师框架可以为学生网络提供不同的有用的知识。在训练学生网络期间,多个教师网络可以单独地,也可以整体地用于蒸馏。为了传递来自多个教师的知识,最简单的方法是使用来自所有教师的平均响应作为监督信号。
  • 交叉模式蒸馏:在训练或测试期间,某些数据或标签可能不可用。因此在不同的模型之间传递知识是很重要的。然而当模型存在差异时,跨模型知识蒸馏是一项具有挑战性的研究。
  • 基于图形的蒸馏:用图作为教师知识的载体,用图来控制教师知识的信息传递。大多数知识蒸馏算法集中于将单个的实例知识从教师传递给学生,而基于图形的知识蒸馏,使用图来探索数据的内在关系,可以传递数据的信息结构知识,然而如何恰当的构造图,来建模数据的知识结构,仍然具有挑战性。
  • 无数据蒸馏:为了克服由隐私、合法性、安全性和保密性问题等原因引起的不可用数据的问题,出现了一些无数据知识蒸馏的方法。无数据蒸馏中的合成数据通常是从预训练教师模型的特征表示中生成的。尽管无数据蒸馏在数据不可用的情况下显示出巨大的潜力,但是如何生成高质量的多样化训练数据,以提高模型的泛化能力,仍是一个很大的挑战。
  • 量化蒸馏:一个大的高精度的教师网络将知识传递给一个小的低精度的学生网络。为了确保小的学生网络精确的模仿大的教师网络,首先在特征图上量化教师网络,然后将知识从量化的教师转移到量化的学生模型。
  • 其他知识蒸馏算法:基于注意力的蒸馏、终身蒸馏,NAS蒸馏等。

 

1.6 蒸馏流程 

  1.训练教师模型。

  2.在高温T下,教师网络产生soft lables,学生网络产生soft prediction,同时在T=1下学生网络产生hard prediction。

  3.用步骤二生成的soft lables和soft prediction计算 distillation loss,用hard prediction和hard labley计算student loss,用这两个损失同时训练学生网络。

  4.设置T=1,用学生网络做线上推理。

 

二、模型剪枝

2.1 剪枝简介

  过参数化主要是指在训阶段,在数学上需要进行大量的微分求解,去捕捉数据中的微小的变化信息,一旦完成迭代式的训练之后,网络模型在推理的时候不需要这么多参数,而剪枝算法正是基于过参数化的理论基础提出来的。剪枝算法核心思想就是减少网络模型中的参数量和计算量,同时尽量保证模型的性能不受影响。

 

2.2 剪枝步骤 
  对模型剪枝有三种常见做法:
  1.训练一个模型->对模型进行剪枝->对剪枝后的模型进行微调(最常见);
  2.在模型训练过程中进行剪枝->对剪枝后的模型进行微调;
  3.进行剪枝->从头训练剪枝后的模型。
  剪枝可以进行细粒度剪枝、向量剪枝、核剪枝、滤波器剪枝等不同的剪枝算法。其中很重要的一点是在剪枝之后,对网络模型进行评估,看是否符合要求。剪枝之前需要确定需要剪枝的层,设定一个剪枝阈值或者比例,在具体实现上,通过修改代码,加入一个与参数矩阵尺寸一致的mask矩阵,mask矩阵中只有0和1,它的实际作用是微调网络。
  微调是恢复被剪枝操作影响的模型表达能力的必要步骤,结构化剪枝会对原始模型的结构进行调整,因此剪枝后的模型虽然保留了原始模型的参数,但是由于模型结构的改变,模型的表达能力会受到一定程度的影响。具体实现上,在计算的时候先乘以该mask矩阵,mask为1的值将继续训练,并通过反向传播调整梯度,而mask为0的部分因为输出始终为0,则不对后面产生影响。

 

2.3 剪枝分类

2.3.1 结构化剪枝与非结构化剪枝。非结构化剪枝粒度最小,结构化剪枝中的层级、通道级、滤波器级剪枝粒度依次增大。

  • 非架构化剪枝主要是对一些独立的权重或者神经元或者神经元的连接进行剪枝,就是随机剪枝,是粒度最小的剪枝。难点是何如确定要剪枝哪些东西,最简单的方法是定义一个阈值,低于这个阈值的权重被减去,高于的被保留。但是有三个主要缺点:1.阈值与稀疏性没有直接联系;2.不同的层应该具有不同的灵敏度;3.这样设置阈值可能会剪掉太多信息,无法恢复原来的精度。还有一种方法是使用一个拼接函数来屏蔽权重,权重值没有剧烈的变化,而且修剪过程可以与再训练过程融合。非结构化剪枝的优点是剪枝算法简单,模型压缩比高。缺点是精度不可控,剪枝后权重矩阵稀疏,没有专用硬件,难以实现压缩和加速效果。
  • 结构化剪枝 结构化剪枝是有规律、有顺序的。对神经网络,或者计算图进行剪枝,几个比较经典的就是对layer进行剪枝,对channel进行剪枝、对Filter进行剪枝,剪枝粒度依次增大。优点是大部分算法保留原始卷积结构,不需要专用硬件就可以实现。缺点是剪枝算法比较复杂。

2.3.2 静态剪枝与动态剪枝。静态剪枝在推理之前离线执行所有剪枝步骤,而动态剪枝在运行时执行。

  • 静态剪枝在训练后和推理前进行剪枝。在推理过程中,不需要对网络进行额外的剪枝。静态剪枝通过包括三个部分:1.剪枝参数的选择;2.剪枝的方法;3.选择性微调或再训练,提高修剪后的网络的性能,以达到与修剪前网络相当的精度,但可能需要大量的计算时间和能耗。静态剪枝存储成本低,适用于资源有限的边缘设备,但是也存在三个主要问题:1.通道的删除是永久性删除,对于一些较为复杂的输入数据,可能无法达到很好的精度,因为有些通道已经被永久性的剪掉了;2.需要精心设计要剪枝的部分,不然容易造成计算资源的浪费;3.神经元的重要性并不是静态的,而且神经元的重要性很大程度上依赖于输入数据,静态的剪枝很容易降低模型的推理性能。
  • 动态剪枝:网络中有一些奇怪的权重,它们在某些迭代中作用不大,但在其他的迭代却很重要。动态剪枝就是通过动态的恢复权重来得到更好的网络性能。动态剪枝在运行时才决定哪些层、通道、过滤器不会参与进一步的活动。动态剪枝可以通过改变输入数据,来克服静态剪枝的限制,从而潜在的减少计算量、宽带和功耗,而且动态剪枝通常不会执行微调或重新训练。与静态剪枝相比动态剪枝能够显著提高卷积神经网络的表达能力,从而在预测精度方面取得更好的性能。同样动态剪枝也存在一些问题:1.之前有方法通过强化学习来实现动态剪枝,但在训练过程中要消耗非常多的运算资源;2.很多动态剪枝的方法都是通过强化学习的方式来实现的,但是“阀门的开关“是不可微的,也就是说,梯度下降法在这里是用不了的;3.存储成本高,不适用于资源有限的边缘设备。

2.3.3 硬剪枝与软剪枝。都是对filter进行剪枝,是结构化剪枝中粒度最大的剪枝。

  • 硬剪枝在每个epoch之后会将卷积核直接剪掉,被剪掉的卷积核在下一个epoch中不会出现。这类的剪枝算法通常从模型本身的参数出发,寻找或设计出合适的统计量,来表明连接的重要性。通过对重要性的排序等算法,永久删除部分不重要的连接,保留下来的模型即为剪枝模型。但也存在一些问题:1.模型性能降低;2.依赖预先训练的模型。
  • 软剪枝在剪枝后进行训练时,上一个epoch中被剪掉的卷积核在当前epoch训练时仍参与迭代,只是将其参数设置为0,因此那些卷积核不会被直接丢弃。在每轮训练中根据不同的数据,对完整模型进行优化和训练。在每轮之后,为每个加权层计算所有滤波器的L2范数,并将其作为滤波器选择的标准。然后通过将相应的滤波器权重设置为0来修剪所选择的滤波器,随后进行下一轮训练。最后原始的深度神经网络模型被修剪成一个紧凑而有效的模型。软剪枝一般有四个步骤:1.滤波器选择(使用L2范式来评估每个滤波器的重要性,具有较小L2范式的滤波器的卷积结果会导致相对较低的激活值,从而对网络模型的最终预测结果有较小的影响。所以这种具有较小L2范式的滤波器将更容易被剪枝掉);2.滤波器剪枝(将所选滤波器的值设置为0,这可以暂时消除它们对网络输出的影响,然而在接下来的训练阶段这些滤波器仍然可以被更新,保持模型的高性能。在滤波器剪枝的步骤中,可以同时修剪所有加权层。此外,要对所有加权层使用相同的剪枝率);3.重建(在剪枝步骤之后,再训练一轮来重构修剪后的滤波器,修剪滤波器通过反向传播被更新为非零。这样经过软剪枝的模型可以具有与原始模型相当的性能);4.获得紧凑模型(重复以上三个步骤,党模型收敛后可以得到一个包含许多0滤波器的稀疏模型,一个0滤波器对应一个特征图,对应于那些0滤波器的特征图,在推理过程中将总是0,移除这些滤波器以及相应的特征图不会有任何影响)。

 

三、模型量化

3.1 量化简介

       数字精度(如32位浮点数、16位浮点数或8位浮点数或8位整数),所能表示的范围不同。不同的数字精度会影响模型大小和推理时间,范围越大,精度越高,模型越大,推理时间越长。

  卷积神经网络特点:参数量大,计算量大,内存占用多,精度高。

  模型量化就是把高位宽(float32)表示的权值或者激活值用较低位宽来近似表示(int8,int4....)在数值上的体现就是将连续的值离散化。模型量化,降低精度以减少模型尺寸,会存在一定的损失,但有时候需要快速的做输出,并不一定要那么精确。模型量化特点:压缩参数,提升速度,降低内存占用,可接受的精度损失。

  量化有两种,一种是在训练当中进行降低,一种是预训练完成后再降低。一般第二种用的多。在huggingface里面,模型量化分两种,第一种是GGML,为了在CPU上更快更好的训练模型,对CPU推出一种模型量化方式。第二种GPTQ对GPU推出一种量化方式。

 

3.2 量化优点

  1.减小模型大小

  2.降低访存,执行神经网络时大部分时间都用于访存(如取指,访存,写回的时间较长),但在执行神经网络在gpu上的时间很少,量化能降低访存时间。

  3.加快速度,gpu在Pascal架构下支持dp4a指令,可以一次完成4个8比特整型的乘加,Xilinx的DSP框架也会对整型运算加速。

 

3.3 量化分类 

  • 按量化的均匀性:均匀量化(线性量化,每个量化位宽相等)、非均匀量化(非线性量化,量化位宽不等);
  • 按量化的范围:对称量化(最大最小值范围正负对称)、非对称量化(最大最小值范围不对称);
  • 按bit范围:8bit、4bit、2bit、1bit...。
  • 按量化的参数粒度:per-axis/per-channel(权重的每个通道使用单独的量化参数)、per-tensor/per-layer(对于卷积或全连接层有每层独立的量化参数);
  • 按量化位宽:全部采用统一位宽、混合精度(如有的8bit,有的4bit)。
  • 按量化方式:PTQ(post training quantization,后训练量化,将已经训练完的模型直接量化,然后进行推理)、QAT(quantization aware training,量化感知训练,将训练完的模型参数加载到量化后的模型然后再训练微调,训练好之后再用于推理)。

 

3.4 量化方法

  早期量化,将input和weight进行量化,再卷积得到输出结果。输出结果在反向传播传到量化部分时,因为量化是一个不可微分的操作,需要使用直通估计器解决。但是每一层的output受量化的weight和input的影响产生误差,这个output作为下一层的input也被量化从浮点域转换到定点域,继续影响下一层的概率分布。如此下去导致整个网络的输出和原先浮点输出相比差距极大。但是反向传播参数更新的时候,依然在浮点权重上更新,对于复杂网络优化难度极大。

  Google在2018年在CVPR上提出一种新范式,训练时将input和weight的float值量化为int值,再反量化为float值,再卷积得到输出结果,这样会引入量化误差,在训练时会自动调优这个量化误差,训练效果会很好。推理时将input和weight的float值量化到int,再卷积得到结果output,注意需要对output进行移位定点运算,再与下一层进行计算。
  BN折叠量化,BN层折叠到卷积层,折叠进去之后也可以量化。
  ReLU折叠量化,也可以折叠,直接进行量化。
  Add量化,与训练代码无关,所以可以直接在推理框架里量化。
  Concat量化等。

posted @ 2024-08-07 23:17  NLP的小Y  阅读(179)  评论(0编辑  收藏  举报
/*粒子线条,鼠标移动会以鼠标为中心吸附的特效*/