模型压缩与加速概述

1 理论基础

  • 必要性
    在许多网络结果中,如VGG-16网络,参数数量1亿3千多万,占用500MB空间,需要进行309亿次浮点运算才能完成一次图像识别任务。
  • 可行性
    论文提出,其实在很多深度的神经网络中存在着显著的冗余。仅仅使用很少一部分(5%)权值就足以预测剩余的权值。该论文还提出这些剩下的权值甚至可以直接不用被学习。也就是说,仅仅训练一小部分原来的权值参数就有可能达到和原来网络相近甚至超过原来网络的性能(可以看作一种正则化)
  • 最终目的
    最大程度的减小模型复杂度,减少模型存储需要的空间,也致力于加速模型的训练和推测

2 方法概述

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在剪枝和量化两个方向论文比较多,这两种方法在工业界上应用较多。

2.1知识蒸馏(knowledge distillation)

在这里插入图片描述

2.1.1 知识蒸馏获得概率分布

在这里插入图片描述

2.1.2 知识蒸馏获得Feature Map

在这里插入图片描述
MMD衡量两个Feature Map的相似度。

2.1.3 知识蒸馏获得中间过程

在这里插入图片描述
Gram矩阵来获得层与层之间的关系,每个网络都有一个Gram矩阵。
在这里插入图片描述

2.2 紧致的网络结构设计

在这里插入图片描述

2.2.1 SqueezeNet

在这里插入图片描述
先用黄色的11的conv降维self.sequeeze(),然后用1个11和1个3*3,最近将两个结果connect得到输出结果。
在这里插入图片描述

2.2.2 Xception结构

在这里插入图片描述在这里插入图片描述

2.2.3MobileNet V1结构在这里插入图片描述
2.2.4MobileNet V2结构

在这里插入图片描述

2.2.5 ShuffleNet结构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2.6总结

在这里插入图片描述

2.3 低秩近似

这一部分的思路比较简单,如果把原先网络的权值矩阵当作满秩矩阵来看,那么是不是可以用多个低秩的矩阵来逼近原来的矩阵,以达到简化的目的?答案是肯定的。原先稠密的满秩矩阵可以表示为若干个低秩矩阵的组合,低秩矩阵又可以分解为小规模矩阵的乘积。对于二维矩阵运算来说SVD是非常好的简化方法,所以在早期的时候,微软研究院就做过相关的工作来对网络实现加速。后面对于高维矩阵的运算往往会涉及到Tensor分解方法来做加速和压缩,主要是CP分解、Tucker分解、Tensor Train分解和Block Term分解这些在2015年和2016年所做的工作。在这方面有几篇经典的论文。
在这里插入图片描述

  • 2014-Speeding up Convolutional Neural Networks with Low Rank Expansions
    这篇文章提出用fx1+1xf的卷积核来替代f*f的卷积核的线性组合卷积核基底的方法来进行低秩近似,下图可以很直观的表达作者思想在这里插入图片描述

该方法在场景文字识别中实验在无精度损失的情况下达到原来的2.5倍速,而达到4.5倍速的同时仅损失1%的accuracy

  • 2014-NPIS-Exploiting Linear StructureWithin Convolutional Networks for Efficient Evaluation
    上面这个是属于rank-1的重构,这篇文章则是提出rank-k的重构,他对卷积使用一个中间层来进行降秩,通过单谱段处理(monochromatic convolution approximation)(暂时还不太懂这个,只知道是通过固定某一个维度,合并其他三个维度进行SVD)和双聚类处理(bicluster)加上SVD对矩阵进行降k维估计。该方法对于每个卷积层能提速一倍,损失1%的精度。
    在这里插入图片描述
    google V3也是在用这种思想

  • 2015-NPIS-Structured transforms for small footprint deep learning

    用结构化矩阵

  • 2015-Accelerating Very Deep Convolutional Networks for Classification and Detection

  • 2014-Speeding-up Convolutional Neural Networks Using Fine-tuned CP-Decomposition||pytorch代码||借鉴博客

  • 2015-Compression of Deep Convolutional Neural Networks for Fast and Low Power Mobile Applications||pytorch代码

  • 2017-High performance ultra-low-precision convolutions on mobile devices
    存在问题
    应该说矩阵分解方法经过过去的发展已经非常成熟了,所以在2017、2018年的工作就只有Tensor Ring和Block Term分解在RNN的应用两篇相关文章了。
    那么为什么Low-Rank在这两年不再流行了呢?除了刚才提及的分解方法显而易见、比较容易实现之外,另外一个比较重要的原因是现在越来越多网络中采用1×1的卷积,而这种小的卷积使用矩阵分解的方法很难实现网络加速和压缩。

  • 超参数的数量随着网络层数的增加呈线性变化趋势,例如中间层的特征通道数等等。参考2016年的NIPSConvolutional neural networks with low-rank regularization

  • 随着模型复杂度的提升,搜索空间急剧增大——Learning structured sparsity in deep neural networks

2.4 剪枝(Pruning)–常用的方法

在这里插入图片描述
在这里插入图片描述
网络剪枝的主要思想就是将权重矩阵中相对“不重要”的权值剔除,然后再重新fine tune 网络进行微调。

  • 广义上的修剪包括:
    • 1 正则化regularization:修改目标函数/学习问题,所以优化后可能会得到一个参数较少的神经网络,例如添加L1Norm在损失函数中
    • 2 修剪pruning:面向大规模神经网络,并删除某些意义上冗余的特征或参数
    • 3 增长growing:从小型网络开始,按某种增长标准逐步增加新的单元
  • 剪枝的基本流程
    • 1 衡量神经元的重要程度
    • 2 移除一部分不重要的神经元
    • 3 对网络进行微调
    • 4 返回第一步,进行下一轮剪枝
  • 这一部分的核心问题包括:
    • 剪枝的粒度变化——剪多深
    • 剪枝方法——怎么剪
      • 1 如何衡量权值的重要性。
      • 2 如何选取去除权值的数量或比例。
  • 什么时候剪
    • 1 在去除不重要的权值之后,如何保持网络性能。
    • 2 fine tune之后又会产生新的不重要权值,如何解决。

在这里插入图片描述

2.4.1 权重衰减法

在这里插入图片描述

2.4.2 灵敏度量化法

网络的节点(网络中参数)对loss的灵敏度,节点的值变一变,loss发现变化,说明该节点的灵敏度较大,如果loss的值发生变化,loss不变则说明灵敏度不大。
在这里插入图片描述

2.4.3 相关性剪枝法

在这里插入图片描述

2.4.4 梯度更新法

每次更新梯度变化较大的节点,对于梯度变化小的节点不进行更新。
在这里插入图片描述

2.4.5其他方法gamma参数

在这里插入图片描述

2.5 量化

在这里插入图片描述
对网络网络进行量化要解决三个基本问题

  • 1如何对权重进行量化
  • 2 如何计算二值权重的梯度
  • 3 如何确保准确率
2.5.1二值神经网络(Binary-Weight-Network)

思想是将权值矩阵中的单精度浮点数用两个值来表示,一般考虑使用符号函数或者加入线性化的符号函数来近似。

  • 2017-Towards Accurate Binary Convolutional Neural Network
    致力于不损失模型精度,使用multiple binary weight/multiple binary activations
  • 2016-Binarized Neural Networks on the ImageNet Classification Task
    分析了权值变化
  • 2016-XNOR-NET
    • 提出了一个BWN(Binary-Weight-Network)和XNOR-Network,前者只对网络参数做二值化,带来约32x的存储压缩和2x的速度提升,而后者对网络输入和参数都做了二值化,在实现32x存储压缩的同时带了58x的速度提升;
    • 提出了一个新型二值化权值的算法;
      第一个在大规模数据集如ImageNet上提交二值化网络结果的工作;
    • 无需预训练,可实现training from scratch。
      在这里插入图片描述
2.5.2三值神经网络
  • 2015-Deep Learning with Limited Numerical Precision
    • 使用16-bit fixed-point number
    • 对原来的模型取rounding model,round的方法有round-to-nearest和stochastic rounding
  • 2017-Towards the Limit of Network Quantization
    • 解决给定压缩比时,模型精度丢失loss问题
  • 2017-Mixed Precision Training
    • 使用FP32计算,使用FP16保存;没有超参数的变化——保持计算精度
      在这里插入图片描述
2.5.3其他量化方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.6 知识蒸馏

3 总结

文章说明:该文章的内容是我看网上模型压缩视频中的课件内容,这里是我记录的笔记。视频中说内容来源于valse2018:深度神经网络加速核压缩年度紧张包括(2017)程健
本文大量篇幅是引用的是
(1)
作者:CodePlayHu
https://www.jianshu.com/p/e73851f32c9f
(2)https://www.bilibili.com/video/BV1d4411u7Hn?t=6090 视频中的PPT

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值