模型压缩--概述
2020-03-12 17:37
141 查看
目前在深度学习领域分类两个派别,一派为学院派,研究强大、复杂的模型网络和实验方法,为了追求更高的性能;另一派为工程派,旨在将算法更稳定、高效的落地在硬件平台上,效率是其追求的目标。复杂的模型固然具有更好的性能,但是高额的存储空间、计算资源消耗是使其难以有效的应用在各硬件平台上的重要原因。
工业层面
当前各大互联网公司都开始注意深度学习模型在工业上的落地。模型压缩工具开始在各家的生产工具中进入主流,并且各家也开源了对应的工具。具体如下:
- 百度PaddleSlim: https://github.com/PaddlePaddle/PaddleSlim 基于百度PaddlePaddle的一个模型压缩工具。提供量化、蒸馏、剪枝、模型结构搜索、硬件延时搜索等功能。功能强大、接口比较简单,对熟悉paddle的开发者比较友好。
- 腾讯Pocketflow:https://github.com/Tencent/PocketFlow 腾讯基于TensorFlow开发的一个模型压缩工具,功能有限,很久没更新
- 微软NNI:https://github.com/microsoft/nni 微软的模型压缩,网络结构搜索,网络剪裁工具。相对来说,功能比较完善,支持多个平台。
- 谷歌auto-sklearn:https://github.com/keras-team/autokeras 基于keras的一个自动学习平台,核心功能是网络结构搜索
总体来看,模型压缩方法、工具及应用落地已经在各个大互联网公司呈百花齐放的态势。各家都在构建自己的模型压缩工具及生态环境并努力实现在自家产品的落地(作者接下来会对各个工具做一些性能对比,并选出一家做详细的技术调研)
算法层面
理论算法层面,早在2015年,韩松发表的Deep Compression就是一篇对于模型压缩方法的综述型文章,将裁剪、权值共享和量化、编码等方式运用在模型压缩上,取得了非常好的效果,作为ICLR2016的best paper,也引起了模型压缩方法研究的热潮。
- Deep Compression:https://arxiv.org/abs/1510.00149
随着研究的深入,当前深度学习模型压缩和加速算法已经成为一个相当庞大且活跃的研究领域,涵盖软件和硬件,包括众多的技术方向。目前深度学习模型压缩方法的研究主要可以分为以下几个方向:
- 轻量网络设计:指重新设计新型网络结构,而不局限于仅对现有网络进行优化加速。轻量网络设计方向的主要代表论文是 MobileNet v1 / v2 , ShuffleNet v1 / v2 等,其主要思想是利用 Depthwise Convolution、Pointwise Convolution、Group Convolution 等计算量更小、更分散的卷积操作代替标准卷积。这类模型的计算量通常仅有几十到几百 MFLOPs,与传统的大型网络例如 VGG / Inception / ResNet等动辄上 GFLOPs 的计算量相比有明显优势,同时在比较简单的任务上与大模型的准确率差距较小。
- mobileNet-V1: https://arxiv.org/abs/1704.04861
- mobileNet-V2: https://arxiv.org/abs/1801.04381
- shuffleNet-V1: https://arxiv.org/abs/1707.01083
- shuffleNet-V2:https://arxiv.org/abs/1807.11164
- 模型裁剪:相比轻量网络设计,模型裁剪主要关注对现有模型做减法,由大化小。其主要思想是在保持现有模型的准确率基本不变的前提下,设计某种筛选机制(稀疏化),在某个尺度上筛选掉卷积层中重要性较低的权重,从而达到降低计算资源消耗和提高实时性的效果。模型裁剪算法的核心就在于权重筛选机制的设计以及筛选粒度的选择上。这也是本文接下来会着重深入讨论的方向。
- Learning both weights and connections for efficient neural network: https://arxiv.org/abs/1506.02626
- Pruning filters for efficient convnets:https://arxiv.org/abs/1608.08710
- Channel pruning for accelerating very deep neural networks:https://arxiv.org/abs/1707.06168
- Learning efficient convolutional networks through network slimming:https://arxiv.org/abs/1708.06519
- Rethinking the Smaller-Norm-Less-Informative Assumption in Channel Pruning of Convolution Layers:https://arxiv.org/abs/1802.00124
- AMC: AutoML for Model Compression and Acceleration on Mobile Devices :https://arxiv.org/abs/1802.03494
- 模型蒸馏:相比于模型裁剪的目标是把大模型逐渐变小,同时保持精度损失较小,模型蒸馏的目标是利用大模型(Teacher Network)提供的监督特征帮助计算量较小的模型(Student Network)达到近似于大模型的精度,从而实现模型加速。模型蒸馏的关键在于监督特征的设计,例如使用 Soft Target 所提供的类间相似性作为依据,或使用大模型的中间层特征图, 或 attention map作为暗示,对小网络进行训练。
- Distilling the Knowledge in a Neural Network:https://arxiv.org/abs/1503.02531
- FitNets: Hints for thin deep nets:https://arxiv.org/abs/1412.6550v4
- Paying More Attention to Attention: Improving the Performance of Convolutional Neural Networks via Attention Transfer:https://arxiv.org/abs/1612.03928
- 矩阵分解:由于深度学习模型中计算量最密集的部分就是卷积,而卷积可以经过 im2col 之后用矩阵乘法实现,因此我们可以使用多种矩阵低秩近似方法,将两个大矩阵的乘法操作拆解为多个小矩阵之间的一系列乘法操作,降低整体的计算量,加速模型的执行速度。
- Speeding up convolutional neural networks with low rank expansions: https://arxiv.org/abs/1405.3866
- Accelerating very deep convolutional networks for classification and detection: https://arxiv.org/abs/1505.06798
- 量化与低精度运算:深度学习模型在运行过程时需要进行大量的浮点乘加运算,一般默认数据位宽是 32bit,但是实际上我们完全可以用更低的位宽(例如 16bit / 8bit / 4bit / 2bit 甚至 1bit)来量化模型的权重和特征图,完成近似的运算。这么做一方面可以成倍的降低模型运行时的访存量,一方面在相应硬件指令集的支持下,可以成倍的提高模型的运算速度。其重点在于如何控制低精度对模型带来的精度损失。
- BinaryConnect: Training Deep Neural Networks with binary weights during propagations:https://arxiv.org/abs/1511.00363
- XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks:https://arxiv.org/abs/1603.05279
- Quantized Neural Networks: Training Neural Networks with Low Precision Weights and Activations:https://arxiv.org/abs/1609.07061v1
- 计算图优化:深度学习模型的层数通常在几十层到上百层,但实际上层与层之间有很多部分都存在固定的组合关系(例如 Conv-BatchNorm-ReLU 组合),因此我们可以对计算图中的这些固定组合进行优化,分别在水平和垂直方向上将多层融合为一层执行,从而大量减少层间不必要的内存拷贝以及多次 kernel launch 带来的开销,有效提升模型的运行速度。
- 卷积算法优化:卷积运算本身有多种算法实现方式,例如滑动窗、im2col + gemm、FFT、Winograd卷积等方式。这些卷积算法在速度上并没有绝对的优劣,因为每种算法的效率都很大程度上取决于卷积运算的尺寸。因此,在优化模型时,我们应该对模型的各个卷积层有针对性的选用效率最高的卷积算法,从而充分利用不同卷积算法的优势。
- Fast Algorithms for Convolutional Neural Networks: https://arxiv.org/abs/1509.09308
- Winograd算法解析:https://www.geek-share.com/detail/2769512480.html
- 硬件加速:任何模型的运行都需要依托于某种计算平台来完成,因此我们可以直接从计算平台的硬件设计方面进行加速。目前深度学习模型的主流计算平台是 GPU,从 Volta 架构开始,GPU 配备了专门用于快速矩阵乘法运算的硬件计算单元 Tensor Core,可以显著提升深度学习模型的吞吐量。同时,以低功耗低延迟为主要特性的 FPGA / ASIC 加速芯片也开始在业界崭露头角。
总之,深度学习的模型要真正落地,绕不开对模型进行速度及精度的优化。在模型优化方面,学术界和工业界也都开始发力。创新算法,使用工具,落地案例可能会越来越多。
(window.slotbydup = window.slotbydup || []).push({ id: "u5894387", container: "_0hv0l6ey3zro", async: true });相关文章推荐
- 模型压缩概述
- Word2Vec概述与基于Hierarchical Softmax的CBOW和Skip-gram模型公式推导
- Windows Phone 执行模型概述
- Android开发中的ContentProvider数据模型概述
- 最新SqueezeNet 模型详解,CNN模型参数降低50倍,压缩461倍!
- SharePoint服务器端对象模型 之 对象模型概述(Part 1)
- [置顶] JVM 内存模型概述
- spark概念、编程模型和模块概述
- Spark入门到精通视频学习资料--第二章:Spark生态系统介绍,Spark整体概述与Spark编程模型(2讲)
- solidworks api VBA 用于将模型特征压缩
- lstm(三) 模型压缩lstmp
- C++对象模型 -- 关于对象的概述
- 效用模型的原理概述
- CNN经典网络中的模型压缩方法
- CUDA编程模型:内核与线程层次概述
- CSS 框模型概述
- Linux设备驱动模型概述
- 从需求出发来看关系模型与非关系模型–关系模型与非关系模型概述
- 用SVD压缩深度模型(DNN,CNN)的全连接层(fully-connected layer)
- Nginx----IO模型及架构流程概述