卷积神经网络(Convolutional Neural Networks)特别是深度神经网络(Deep Neural Networks)在计算机视觉任务上发挥着愈发重要的作用。在一个神经网络模型中,通常 包含卷积层、汇合层、全连接层、非线形层等基本结构,通过这些基本结构的堆叠,最 终形成我们所常用的深度神经网络。早在 1998 年,LeCun 等人使用少数几个基本结构组 成 5 层的 LeNet-5 网络[1],并在 MNIST 数据集上得到了 98.9%的分类精度,但此时的深 度神经网络还相对简单,并且只能用于简单的任务上;在 2012 年的 ImageNet 图像分类 竞赛中,AlexNet[2]将深度提高到了 8 层,并且达到了远超传统方法的结果;此后,VGG 团队提出的 VGG-Net[3]进一步加深了网络,使网络最高达到了 19 层。虽然增加网络的 深度能够带来性能的提升,但也不能无限制的增加网络深度,随着网络的加深,梯度消 失会愈发严重,并且模型会变得愈发难以训练。因此在 2016 年,He 等人提出 ResNet[4], 在模型中加入残差结构,并一举将网络的深度提高到 152 层。至此,随着深度学习的研 究逐步推进,神经网络可以变得更宽更深更复杂,与此同时带来更好的表示能力和性能 表现。当一些研究者将模型变得更大、更深时,另一些则考虑在保持模型精度的同时使模 型变得更小、更快,其中一类重要的方法为模型压缩。模型压缩大致上可以分为四类:模型量化、模型剪枝、低秩近似和知识蒸馏。通常来说我们用 32 位浮点数来保存模型,模型量化主要考虑用更小位数来保存模型 参数,通常使用的有 16 位浮点数和 8 位整数,其参数量和计算量都会相应地随着存储位 数而成倍降低;更有甚者,将模型量化成二值网络[5],三元权重[6]或者同或网络[7]。例 如,经过简单量化之后的 MobileNetV1[8]仅仅只有 4-5MB,能够轻松部署在各种移动平台上。
模型剪枝[9,10,11,12]主要分为结构化剪枝和非结构化剪枝,非结构化剪枝去除不重 要的神经元,相应地,被剪除的神经元和其他神经元之间的连接在计算时会被忽略。由 于剪枝后的模型通常很稀疏,并且破坏了原有模型的结构,所以这类方法被称为非结构 化剪枝。非结构化剪枝能极大降低模型的参数量和理论计算量,但是现有硬件架构的计 算方式无法对其进行加速,所以在实际运行速度上得不到提升,需要设计特定的硬件才 可能加速。与非结构化剪枝相对应的是结构化剪枝,结构化剪枝通常以滤波器或者整个 网络层为基本单位进行剪枝。一个滤波器被剪枝,那么其前一个特征图和下一个特征图 都会发生相应的变化,但是模型的结构却没有被破坏,仍然能够通过 GPU 或其他硬件来 加速,因此这类方法被称之为结构化剪枝。低秩近似[13,14,15]将一个较大的卷积运算或者全连接运算替换成多个低维的运算。常用的低秩近似方法有 CP 分解法[13],Tucker 分解[14]和奇异值分解[15]。例如,一个 𝑀 × 𝑁的全连接操作若能近似分解为𝑀 × 𝑑和𝑑 × 𝑁(其中𝑑 ≪ 𝑀, 𝑁)那么这一层全连接 操作的计算量和参数量将被极大地缩减。
知识蒸馏(Knowledge Distillation)[16]通过使用一个足够冗余的教师模型,来将其 知识 “传授”给紧凑的学生模型。在训练时同时使用教师模型的软标签和真实标记的硬 标签来共同训练学生模型,从而能够使学生模型达到接近教师模型的性能,也因此能够 降低达到目标精度所需的计算量和模型大小。上述模型压缩方法能配合使用,一个模型经过结构化剪枝之后,由于其结构没有发 生重要变化,所以能紧接着进行低秩近似以减少参数量和计算量,最后再通过参数量化 进一步减少参数量并加速。近些年来,随着物联网的发展,企业将深度学习模型部署在 嵌入式设备的需求在快速增长,而嵌入式设备计算能力有限,并且由于成本原因希望部 署的模型尽可能地小。模型压缩的意义在于保证精度的同时尽可能减少计算量和参数量, 因此对于嵌入式设备的部署有切实的价值。模型压缩包含很多内容,这里我们将主要关 注剪枝算法中的结构化剪枝。在本章的剩余部分,我们将首先介绍结构化剪枝的一些基 本方式,然后介绍一些经典的和最新的结构化剪枝算法,最后对结构化剪枝的应用和未 来发展进行总结和展望。