【模型压缩和加速综述】A Survey of Model Compression and Acceleration for Deep Neural Networks

原始题目 A Survey of Model Compression and Acceleration for Deep Neural Networks
中文名称 深度神经网络的模型压缩和加速综述
发表时间 2017年10月23日v1, 2020年6月14日v9
平台 arXiv
来源 微软、清华、华中科技大学
文章链接 https://arxiv.org/pdf/1710.09282.pdf

摘要

深度神经网络(DNNs)最近在许多视觉识别任务中取得了巨大的成功。然而,现有的深度神经网络模型计算成本高,内存 密集(intensive),阻碍(hindering)了它们在内存资源低的设备或延迟要求严格的应用程序中的部署。因此,一个自然的想法是在深度网络中进行模型压缩和加速,而不显著降低模型性能。在过去的五年里,这一领域取得了巨大的(tremendous)进展。在这篇文章中,我们回顾了最近的压缩和加速DNN模型的技术。一般来说,这些技术分为四类:

  • 参数剪枝和量化
  • 低秩 因式分解(factorization)
  • 转移/紧凑(transferred/compact) 卷积滤波器
  • 知识蒸馏

首先介绍了参数剪枝和量化方法,然后介绍了其他技术。对于每类,我们还提供了有关性能、相关应用、优点和缺点的深刻分析。然后我们介绍了一些最近成功的方法,例如 动态容量网络 和 随机深度网络。在此之后,我们调查了评估指标,用于评估模型性能的主要数据集和最近的 benchmark 测试工作。最后,对本文进行了总结,并对今后工作中存在的问题和可能的方向进行了探讨。

1. 引言

近年来,深度神经网络受到了广泛的关注,被应用于不同的应用中,在许多任务中取得了显著的精度提升。这些工作依赖于具有 数百万甚至数十亿参数 的深度网络,而具有非常高计算能力的 GPUs 的可用性在其成功中起着关键作用。例如,Krizhevsky 等人的工作[1] 在2012年ImageNet挑战中使用了一个包含 6000 万个参数的网络,具有 5 个卷积层和 3 个全连接层,取得了突破性的成果。通常,使用 NVIDIA K40 机器在 ImagetNet 数据集上训练整个模型需要 2 到 3 天。另一个例子是 Labeled Faces in the Wild (LFW) 数据集上的 top 人脸验证结果 是用包含 数亿 参数的网络获得的,使用卷积、局部连接和全连接层[2],[3]的混合。训练这样的模型以获得合理的性能也是非常耗时的。在只依赖于全连接层的体系架构中,参数的数量可以增长到数十亿[4]。

随着神经网络的规模越来越大、层数越来越多、节点越来越多,降低网络的存储和计算成本变得越来越重要,特别是对于 在线学习 和 增量学习 等实时应用。此外,近年来,虚拟现实、增强现实和智能可穿戴设备取得了重大进展,为研究人员解决在资源有限(如 memory, CPU, energy, bandwidth )的便携式设备上部署深度学习系统的基本挑战创造了前所未有的机会。高效的深度学习方法可以对人工智能的分布式系统、嵌入式设备和 FPGAs 产生重大影响。例如,具有 50 个卷积层的 ResNet-50[5] 在处理图像时需要超过 95MB 的内存存储和超过 38亿次 浮点数乘法。在去除部分冗余权重后,网络仍能正常工作,但节省了 75% 以上的参数和 50% 以上的计算时间。对于像手机和 FPGAs 这样只有几兆字节资源的设备,如何压缩在它们上使用的模型也很重要。

实现这些目标需要来自许多学科的联合解决方案,包括但不限于机器学习、优化、计算机体系结构、信号处理和硬件设计。文中回顾了近年来深度神经网络压缩和加速方面的工作,这些工作引起了深度学习界的广泛关注,并取得了许多进展。

根据其性质,将这些方法分为四类: 参数修剪和量化、低秩分解、转移/紧凑卷积滤波器和知识蒸馏。

  • 基于参数剪枝和量化的方法探索模型参数中的冗余,试图去除冗余和不关键的参数。
  • 基于低秩分解的技术使用矩阵/张量分解来估计 DNNs 提供有用信息的参数。
  • 基于 转移/紧凑卷积滤波器的方法 通过设计 特殊结构的卷积滤波器 来减少参数空间和 存储/计算量。
  • 基于知识蒸馏的方法学习一个蒸馏的模型,并训练一个更紧凑的神经网络,以重现一个更大网络的输出。

在 表1 中,我们简要总结了这四种方法。参数修剪和量化、低秩因式分解和知识蒸馏方法可以部署在具有全连接层和卷积层的 DNN 模型中,实现相当的性能。另一方面,使用 转移/紧凑滤波器 的方法只针对卷积层设计。基于 低秩分解 和 迁移/紧凑滤波器的方法 提供了端到端的流水线,易于在 CPU/GPU 环境下实现。参数修剪和量化使用不同的策略,如二进制编码和稀疏约束来执行任务。

表1 模型压缩和加速的不同方法的总结。

类名 描述 应用 更多细节
参数剪枝和量化 减少对性能不敏感的冗余参数 卷积层和全连接层 对各种设置具有鲁棒性,可以达到良好的性能,可以支持从头开始训练和预训练模型
低秩因式分解 利用矩阵/张量分解估计 信息量大的 参数 卷积层和全连接层 标准化 pipeline 易于实现,可以同时支持从头开始训练和预训练模型
迁移/紧凑卷积滤波器 设计特殊结构的卷积滤波器保存参数 只有卷积层 算法依赖于应用程序,通常可以取得好的表现,只能从零开始训练
知识蒸馏 用大型模型的蒸馏知识训练紧凑的神经网络 卷积层和全连接层 模型性能 对 应用程序和网络结构 较为敏感,只能从零开始训练

在训练协议方面,可以 从预训练模型中提取 基于参数剪枝/量化 和 低秩因子分解的模型,也可以从零开始训练。而 迁移/紧凑滤波器 和 知识蒸馏模型 只能支持从头开始训练。这些方法大多是独立设计的,相互补充。例如,可以将 传输层和参数修剪和量化 部署在一起。另一个例子是,模型量化和二值化 可以与 低秩近似 一起使用,以实现进一步的 压缩/加速。我们将在接下来的几节中分别介绍它们的特性,并分析它们的优缺点。

2. 参数剪枝和量化

早期工作表明,网络剪枝和量化 在降低网络复杂度和解决过拟合问题[6]方面是有效的。在发现剪枝可以为神经网络带来正则化,从而提高泛化能力后,压缩 DNNs 被广泛研究。这些技术可以进一步映射为三个子类: 量化和二值化,网络修剪 和 结构矩阵(quantization and binarization, network pruning, and structural matrix)。

A. Quantization and Binarization

网络量化 通过 减少表示每个权重所需的比特数来压缩原始网络

  • Gong et al. [6] and Wu et al. [7] 将 k-means 标量量化应用于参数值。
  • Vanhoucke et al.[8]表明,8 位 参数量化可以在损失最小精度的情况下获得显著的速度提升。
  • [9]中的工作在基于随机四舍五入的 CNN 训练中使用 16 位定点表示,在分类精度损失不大的情况下,显著减少了内存使用量和浮点运算。
  • [10]中提出的算法通过权重共享对 link 权重进行量化,然后对量化后的权重和 codebook 进行 Huffman 编码,进一步降低码率。如 图1 所示,它首先通过普通网络训练学习连接,然后修剪 small-weight 连接。最后,对网络进行重新训练,为剩余的稀疏连接学习最终权重。该工作在所有基于量化的方法中取得了最先进的性能。
  • 在[11]中,展示了 Hessian weight 可以用来衡量网络参数的重要性,并提出以最小化 Hessian weight 的量化误差来平均聚类参数。量化是一种非常有效的模型压缩和加速方法。
drawing
图1。[10]中提出的三阶段压缩方法: 剪枝、量化和 huffman 编码。输入是原始模型,输出是压缩后的模型。

在每个权重的 1-bit 表示的极端情况下,即二进制权重神经网络。其主要思想是在模型训练过程中直接学习二进制权重或激活。有一些工作直接用二进制权重训练 CNNs,例如 BinaryConnect [12], BinaryNet[13] 和 XNOR[14]。[15]的系统研究表明,用反向传播训练的网络可以对特定的 权重 失真(distortions) 有弹性(resilient),包括二进制权重。

**讨论: **

在处理像 GoogleNet 这样的大型 CNNs 时,二值网络的精度会显著降低。这种二值网络的另一个缺点是现有的二值化方案都是基于简单的矩阵近似,忽略了二值化对精度损失的影响。为了解决这个问题,

  • [16]中的工作提出了一种基于 对角 Hessian 近似的 proximal Newton algorithm,直接最小化二进制 weights 的损失。
  • 在[17]中,通过对 weights 进行随机二值化,并将 隐状态(hidden state)计算中的乘法转换为显著变化,减少了训练阶段浮点乘法的时间。
  • Zhao et al. [18] 提出了 half-wave Gaussian Quantization 来学习低精度网络,取得了很好的效果。

B. Network Pruning

  • 早期的剪枝方法是 Biased Weight Decay[19]。
  • The Optimal Brain Damage [20]和the Optimal Brain Surgeon [21]方法基于损失函数的 Hessian 减少连接数。他们的工作表明,这种修剪比 基于幅度(magnitude-based)修剪(如 weight decay 方法)具有更高的精度。

这个方向的后续趋势是在预训练的 DNN 模型中修剪冗余的、没有有用信息的权重。例如,

  • Srinivas和 Babu[22]探索了神经元之间的冗余性,提出了一种 data-free 的剪枝方法来去除冗余神经元。
  • Han et al. [23] 提出减少整个网络中参数和操作的总数。
  • Chen et al. [24] 提出了一种 HashedNets 模型,使用低成本的哈希函数将权重分组到 hash
    buckets 中进行参数共享。
  • 在[10]中采用深度压缩方法去除冗余连接并对权重进行量化,然后使用霍夫曼编码对量化后的权重进行编码。
  • 在[25]中,提出了一种基于软权值共享的简单正则化方法,将量化和剪枝都包含在一个简单的(再)训练过程中。

上述剪枝方案通常会在 DNNs 中产生连接剪枝。

人们对训练具有稀疏约束的紧凑 DNNs 的兴趣也越来越大。在优化问题中,这些稀疏约束通常以 \(l_0\)\(l_1\) 范数正则项的形式引入。

  • [26]中的工作对卷积滤波器施加 组稀疏性约束,以实现结构化 brain Damage ,即以组的方式修剪卷积核的条目。
  • 在[27]中,在训练阶段引入了神经元的 组稀疏正则化器,以学习具有精简滤波器的紧凑 CNNs。
  • Wen et al.[28]在每一层上添加了一个 结构化稀疏正则化器,以减少 不重要的滤波器、通道甚至层。
  • 滤波器级剪枝中,上述工作均使用\(l_1\)\(l_2\)范数正则化。[29]算法利用 \(l_1\) 范数对不重要的滤波器进行筛选和剪枝。

讨论:

网络剪枝的使用存在一些问题。

  • 首先,与一般方法相比,使用 \(l_1\)\(l_2\) 正则化进行剪枝需要更多的迭代才能收敛。
  • 此外,所有修剪标准都需要手动设置层的灵敏度,这需要对参数进行微调,对于某些应用程序可能很麻烦。
  • 最后,网络剪枝通常能够减少模型大小,但不能提高效率(训练或推理时间)。

image

image

image

image

参考:

https://www.cnblogs.com/shixiangwan/p/9015010.html

https://github.com/cedrickchee/awesome-ml-model-compression

posted @ 2023-02-22 16:30  cold_moon  阅读(425)  评论(0编辑  收藏  举报