模型压缩总览

深度学习使得很多计算机视觉任务的性能达到了一个前所未有的高度。不过,复杂的模型固然具有更好的性能,但是高额的存储空间、计算资源消耗是使其难以有效的应用在各硬件平台上的重要原因。为了解决这些问题,许多业界学者研究模型压缩方法以最大限度的减小模型对于计算空间和时间的消耗。最近团队里正在研究模型压缩相关的内容,正好在这里总结一下。(我的认识还很肤浅,本文也会不断补充和修改,欢迎拍砖)

理论基础

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

目前的方案

  • 综述文章

  • 要解决这些问题往往需要从多个角度切入,包括机器学习算法,优化算法,计算机架构,数据压缩,索引编制及硬件设计等。对于模型压缩这一块的方法大致可以分为:低秩近似(low-rank Approximation),网络剪枝(network pruning),网络量化(network quantization),知识蒸馏(knowledge distillation)和紧凑网络设计(compact Network design)。

     

    image.png

  • 对于矩阵运算(特别是卷积运算)来说,如果权重矩阵稠密而且巨大,那么计算和存储都需要极大的开销。前三种方法都是致力于将权重矩阵变得更稀疏,以此来减小计算和存储的开销。后两种方法往往是需要对网络结构有较大的改动,也需要对神经网络的更深层原理有一定的认识才能进行更好的压缩。

  • 也能把模型压缩分为前端压缩和后端压缩:

     

    image.png

  • 对于模型压缩这方面的总览和发展历程,中科院的这篇已经介绍的非常好了。在这里我们主要分析一些论文并给出部分网上有的python实现代码。

1. 低秩近似/分解(low-rank Approximation/factorization):

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

论文

存在问题

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


2. 网络剪枝(network pruning):

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

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

论文

开山之作

剪枝的粒度变化——剪多深

  • 细粒度剪枝:对权重进行剪枝,fine-grained sparsity
    • 优点:保留模型精度
    • 缺点:非结构化剪枝,对局部进行调整,依赖于专门的运行库和硬件设备,如LeCun的1989脑损伤论文。
  • 粗粒度剪枝(直接剪去filter或channel),coarse grained sparsity
  • 特例:直接剪网络分支结构(粒度最大)2017-Driven Sparse Structure Selection for Deep Neural Networks
    • 总体:引入Gate控制分支,数据驱动,动态剪枝,端到端
    • 具体实现:为CNN模型训练和剪枝提出了一个统一的框架。通过在某些CNN结构上引入缩放因子和相应的稀疏正则化,将其定义为联合稀疏正则化优化问题。
    • 局限性:应用于宽网络结构,在某些网络上不能用

剪枝的方法——怎么剪

剪枝与训练的结合——什么时候剪

剪枝后综合处理的及其他剪枝相关论文


3. 网络量化(Network Quantization)

一般而言,神经网络模型的参数都是用的32bit长度的浮点型数表示,实际上不需要保留那么高的精度,可以通过量化,比如用0~255表示原来32个bit所表示的精度,通过牺牲精度来降低每一个权值所需要占用的空间。此外,SGD(Stochastic Gradient Descent)所需要的精度仅为6~8bit,因此合理的量化网络也可保证精度的情况下减小模型的存储体积。
根据量化方法不同,大致可以分为二值量化,三值量化,多值量化
对网络网络进行量化要解决三个基本问题

  1. 如何对权重进行量化
  2. 如何计算二值权重的梯度
  3. 如何确保准确率

论文

二值量化( binary quantization)

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

  • 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。

三值量化(ternary quantization)

改进二值量化

多值量化

量化++

这部分介绍的是网络量化+其他处理方法以达到模型压缩的目的的论文

变bit/组合bit量化

这一部分文章考虑对于同一个模型采用不同种类的bit组合来进行模型量化

哈希

量化总结

最为典型就是二值网络、XNOR网络等。其主要原理就是采用1bit对网络的输入、权重、响应进行编码。减少模型大小的同时,原始网络的卷积操作可以被bit-wise运算代替,极大提升了模型的速度。但是,如果原始网络结果不够复杂(模型描述能力),由于二值网络会较大程度降低模型的表达能力。因此现阶段有相关的论文开始研究n-bit编码方式成为n值网络或者多值网络或者变bit、组合bit量化来克服二值网络表达能力不足的缺点。

知识蒸馏(knowledge distillation)

蒸馏模型采用的是迁移学习,通过采用预先训练好的复杂模型(Teacher model)的输出作为监督信号去训练另外一个简单的网络。这个简单的网络称之为student model。

论文

开山之作

  • 2006-Model Compression
    尝试用一个神经网络近似多个集成的分类器
  • 2014-Do deep nets really need to be deep?
    • Our success in training shallow neural nets to mimic deeper models suggests that there probably exist better algorithms for training shallow feed-forward nets than those currently available.
    • 该文章训练了和深度网络几乎拥有同样参数数量的浅层网络(也就是更肥更短的网络),在TIMIT phoneme recognition task上能够达到与深度网络相近的性能,以此说明了深度网络并不是一定优于浅层网络。
  • 2015-Distilling the knowledge in a neural network参考阅读
    • 作者Hinton认为是有办法将深度网络中所学到的知识转移到另一个相对简单的网络中去的。
    • 提出用改造的原始模型的softmax输出(加入一个温度常数T控制预测概率的平滑程度)作为一个软目标(soft target),加权结合真实标签(hard target)来计算小网络训练时的损失函数,权重经验值推荐为9:1。
    • 这种方法对于没有标签的数据集也可以拿来训练,而且实验效果还不错。在mnist数据集上对于迁移训练集数据中包含无标签数据或者某些类别数据缺失,依然能够有很好的表现。另外大模型的输出相较于GTlabel来说包含更多信息,如类间距和类内方差等,所以这也可以作为数据增广的一种手段。

监督信息

着重于研究教学监督信息的丰富与改进

学生模型设计、方法集成

其他任务

模型加速

非压缩目的的蒸馏

总结

  • 总体的来说,知识蒸馏是一种迁移学习,将大模型的知识最大程度的教授给小模型,以达到压缩模型的目的。目前来看,无论是压缩比还是蒸馏后的性能都还有待提高。
  • 存在的问题和研究的趋势
    1. 寻“知识”的不同形式,去除softmax的限制,研究趋向于选用中间特征层
    2. 如何选择特征层,如何设计损失函数
    3. 训练学生模型数据集的选择
    4. 学生模型的设计
    5. 如何和其他压缩方法集成

紧凑网络设计

  • 如果要把模型压缩分为两部分的话,我想可以分为压缩已有的网络和构建新的小网络两种。其中剪枝、量化和低秩分解可以归到第一种,蒸馏归入第二种,而更好的方法就是在模型构建的初始阶段,就选择小而紧凑的网络,也就是紧凑网络设计。
  • 目前我觉得应用紧凑模型设计最成功之一要数MobileNets系列
    了,当然也包括ShuffleNets系列,Inception系列(特别是V3和Xception)等。

论文

2017-MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications

  • 提出采用深度可分离卷积(Depthwise separable convolution)来构建卷积,并且给出了不同程度的accuracy和latency的trade off。

参考:

  1. CNN 模型压缩与加速算法综述

  2. 【一文看懂】深度神经网络加速和压缩新进展年度报告

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值