深度神经网络 (DNN) 最近在许多视觉识别任务中取得了巨大成功。 然而,现有的深度神经网络模型计算成本高且内存密集,阻碍了它们在内存资源低的设备或具有严格延迟要求的应用程序中的部署。 因此,一个自然的想法是在不显着降低模型性能的情况下在深度网络中进行模型压缩和加速。 过去五年,该领域取得了巨大进展。 在本文中,我们回顾了最近用于压缩和加速 DNN 模型的技术。 一般来说,这些技术分为四类:参数修剪和量化、低秩分解、转移/压缩卷积滤波器和知识蒸馏。 首先介绍参数修剪和量化的方法,然后介绍其他技术。 对于每个类别,我们还提供有关性能、相关应用程序、优缺点的深入分析。 然后我们介绍一些最近成功的方法,例如动态容量网络和随机深度网络。 之后,我们调查了评估矩阵、用于评估模型性能的主要数据集和最近的基准测试工作。 最后,我们总结了本文,讨论剩余的挑战和未来工作的可能方向。
近年来,深度神经网络最近受到了很多关注,被应用于不同的应用程序,并在许多任务中取得了显着的精度提升。 这些工作依赖于具有数百万甚至数十亿参数的深度网络,而具有非常高计算能力的 GPU 的可用性对其成功起着关键作用。 例如,Krizhevsky 等人的工作【1】 在 2012 年 ImageNet 挑战赛中取得突破性成果,该网络包含 6000 万个参数,具有五个卷积层和三个全连接层。 通常,使用 NVIDIA K40 机器在 ImagetNet 数据集上训练整个模型需要两到三天的时间。 另一个例子是LFW 数据集的顶面验证结果是通过包含数亿个参数的网络获得的,使用卷积、局部连接和完全连接层的混合 【2】,【3】。这样同样花费时间,在仅依赖于全连接层的架构中,参数数量可以增长到数十亿【4】。
随着考虑具有更多层和节点的更大的神经网络,降低它们的存储和计算成本变得至关重要,尤其是对于一些实时应用,例如在线学习和增量学习。 此外,近年来虚拟现实、增强现实和智能可穿戴设备取得了重大进展,为研究人员解决将深度学习系统部署到资源有限(例如内存、CPU、 能量、带宽)。 高效的深度学习方法可以对分布式系统、嵌入式设备和人工智能 FPGA 产生重大影响。 例如,具有 50 个卷积层的 ResNet-50在处理图像时需要超过 95MB 的内存用于存储和超过 38 亿次浮点乘法。 丢弃一些冗余权重后,网络仍然照常工作,但节省了 75% 以上的参数和 50% 的计算时间。 对于手机、FPGA等只有几兆资源的设备,如何压缩它们上使用的模型也很重要。
实现这些目标需要来自多个学科的联合解决方案,包括但不限于机器学习、优化、计算机架构、信号处理和硬件设计。 在本文中,我们回顾了最近在压缩和加速深度神经网络方面的工作,这些工作引起了深度学习社区的大量关注,并且在过去几年中已经取得了很多进展。 根据它们的特性,我们将这些方法分为四类:参数修剪和量化、低秩分解、转移/压缩卷积滤波器和知识蒸馏。
基于参数修剪和量化的方法探索模型参数中的冗余,并尝试去除冗余和不重要的参数。 基于低秩分解的技术使用矩阵/张量分解来估计 DNN 的信息参数。 基于转移/紧凑卷积滤波器的方法设计特殊结构的卷积滤波器以减少参数空间并节省存储/计算。 基于知识蒸馏的方法学习蒸馏模型并训练更紧凑的神经网络以重现更大网络的输出。
在表1中,我们简短的摘要了这些方法的类型。参数修剪和量化、低秩分解和知识蒸馏方法可以部署在具有卷积层和全连接层的 DNN 模型中,实现不错的性能。 另一方面,使用转移/压缩滤波器的方法仅适用于卷积层。 基于低秩分解和转移/压缩过滤器的方法提供了端到端的管道,并且可以在 CPU/GPU 环境中轻松实现。 参数修剪和量化使用不同的策略,例如二进制编码和稀疏约束来执行任务。
考虑到训练协议,基于参数剪枝/量化和低秩分解的模型可以从预先训练的模型中提取或从头开始训练。 而转移/压缩过滤器和知识蒸馏模型只能支持从头开始的训练。 这些方法中的大多数都是独立设计的,并且相互补充。 例如,传输层和参数修剪和量化可以一起部署。 另一个例子是,模型量化和二值化可以与低秩近似一起使用,以实现进一步的压缩/加速。 我们将在以下各节中详细描述它们的特性,并分析其优缺点。
表1:
早期的工作表明,网络修剪和量化在降低网络复杂性和解决过拟合问题方面是有效的【6】。 在发现剪枝可以为神经网络带来正则化从而提高泛化能力后,压缩 DNN 得到了广泛的研究。 这些技术可以进一步映射为三个子类别:量化和二值化、网络剪枝和结构矩阵。
网络量化通过减少表示每个权重所需的位数来压缩原始网络。 龚等人【6】 和吴等人【7】 将 k-means标量量化应用于参数值。 万豪克等人【8】表明,参数的 8 位量化可以显着提高速度,同时将精度损失降至最低。【9】中的工作在基于随机舍入的 CNN 训练中使用 16 位定点表示,这显着减少了内存使用和浮点运算,而分类精度损失很小。
【10】中提出的方法使用权重共享对链路权重进行量化,然后将霍夫曼编码应用于量化的权重以及码本以进一步降低速率。 如图1所示,它首先通过正常的网络训练学习连接,然后修剪小权重连接。 最后,重新训练网络以学习剩余稀疏连接的最终权重。 这项工作在所有基于量化的方法中取得了最先进的性能。 在【11】中,表明 Hessian 权重可用于衡量网络参数的重要性,并提出将 Hessian 加权量化误差平均到聚类参数的平均值最小化。 量化是一种非常有效的模型压缩和加速方式。
图1:
在每个权重的 1 位表示的极端情况下,即二进制权重神经网络。 主要思想是在模型训练期间直接学习二进制权重或激活。 有几项工作直接使用二进制权重训练 CNN,例如 BinaryConnect【12】、BinaryNet【13】和 XNOR【14】。【15】中的一项系统研究表明,经过反向传播训练的网络可以对特定的权重失真(包括二进制权重)具有弹性。
讨论:在处理 GoogleNet 等大型 CNN 时,二进制网络的准确性显着降低。 这种二元网络的另一个缺点是现有的二值化方案基于简单的矩阵近似,而忽略了二值化对精度损失的影响。 为了解决这个问题.【16】中的工作提出了一种具有对角 Hessian 近似的近端牛顿算法,即直接最小化与二元权重相关的损失。【17】 中的工作通过随机二值化权重并将隐藏状态计算中的乘法转换为显着变化,减少了训练阶段浮点乘法的时间。 赵等人【18】提出半波高斯量化来学习低精度网络,取得了可喜的结果。
早期的修剪方法是偏置权重衰减【19】。 Optimal Brain Damage【20】和 Optimal Brain Surgeon【21】方法基于损失函数的 Hessian 减少了连接数。 他们的工作表明,这种剪枝比基于幅度的剪枝(例如权重衰减方法)具有更高的准确性。
这个方向的后续趋势是在预训练的 DNN 模型中修剪冗余的、无信息的权重。 例如,Srinivas 和 Babu【22】探索了神经元之间的冗余,并提出了一种无数据修剪方法来去除冗余神经元。 韩等人【23】提出减少整个网络中参数和操作的总数。 陈等人【24】提出了一种 HashedNets 模型,该模型使用低成本哈希函数将权重分组到哈希桶中以进行参数共享。【25】中的深度压缩方法去除冗余连接并量化权重,然后使用霍夫曼编码对量化的权重进行编码。 在【26】中,提出了一种基于软权重共享的简单正则化方法,它在一个简单的训练过程(重新训练或者微调)中包括量化和剪枝。 上述修剪方案通常会在 DNN 中产生连接修剪。
人们对训练具有稀疏约束的紧凑型 DNN 也越来越感兴趣。 这些稀疏约束通常在优化问题中作为 L0 或 L1 范数正则化器引入。【26】 中的工作对卷积滤波器施加了组稀疏约束以实现结构化脑损伤,即以组方式修剪卷积核的条目。 在【27】中,在训练阶段引入了神经元上的群稀疏正则化器,以学习具有减少滤波器的紧凑型 CNN。 温等人。【28】在每一层上添加了一个结构化的稀疏正则化器,以减少琐碎的过滤器、通道甚至层。 在过滤器级修剪中,上述所有工作都使用了 L1 或 L2 范数正则化器。【29】中的工作使用 L1正则来选择和修剪不重要的过滤器。
讨论:使用网络修剪存在一些问题。 首先,使用 L1 或 L2 正则化进行剪枝需要比一般方法更多的迭代来收敛。 此外,所有修剪标准都需要手动设置层的灵敏度,这需要对参数进行微调,并且对于某些应用程序来说可能很麻烦。 最后,网络剪枝通常能够减少模型大小但不能提高效率(训练或推理时间)。
在包含全连接层的架构中,探索全连接层中参数的这种冗余至关重要,这通常是因存消耗的瓶颈。 这些网络层使用非线性变换 f ( x , M ) = σ ( M x ) f(x,M) = σ(Mx) f(x,M)=σ(Mx),其中 σ ( ⋅ ) σ(·) σ(⋅) 是元素级非线性算子, x x x 是输入向量, M M M 是 m × n m×n m×n 参数矩阵【30】。 当 M 是一个大的一般稠密矩阵时,在 O ( m n ) O(mn) O(mn) 时间内存储 m n mn mn 个参数和计算矩阵向量乘积的成本。 因此,修剪参数的一种直观方法是将 x x x 作为参数化结构矩阵强加。 可以使用比 m n mn mn 少得多的参数来描述的 m × n m × n m×n矩阵称为结构化矩阵。 通常,该结构不仅应该降低内存成本,而且还应通过快速矩阵向量乘法和梯度计算显着加速推理和训练阶段。
沿着上面所说的方向,【31】、【32】的工作提出了一种基于循环预测的简单而有效的方法,同时保持有竞争力的错误率。给出一个向量 r r r:
r = ( r 0 , r 1 , . . . , r d − 1 ) r = (r_0, r_1,..., r_{d-1}) r=(r0,r1,...,rd−1)
和一个 R ∈ R d × d R\in{R^{d\times{d}}} R∈Rd×d循环矩阵:
因此内存成本变为 O ( d ) O(d) O(d) 而不是 O ( d 2 ) O(d2) O(d2)。 这种循环结构还可以使用快速傅立叶变换 (FFT) 来加速计算。 给定一个 d d d 维向量 r r r,方程中的上述(1)中的1 层循环神经网络的时间复杂度为 O ( d ∗ l o g d ) O(d*logd) O(d∗logd)。
在【33】中,引入了新颖的自适应快餐变换来重新参数化完全连接层的矩阵向量乘法。 自适应快餐变换矩阵 R ∈ R n × d R ∈R_{n×d} R∈Rn×d 被定义为:
R = S H G Π H B R = SHG Π HB R=SHGΠHB
其中 S S S、 G G G 和 B B B 是随机对角矩阵。 Π ∈ ( 0 , 1 ) d × d Π ∈ {(0,1)}^{d×d} Π∈(0,1)d×d 是随机置换矩阵, H H H 表示 Walsh-Hadamard 矩阵。 使用自适应快餐变换重新参数化具有 d 个输入和 n 个输出的完全连接层,分别把存储和计算成本从 O(nd) 减少到 O(n) 和从 O(nd) 减少到 O(nlog d) 。
【30】 中的工作显示了结构矩阵理论中简约新概念的有效性。 他们提出的方法可以扩展到各种其他结构化矩阵类,包括与多维卷积【35】 相关的块和多级 Toeplitz-like 【34】 矩阵。 遵循这个想法,【36】 为 CNN 提出了一个通用的结构化高效线性层。
缺点:这种方法的一个问题是结构约束通常会损害性能,因为约束可能会给模型带来偏差。 另一方面,如何找到合适的结构矩阵是困难的。 没有理论上的方法可以推导出来。
卷积操作贡献了深度 DNN 中的大部分计算,那么减少了卷积层将提高压缩率以及整体加速。 卷积核可以看作是一个 3D 张量。 基于张量分解的思想是由直觉上推导出来的,即 3D 张量中存在结构空间。 关于全连接层,可以将其视为 2D 矩阵(或 3D 张量),低秩也可以提供帮助。
使用低秩滤波器来加速卷积由来已久,例如高维 DCT(离散余弦变换)和使用张量积的小波系统分别由一维 DCT 变换和一维小波构建。 Rigamonti 等人介绍了学习可分离的一维滤波器。 【37】使用字典学习方法。 对于一些简单的 DNN 模型,【38】中提出了一些卷积核的低秩逼近和聚类方案。 他们在单个卷积层上实现了 2 倍的加速,而分类准确度下降了 1%。【39】中的工作建议使用不同的张量分解方案,报告了 4.5 倍的加速,而文本识别的准确度下降了 1%。
低秩近似是逐层完成的。 一层的参数完成后固定,上面的层根据重构误差准则进行微调。 这些是用于压缩 3D 卷积层的典型低阶方法,如 图 2 所示。按照这个方向,在 【40】中为内核张量提出了典型的 Polyadic (CP) 分解。 他们的工作使用非线性最小二乘法来计算 CP 分解。 在【41】中,提出了一种计算低秩张量分解的新算法,用于从头开始训练低秩约束CNN。 它使用批量归一化 (BN) 来转换内部隐藏单元的激活。 一般来说,【41】(BN Low-rank)中的CP和BN分解方案都可以用来从头开始训练CNN。 但是,它们之间几乎没有区别。 例如,在 CP 分解中找到最好的低秩近似是一个病态问题,有时可能不存在最好的 rank-K(K 是秩数)近似。 而对于BN方案,分解总是存在的。 我们对 表2 中显示的两种方法进行了简单的比较。 实际加速和压缩率用于衡量它们的性能。
表2:
正如我们之前提到的,全连接层可以被视为一个 2D 矩阵,因此上述方法也可以应用于那里。 有几个关于在全连接层中利用低秩的经典著作。 例如,Misha 等人【42】使用低秩方法减少了深度模型中动态参数的数量。 【43】探索了用于声学建模的 DNN 中最终权重层的低秩矩阵分解。 在【3】中,Lu 等人采用截断的 SVD(奇异值分解)来分解全连接层,以设计紧凑的多任务深度学习架构。
**讨论:**基于低秩近似的方法对于模型压缩和加速很简单。 然而,实现并不容易,因为它涉及分解操作,这在计算上是昂贵的。 另一个问题是当前的方法逐层执行低秩逼近,因此无法执行全局参数压缩,这很重要,因为不同层持有不同的信息。 最后,与原始模型相比,分解需要大量的模型重新训练才能实现收敛。
依据特征表达对输入图像的平移不变性这个特性,CNN 被证明是参数有效的,这是成功训练非常深的模型而不会出现严重过拟合的关键。 尽管目前缺乏强有力的理论,但大量经验证据支持了平移不变性和卷积权重共享对于良好的性能预测都很重要这个观点。 使用传递卷积滤波器来压缩 CNN 模型的想法受到 【44】 中最近工作的启发,该工作引入了等变群论。 设 x x x 为输入, Φ ( ⋅ ) Φ(·) Φ(⋅) 为网络或层, T ( ⋅ ) T(·) T(⋅) 为变换矩阵。 等价的概念定义为:
表明通过变换 T ( ⋅ ) T(·) T(⋅) 变换输入 x x x 然后将其传递到网络或层 Φ ( ⋅ ) Φ(·) Φ(⋅) 应该给出与首先通过网络映射 x 然后变换表示相同的结果。 请注意,在方程式(10)中,变换 T ( ⋅ ) T(·) T(⋅)和 T ′ ( ⋅ ) T'(·) T′(⋅)不一定相同,因为它们对不同的对象进行操作。 根据这个理论,对层或滤波器 Φ ( ⋅ ) Φ(·) Φ(⋅) 应用变换来压缩整个网络模型是合理的。 根据经验观察,深度 CNN 还可以通过将特定变换 T ( ⋅ ) T(·) T(⋅) 应用于一小组基础滤波器来使用大量卷积滤波器,因为它可以充当模型的正则化器。
遵循这个方向,最近提出了许多重新设计以从一组基础构建卷积层过滤器 【44】–【47】。 它们的共同点是变换 T ( ⋅ ) T(·) T(⋅) 属于仅在卷积滤波器的空间域中操作的函数族。 例如,【46】 中的工作发现 CNN 的较低卷积层学习了冗余滤波器来提取输入信号的正负相位信息,并将 T ( ⋅ ) T(·) T(⋅) 定义为简单的否定函数:
其中 W x W_x Wx 是基础卷积滤波器, W x − W^{−}_x Wx− 是由激活与 W x W_x Wx 的激活相反并在最大池化操作后选择的移位组成的滤波器。 通过这样做,【46】 中的工作可以轻松地在所有卷积层上实现 2 倍的压缩率。 还表明,否定变换充当强正则化器以提高分类精度。 直觉是,具有成对正负约束的学习算法可以产生有用的卷积滤波器而不是冗余滤波器。 在【47】中,观察到来自卷积核的响应幅度在网络中具有广泛多样的模式表示,用单一阈值丢弃较弱的信号是不合适的。 因此,提出了一种多偏置非线性激活函数,以低计算成本在特征空间中生成更多模式。 变换 T ( ⋅ ) T(·) T(⋅) 定义为:
其中 δ δ δ 是多偏差因子。 【48】 中的工作考虑了 90° 的倍数旋转和水平/垂直翻转的组合:
其中 W T θ W^{T_θ} WTθ是将原始滤波器旋转角度θ∈{90,180,270}的变换矩阵。 在【44】中,变换被推广到从数据中学习到的任何角度,θ直接从数据中获得。 作品【48】和【44】都可以达到很好的分类性能。
【45】 中的工作将 T ( ⋅ ) T(·) T(⋅) 定义为应用于 2D 滤波器的一组平移函数:
其中 T ( ⋅ , x , y ) T(·,x,y) T(⋅,x,y) 表示 ( x , y ) (x,y) (x,y) 沿其空间维度对第一个操作数的平移,并在边界处进行适当的零填充以保持形状。 所提出的框架可用于:
表3 使用 VGGNet(16 层)作为基线模型,简要比较了不同方法与迁移卷积滤波器的性能。 结果报告在 CIFAR-10 和 CIFAR-100 数据集上,错误率为 Top-5。 据观察,它们可以减少参数,而分类精度几乎没有下降或完全没有下降。
表3:
讨论:对于将变换约束应用于卷积滤波器的方法,有几个问题需要解决。 首先,这些方法可以在宽/扁平架构(例如,VGGNet、AlexNet)上实现有竞争力的性能但不是薄/深的(例如,ResNet)。 其次,迁移假设有时太强而无法指导学习,导致某些情况下结果不稳定。
使用紧凑滤波器进行卷积可以直接降低计算成本。 关键思想是用紧凑块替换松散和过参数的过滤器以提高速度。 在【49】中使用了将3×3卷积分解为两个1×1卷积,取得了显着的加速。 SqueezeNet 【50】 被提议用 1 × 1 卷积代替 3 × 3 卷积,这创建了一个具有约 50 个参数的紧凑型神经网络。 MobileNets 【51】中也采用了类似的技术。
据我们所知,利用知识转移(KT)来压缩模型是由 Caruana 等人首先提出的【52】。 他们训练了一个带有标记伪数据的强分类器的压缩/集成模型,并重现了原始更大网络的输出。但这项工作仅限于浅层模型。 这个想法最近在 【53】 中被用作知识蒸馏 (KD),以将深层和广泛的网络压缩成较浅的网络,其中压缩模型模仿了复杂模型学习的功能。 基于 KD 的方法的主要思想是通过softmax 学习类分布输出,将知识从大型教师模型转变为小型教师模型。
【54】 中的工作引入了 KD 压缩框架,该框架通过遵循学生-教师范式来简化深度网络的训练,其中学生根据教师输出的软化版本受到惩罚。 该框架将一组教师网络压缩成一个具有相似深度的学生网络。 学生接受了预测输出和分类标签的训练。 尽管它很简单,但 KD 在各种图像分类任务中表现出令人鼓舞的结果。 【55】 中的工作旨在通过利用深度神经网络来解决网络压缩问题。 它提出了一种训练细而深的网络的方法,称为 FitNets,以压缩宽而浅(但仍然深)的网络。 该方法扩展了思想,以允许更薄和更深的学生模型。 为了从教师网络的中间表示中学习,FitNet 让学生模仿教师的完整特征图。 然而,这种假设过于严格,因为教师和学生的能力可能相差很大。
上述所有方法都在 MNIST、CIFAR-10、CIFAR-100、SVHN 和 AFLW 基准数据集上进行了验证,实验结果表明这些方法匹配或优于教师的表现,同时需要明显更少的参数和乘法。
沿着这个提炼知识的方向有几个扩展。 【56】中的工作训练了一个参数化学生模型来近似蒙特卡罗老师。 所提出的框架使用在线训练,并使用深度神经网络作为学生模型。 与之前使用软化标签概率表示知识的工作不同,【57】 使用更高隐藏层中的神经元表示知识,它保留了与标签概率一样多的信息,但更紧凑。 【58】 中的工作通过将知识从以前的网络即时转移到每个新的更深或更广的网络来加速实验过程。 这些技术基于神经网络规范之间的功能保留转换的概念。 扎戈鲁伊科等。 【59】 提出了注意力转移(AT)来放松 FitNet 的假设。 他们转移了作为完整激活摘要的注意力图。
讨论:基于 KD 的方法可以使更深的模型更浅,并有助于显着降低计算成本。 但是,也有一些缺点。 其中之一是 KD 只能应用于具有 softmax 损失函数的任务,这阻碍了它的使用。 另一个缺点是,与其他类型的方法相比,基于 KD 的方法通常获得的性能较低。
我们首先总结了利用类注意力机制【60】 的工作,该机制可以通过学习选择性地关注或“关注”几个与任务相关的输入区域来显着减少计算。 在 【61】 中,引入了动态深度神经网络 (D2NN),这是一种前馈深度神经网络,它根据输入选择并执行 D2NN 神经元的子集。 动态容量网络 (DCN) 【62】 结合了低容量的小子网和高容量的大子网。 注意力机制用于引导高容量子网络关注与任务相关的区域。 通过这样做,模型的大小已经显着减小。 按照这个方向,【63】 中的工作引入了条件计算的思想,它只通过一个稀疏门控的专家混合层(MoE)计算一些重要神经元的梯度。
还有其他尝试通过用全局平均池化 【45】、【64】 替换全连接层来减少神经网络的参数数量。 通过采用这种思想,诸如 GoogleNet 或 Network in Network 之类的网络架构可以在多个基准测试中获得最先进的结果。 然而,这些架构并未充分优化网络内部计算资源的利用率。 Szegedy 等人【64】注意到了这个问题。 激励他们增加网络的深度和宽度,同时保持计算预算不变。
【65】中的工作针对具有空间变化计算时间的基于残差网络的模型,称为随机深度,这使看似矛盾的设置能够训练浅层网络并在测试时使用深度网络。它从非常深的网络开始,而在训练期间,对于每个小批量,随机丢弃一个层子集并使用身份函数绕过它们。 按照这个方向,【66】 中的工作提出了一个具有随机深度的金字塔残差网络。 在【67】中,吴等人。 提出了一种方法,可以学习在推理过程中动态选择要执行的深层网络的哪些层,以最好地减少总计算量。 维特等人。 利用具有自适应推理图的卷积网络以根据输入图像自适应地定义其网络拓扑 【68】。
其他减少卷积开销的方法包括使用基于 FFT 的卷积 【69】 和使用 Winograd 算法 【70】 的快速卷积。 翟等人【71】提出了一种称为随机空间采样池化的策略,它通过更通用的随机版本加速池化操作。 赛丹等人基于逆双边滤波器【72】的思想,提出了一种新的卷积神经网络池化层,称为细节保留池化(DPP)。 这些工作只是为了加速计算而不是减少内存存储。 MobileNetV2 【73】 提出了新颖的反向残差结构。
在过去的几年中,深度学习社区在基准测试方面做出了巨大的努力。 用于 CNN 压缩和加速的最著名模型之一是 Alexnet【1】,它偶尔被用于评估压缩性能。 其他流行的标准模型包括 LeNets 【74】、All-CNN-nets 【75】 和许多其他模型。 LeNet-300-100 是一个全连接网络,有两个隐藏层,每个隐藏层有 300 和 100 个神经元。 LeNet-5 是一个卷积网络,具有两个卷积层和两个全连接层。 最近,越来越多的最先进的架构被用作许多工作的基线模型,包括网络中的网络 (NIN) 【76】、VGG 网络 【77】 和残差网络 (ResNet) 【78】。 表4总结了几种典型压缩方法中常用的基线模型。
表4:
衡量模型压缩和加速质量的标准标准是压缩率和加速率。 假设 a 是 a是 a是原始模型 M M M的参数个数, a ∗ a^∗ a∗是压缩模型 M ∗ M^∗ M∗的参数个数,则 M ∗ M^∗ M∗对 M M M的压缩率 α ( M , M ∗ ) α(M,M∗) α(M,M∗)为:
另一个广泛使用的衡量标准是多篇论文 【31】、【36】 中定义的索引空间节省,如:
其中 β ( M , M ∗ ) β(M,M^∗) β(M,M∗) 是定义的空间节省率。
类似地,给定 M M M 的运行时间 s s s 和 M ∗ M^∗ M∗ 的 s ∗ s^∗ s∗,加速率 δ ( M , M ∗ ) δ(M,M^∗) δ(M,M∗) 定义为:
大多数工作使用每个 epoch 的平均训练时间来衡量运行时间,而在 【31】、【36】 中,使用平均测试时间。 通常,压缩率和加速率高度相关,因为较小的模型通常会导致训练和测试阶段的计算速度更快。
一个好的压缩方法有望以更小的参数和更少的计算时间实现与原始模型几乎相同的性能。 然而,对于具有不同 CNN 设计的不同应用,参数大小和计算时间之间的关系可能会有所不同。 例如,观察到对于具有全连接层的深度CNN,大部分参数都在全连接层中; 而对于图像分类任务,浮点运算主要在前几个卷积层,因为每个过滤器都与整个图像进行卷积,通常在开始时非常大。 因此,网络的压缩和加速应该针对不同的应用程序关注不同类型的层。
我们总结了最近在压缩和加速深度神经网络 (DNN) 方面的努力。 在这里,我们将讨论有关如何选择不同压缩方法、技术挑战和未来工作可能的解决方案的更多细节。
没有黄金标准来衡量哪种方法最好。 如何选择合适的方法实际上取决于应用程序和要求。 以下是我们可以提供的一些一般性建议:
我们简单摘要了面临的挑战:
为了解决超参数配置问题,我们可以依靠最近的神经架构搜索策略【79】, 【80】。 该框架提供了一种机制,允许算法自动学习如何在感兴趣的问题中利用结构。 在【81】中已经尝试利用强化学习来有效地对设计空间进行采样并改善模型压缩。
关于CNNs在不同硬件平台上的使用,提出一些硬件感知的方法是一个方向。 王等人【82】提出了硬件感知自动量化 (HAQ),以在设计循环中获取硬件加速器的反馈。 可以应用类似的想法使 CNN 更适用于不同的平台。 【83】中的工作直接学习大规模目标任务的架构和基于目标硬件的性能。
通道修剪在 CPU 和 GPU 上都提供了效率优势,因为不需要特殊的实现。 但处理输入配置也具有挑战性。 一种可能的解决方案是使用基于训练的通道修剪方法 【84】,该方法侧重于在训练期间对权重施加稀疏约束。 此外,对于深度 CNN 而言,从头开始训练此类方法的成本很高。 在 【85】 中,作者提供了一种迭代的两步算法来有效地修剪每一层中的通道。 【86】 中的工作将缩放因子与每个通道相关联,并在训练期间对这些缩放因子进行正则化以自动识别不重要的通道。 刘等人【87】表明,修剪过的架构本身更为重要,修剪可以用作架构搜索范式。
在教师模型中探索新类型的知识并将其转移到学生模型对于知识蒸馏 (KD) 方法很有用。 与直接减少和传递参数不同,传递神经元的选择性知识可能会有所帮助。 一种选择是推导出一种方法来选择与任务相关的基本神经元 【88】、【89】。 最近,在 【90】 中尝试了对比损失而不是 KL 散度进行蒸馏。 对于具有卷积滤波器和结构矩阵的方法,我们可以得出结论,变换位于仅对空间维度进行运算的函数族中。 因此,为了解决强加的先验问题,一个解决方案是在两个方面提供上述方法的概括:
除了图像分类任务,人们也在其他任务中调整压缩模型 【73】、【91】、【92】。 还有一些关于深度自然语言模型的工作【93】、【94】。 我们希望看到更多针对具有更大深度网络的应用程序(例如,视频和图像帧 【95】、【96】、视觉 + 语言 【97】 和 GANs 【98】、【99】)的工作。
作者要感谢审稿人和更广泛的社区对本次调查的反馈。 特别感谢清华大学自动化系赵虹对论文修改的帮助。