敞开生长之旅!这是我参加「日新方案 2 月更文应战」的第 18 天,点击查看活动详情。

一,前言

学术界的 SOTA 模型在落地部署到工业界使用到进程中,一般是要面临着低推迟(Latency)、高吞吐(Throughpout)、高效率(Efficiency)应战的。而模型紧缩算法可以将一个巨大而复杂的预练习模型转化为一个精简的小模型,然后削减对硬件的存储、带宽和核算需求,以达到加快模型推理和落地的意图。

近年来主流的模型紧缩办法包含:数值量化(Data Quantization,也叫模型量化)模型稀少化(Model sparsification,也叫模型剪枝 Model Pruning)常识蒸馏(Knowledge Distillation)轻量化网络设计(Lightweight Network Design)和 张量分化(Tensor Decomposition)

其间模型剪枝是一种使用十分广的模型紧缩办法,其可以直接削减模型中的参数量。本文会对模型剪枝的界说、开展进程、分类以及算法原理进行具体的介绍。

1.1,模型剪枝界说

模型剪枝(Pruning)也叫模型稀少化,不同于模型量化对每一个权重参数进行紧缩,稀少化办法是尝试直接“删去”部分权重参数。模型剪枝的原理是经过除掉模型中 “不重要” 的权重,使得模型削减参数量和核算量,一起尽量保证模型的精度不受影响。

二,深度神经网络的稀少性

生物研讨发现人脑是高度稀少的。比方 2016 年前期经典的剪枝论文[1]就曾提到,生理学上发现对于哺乳动物,婴儿期产生许多的突触衔接,在后续的生长进程中,不怎么用的那些突触就会退化消失。结合深度神经网络是模仿人类大脑结构,和该生理学现象,咱们可以认为深度神经网络是存在稀少性的[1]。

依据深度学习模型中可以被稀少化的目标,深度神经网络中的稀少性首要包含权重稀少激活稀少梯度稀少

2.1,权重稀少

在大多数神经网络中,经过对网络层(卷积层或许全衔接层)对权重数值进行直方图核算,可以发现,权重(练习前/练习后)的数值散布很像正太散布(或许是多正太散布的混合),且越接近于 0,权重越多,这便是权重稀少现象。

论文[1]认为,权重数值的绝对值巨细可以看做重要性的一种度量,权重数值越大对模型输出奉献也越大,横竖则不重要,删去后模型精度的影响应该也比较小。

模型压缩-剪枝算法详解

当然,权重剪枝(Weight Pruning)虽然影响较小但不等于没有影响,且不同类型、不同顺序的网络层,在权重剪枝后影响也各不相同。论文[1]在 AlexNet 的 CONV 层和 FC 层的做了剪枝灵敏性实验,成果如下图所示。

模型压缩-剪枝算法详解

从图中实验成果可以看出,卷积层的剪枝灵敏性大于全衔接层,且第一层卷积层最为灵敏。论文作者推测这是由于全衔接层自身参数冗余性更大,第一层卷积层的输入只有 3 个通道所以比起他卷积层冗余性更少。

即使是移除绝对值接近于 0 的权重也会带来推理精度的丢失,因此为了康复模型精度,一般在剪枝之后需求再练习模型。典型的模型剪枝三段式作业 pipeline 流程[1]和剪枝前后网络衔接变化如下图所示。

模型压缩-剪枝算法详解

剪枝算法常用的是三段式作业 pipeline: 练习、剪枝、微调。

上述算法进程中,其间重点问题有两个,一个是怎么评价衔接权重的重要性,另一个是怎么在重练习中康复模型精度。对于评价衔接权重的重要性,有两个典型的办法,一是依据神经元衔接权重数值起伏的办法[1],这种办法原理简单;二是使用目标函数对参数求二阶导数标明参数的奉献度[10]。

依据神经元衔接权重起伏的厕率好像在20世纪90年代就被提出来了,常识在韩松论文中[1]又被使用了。

剪枝Three-Step Training Pipeline 中三个阶段权重数值散布如下图所示。微调之后的模型权重散布将部分地康复正态散布的特性。

模型压缩-剪枝算法详解

深度网络中存在权重稀少性:(a)剪枝前的权重散布;(b)剪除0值附近权值后的权重散布;(c)网络微调后的权重散布从单峰变成了双峰。

值得注意的是,韩松提出的权重稀少办法是细粒度稀少,去只能在专用硬件上-EIE完结加快作用,是对硬件不友爱的稀少办法,由于其稀少后得到的权重矩阵是高度非规矩的矩阵,如下图所示。

模型压缩-剪枝算法详解

2.2,激活稀少

前期的神经网络模型-前期的神经网络模型——多层感知机(MLP)中,多选用Sigmoid函数作为激活单元。可是其复杂的核算公式会导致模型练习过慢,且随着网络层数的加深,Sigmoid 函数引起的梯度消失和梯度爆破问题严重影响了反向传达算法的实用性。为解决上述问题,Hinton 等人于 2010 年在论文中[2]提出了 ReLU 激活函数,并在 AlexNet模型[3]中第一次得到了实践。

后续伴随着 BN 层算子的提出,“2D卷积-BN层-ReLU激活函数”三个算子串联而成的基本单元就构成了后来 CNN 模型的根底组件,如下述 Pytorch 代码片段所示:

前期是 “2D卷积-ReLU激活函数-池化” 这样串接的组件。

# cbr 组件示例代码
def convbn_relu(in_planes, out_planes, kernel_size, stride, pad, dilation):
    return nn.Sequential(
        nn.Conv2d(in_planes, out_planes, 
                  kernel_size=kernel_size, stride=stride, 
                  padding=dilation if dilation > 1 else pad, 
                  dilation=dilation, bias=False),
        nn.BatchNorm2d(out_planes),
        nn.ReLU(inplace=True)
        )

ReLU 激活函数的界说为:

ReLU(x)=max(0,x)ReLU(x) = max(0, x)

该函数使得负半轴的输入都产生 0 值的输出,这可以认为激活函数给网络带了另一种类型的稀少性;别的 max_pooling 池化操作也会产生相似稀少的作用。即不管网络接收到什么输入,大型网络中很大一部分神经元的输出大多为零。激活和池化稀少作用如下图所示。

模型压缩-剪枝算法详解

即 ReLU 激活层和池化层输出特征图矩阵是稀少的。

受以上现象启发,论文[4]经过了一些简单的核算,发现不管输入什么样图画数据,CNN 中的许多神经元都具有十分低的激活。作者认为零神经元很可能是冗余的redundant),可以在不影响网络整体精度的情况下将其移除。 由于它们的存在只会增加过度拟合的时机和优化难度,这两者都对网络有害。

由于神经网络具有乘法-加法-激活核算进程,因此其输出大部分为零的神经元对后续层的输出以及终究成果的奉献很小。

由此,提出了一种神经元剪枝算法。首先,界说了 APoZ (Average Percentage of Zeros)指标来衡量经过 ReLU 映射后神经元零激活的百分比。假定 Oc(i)O_c^{(i)}标明网络第 ii 层中第 cc 个通道(特征图),那么第 ii 层中第 cc 个的滤波器(论文中用神经元 neuron)的 APoZ 界说如下:

APoZc(i)=APoZ(Oc(i))=∑kN∑jMf(Oc,j(i)(k=0))NMAPoZ^{(i)}_c = APoZ(O_c^{(i)}) = \frac{\sum_k^N \sum_j^M f(O^{(i)}_{c,j}(k=0))}{N \times M}

这儿,f(⋅)f\left( \cdot \right) 对真的表达式输出 1,反之输出 0,MM 标明 Oc(i)O_c^{(i)} 输出特征图的巨细,NN 标明用于验证的图画样本个数。由于每个特征图均来自一个滤波器(神经元)的卷积及激活映射成果,因此上式衡量了每个神经元的重要性。

下图给出了在 VGG-16 网络中,利用 50,000 张 ImageNet 图画样本核算得到的 CONV5-3 层的 512 个和 FC6 层的 4096 个 APoZ 指标散布图。

这儿更高是指更接近于模型输出侧的网络层。

模型压缩-剪枝算法详解

可以看出 CONV5-3 层的大多数神经元的该项指标都散布在 93%附近。实际上,VGG-16 模型中共有 631 个神经元的 APoZ 值超过90%。激活函数的引进反映出 VGG 网络存在着许多的稀少与冗余性,且大部分冗余都产生在更高的卷积层和全衔接层。

激活稀少的作业流程和稀少前后网络衔接变化如下图所示。

模型压缩-剪枝算法详解

作业流程沿用韩松论文[1]提出的 Three-Step Training Pipeline,算法进程如下所示:

  1. 首先,网络在常规进程下进行练习,每层中的神经元数量依据经历设置。 接下来,咱们在大型验证数据集上运行网络以获得每个神经元的 APoZ。
  2. 依据特定标准修剪具有高 APoZ 的神经元。 当一个神经元被修剪时,与神经元的衔接被相应地移除(拜见上图右边红色框)。
  3. 神经元修剪后,修剪后的网络使用修剪前的权重进行初始化。 修剪后的网络表现出必定程度的功能下降。因此,在最后一步中,咱们从头练习网络以加强剩余的神经元以增强修剪后网络的功能。

总结:和权重剪枝的代表作[1]随机权重剪枝办法(神经元和衔接都剪枝)比较,激活剪枝的代表作[4],其剪枝的直接目标是神经元(neuron),即随机的将一些神经元的输出置零,属于结构化稀少。

2.3,梯度稀少

大模型(如BERT)由于参数量巨大,单台主机难以满足其练习时的核算资源需求,往往需求借助散布式练习的方式在多台节点(Worker)上协作完结。选用散布式随机梯度下降(Distributed SGD)算法可以答应 NN 台节点共同完结梯度更新的后向传达练习使命。其间每台主机均保存一份完整的参数拷贝,并担任其间 1N\frac{1}{N} 参数的更新核算使命。依照必定时刻间隔,节点在网络上发布自身更新的梯度,并获取其他 N−1N-1 台节点发布的梯度核算成果,然后更新本地的参数拷贝。

随着参加练习使命节点数意图增多,网络上传输的模型梯度数据量也急剧增加,网络通信所占据的资源开销将逐渐超过梯度核算自身所耗费的资源,然后严重影响大规模散布式练习的效率。别的,大多数深度神经网络模型参数的梯度其实也是高度稀少的,有研讨[5]标明在散布式 SGD 算法中,99.9% 的梯度交换都是冗余的。例如下图显示了在 AlexNet 的练习前期,各层参数梯度的幅值仍是较高的。但随着练习周期的增加,参数梯度的稀少度明显增大

AlexNet 模型的练习是选用散布式练习。深度神经网络练习中的各层梯度值存在高度稀少特性。

模型压缩-剪枝算法详解

由于梯度交换本钱很高,由此导致了网络带宽成为了散布式练习的瓶颈,为了战胜散布式练习中的通信瓶颈,梯度稀少(Gradient Sparsification)得到了广泛的研讨,其完结的途径包含:

  1. 选择固定份额的正负梯度更新:在网络上传输依据必定份额选出的一部分正、负梯度更新值。Dryden 等人2016年的论文。
  2. 预设阈值:在网络上只是传输那些绝对值起伏超过预设阈值的梯度。Heafield (2017)论文。

深度梯度紧缩(DGC)[5],在梯度稀少化根底上选用动量批改、本地梯度取舍、动量因子遮盖和 warm-up练习 4 种办法来做梯度紧缩,然后削减散布式练习中的通信带宽。其算法作用如下图所示。

模型压缩-剪枝算法详解

2.4,小结

虽然神经网络稀少化现在在学术界研讨和工业界落地已经取得了写进展,可是现在并没有一个完全确认的常识体系结构,许多曾经 paper 上的结论是可能被后续新论文打破和重建的。以下是对主流权重剪枝、激活剪枝和梯度剪枝的总结:

  1. 前期的权重剪枝是非结构化的(细粒度稀少)其对并行核算硬件-GPU支撑并不友爱,乃至可能完全没有作用,其加快作用需求在专用加快器硬件(一般是 ASIC)上完结,比方韩松提出的 EIE 加快硬件[6]。
  2. 更高层的网络冗余性更大,且卷积层的冗余性比全衔接层的冗余性更少。所以 ResNet、MobileNet 等网络的剪枝难度大于 VGG、AlexNet 等。
  3. 神经元剪枝比较权重剪枝更易丢失模型精度,练习阶段的梯度则拥有最多的稀少度。
  4. 典型的模型剪枝三段式作业 pipeline 流程并不必定是准确的,最新的研讨标明,对于随机初始化网络先进行剪枝操作再进行练习,有可能会比剪枝预练习网络获得更高的稀少度和精度。此需求更多研讨。

神经网络的权重、激活和梯度稀少性总结如下表所示:

模型压缩-剪枝算法详解

三,结构化稀少

前期提出的衔接权重稀少化[1]办法对错结构化稀少(即细粒度稀少,也叫非结构化剪枝),其直接将模型巨细紧缩10倍以上,理论上也可以削减10倍的核算量。可是,细粒度的剪枝带来的核算特征上的“不规矩”,对核算设备中的数据拜访和大规模并行核算十分不友爱,尤其是对 GPU硬件!

论文[1]作者提出了专用加快器硬件 EIE 去支撑他的细粒度权重剪枝算法。

由于,“非结构化稀少”(Unstructured Sparsity)首要经过对权重矩阵中的单个或整行、整列的权重值进行修剪。修剪后的新权重矩阵会变成稀少矩阵(被修剪的值会设置为 0)。因此除非硬件渠道和核算库可以支撑高效的稀少矩阵核算,不然剪枝后的模型是无法获得真正的功能提高的!

由此,许多研讨开始探究经过给神经网络剪枝增加一个“规矩”的束缚-结构化剪枝(Structured pruning),使得剪枝后的稀少形式更加适合并行硬件核算。 “结构化剪枝”的基本修剪单元是滤波器或权重矩阵的一个或多个Channel。由于结构化剪枝没有改动权重矩阵自身的稀少程度,现有的核算渠道和结构都可以完结很好的支撑。

这种引进了“规矩”的结构化束缚的稀少形式一般被称为结构化稀少(Structured Sparsity),在许多文献中也被称之为粗粒度稀少(Coarse-grained Sparsity)或块稀少(Block Sparsity),结构化和非结构化稀少针对的都是权重参数。

3.1,结构化稀少分类

结构化剪枝又可进一步细分:可所以 channel/filter-wise,也可所以 shape-wise 等。

过滤器 filter,也叫滤波器,相当于 3 维对卷积核。输出的 feature map 的数量/通道数等于滤波器数量。

3.1.1,Channel/Filter 剪枝

channel 剪枝的作业是最多的,channel 剪枝和 filter 剪枝其实意义是相同的,一个过滤器移除了,对应输出 feature map 的一个通道天然也被移除,反之相同。

filter (channel) pruning (FP) 属于粗粒度剪枝(或许叫结构化剪枝 Structured Pruning),依据 FP 的办法修剪的是过滤器或许卷积层中的通道,而不是对单个权重,其原始的卷积结构不改动,所以剪枝后的模型不需求专门的算法和硬件就可以加快运行。

CNN 模型中通道剪枝的中心在于怎么削减中间特征的数量,其间一个经典思路是依据重要性因子,即评价一个通道的有效性,再配合束缚一些通道使得模型结构自身具有稀少性,然后依据此进行剪枝。

依据重要性因子的办法进行通道剪枝,和前面非结构化剪枝中的依据权重起伏的办法来进行衔接剪枝相似,都有点主观性太强。

论文Learning Efficient Convolutional Networks through Network Slimming[7] 认为 conv-layer 的每个channel 的重要程度可以和 bn 层关联起来,假如某个 channel 后的 bn 层中对应的 scaling factor 满足小,就说明该 channel 的重要程度低,可以被疏忽。如下图中橙色的两个通道被剪枝。

模型压缩-剪枝算法详解

BN 层的核算公式如下:

B=1m∑1mxiB2=1m∑1m(xi−B)2ni=xi−BB2+zi=ni+=B2+xi+(−BB2+)\begin{aligned} \mu_B &= \frac{1}{m}\sum_1^m x_i \\ \sigma^2_B &= \frac{1}{m} \sum_1^m (x_i-\mu_B)^2 \\ n_i &= \frac{x_i-\mu_B}{\sqrt{\sigma^2_B + \epsilon}} \\ z_i &= \gamma n_i + \beta = \frac{\gamma}{\sqrt{\sigma^2_B + \epsilon}}x_i + (\beta – \frac{\gamma\mu_{B}}{\sqrt{\sigma^2_B + \epsilon}}) \end{aligned}

其间,bn 层中的 \gamma 参数被作为 channel-level 剪枝 所需的缩放因子(scaling factor)。

3.1.2, 阶段等级剪枝

滤波器等级的剪枝只能作用于残差结构块内部的卷积层,CURL[9]中指出只进行滤波器等级的剪枝会导致模型构成一个沙漏状、两头宽中间窄的结构,这样的结构会影响参数量和核算量。在这种情况下,阶段等级的剪枝能弥补滤波器等级剪枝的不足。

一个阶段中的残差结构块是紧密联系在一起的,如下图所示。

模型压缩-剪枝算法详解

当一个阶段的输出特征产生变化时(一些特征被抛弃),其对应的每个残差结构的输入特征和输出特征都要产生相应的变化,所以整个阶段中,每个残差结构的第一个卷积层的输入通道数,以及最后一个卷积层的输出通道数都要产生相同的变化。由于这样的影响只限定在当时的阶段,不会影响之前和之后的阶段,因此咱们称这个剪枝进程为阶段等级的剪枝(stage-level pruning)。

阶段等级的剪枝加上滤波器等级的剪枝可以使网络的形状更均匀,而避免出现沙漏状的网络结构。此外,阶段等级的剪枝可以剪除更多的网络参数,这给网络进一步紧缩提供了支撑。

3.2,结构化稀少与非结构化稀少比较

与非结构化剪枝比较,结构化剪枝一般一般会献身模型的准确率和紧缩比。结构化稀少对非零权值的方位进行了约束,在剪枝进程中会将一些数值较大的权值剪枝,然后影响模型准确率。 “非规矩”的剪枝则符合了神经网络模型中不同巨细权值的随机散布,这对深度学习模型的准确度至关重要。打开来讲便是:

  1. 非结构化稀少具有更高的模型紧缩率和准确性,在通用硬件上的加快作用不好。由于其核算特征上的“不规矩”,导致需求特定硬件支撑才能完结加快作用。
  2. 结构化稀少虽然献身了模型紧缩率或准确率,但在通用硬件上的加快作用好,所以其被广泛使用。由于结构化稀少使得权值矩阵更规矩更加结构化,更利于硬件加快。

模型压缩-剪枝算法详解

综上所述,深度神经网络的权值稀少应该在模型有效性和核算高效性之间做权衡

参考资料

  • [1]:Learning both Weights and Connections for Efficient
  • [2]:Rectified Linear Units Improve Restricted Boltzmann Machines
  • [3]:ImageNet Classification with Deep Convolutional
  • [4]:Network Trimming: A Data-Driven Neuron Pruning Approach towards Efficient Deep Architectures
  • [5]:Deep Gradient Compression: Reducing the Communication Bandwidth for Distributed Training
  • [6]:韩松博士毕业论文-EFFICIENT METHODS AND HARDWARE FOR DEEP LEARNING
  • [7]:Learning Efficient Convolutional Networks through Network Slimming
  • [8]: 第1章 结构化剪枝总述
  • [9]: Neural network pruning with residual-connections and limited-data
  • [10]: Optimal Brain Damage
  • [11]: AI-System: 11.3 模型紧缩与硬件加快