深度学习之模型压缩

本文参考以下链接,如有侵权,联系删除
参考

概述

目的:最大程度的减小模型复杂度,减少模型存储需要的空间,也致力于加速模型的训练和推理
主要方法

前端压缩(可逆):

  • 知识蒸馏:通过采用预先训练好的复杂模型(teacher model)的输出作为监督信号去训练另外一个简单的网络(student model)
  • 紧凑网络设计(compact network design):挤压设计与扩张设计
  • 滤波器级别的剪枝(pruning):在训练时使用稀疏约束(加入权重的稀疏正则项,引导模型的大部分权重趋向于0).完成训练后,剪去滤波器上的这些0,优点:简单,缺点:剪得不干净

后端压缩(不可逆):

  • 低秩近似:使用结构化矩阵进行低秩分解,常用SVD(奇异值分解),原先稠密的满秩矩阵可以表示为若干个低秩矩阵的组合,低秩矩阵又可以分解为小规模矩阵的乘积
  • 不加限制的剪枝(pruning):完成训练后,不加限制地剪去那些冗余参数.
  • 网络量化(network quantization):参数量化:从权重中归纳出若干的"代表",由这些"代表"来表示某一类权重的具体数值.二值网络:所有的参数取值成正负1

剪枝

网络剪枝的主要思想就是将权重矩阵中相对"不重要"的权值剔除,然后再重新fine-tune网络进行微调.
广义上的修剪

  • 正则化:给目标函数增加正则项,优化后可能会得到一个参数较少的神经网络
  • 修剪pruning:面向大规模神经网络,并删除某些意义上冗余的特征或者参数
  • 增长growing:从小型网络开始,按某种增长标准逐步增加新的单元

剪枝的基本流程

  • 衡量神经元的重要程度
  • 移除一部分不重要的神经元
  • 对网络进行微调
  • 返回第一步,进行下一轮剪枝

剪枝的粒度变化

  • 细粒度剪枝(属于非结构化剪枝): 局部调整比较精细,保留模型精度
  • 粗粒度剪枝 (直接剪去filter或channel)

剪枝的方法

  • 权重衰减法
    通过在网络目标函数中引入表示结构复杂性的正则化项来使训练的网络权重趋向稀疏化。缺点是正则化参数/权重剪枝阈值对剪枝结果影响很大。
  • 灵敏度计算方法——数据驱动
    – 1.利用Loss对权重的二阶导数(Hession 矩阵)计算权重重要性
    2017-Learning to Prune Deep Neural Networks via Layer-wise Optimal Brain Surgeon||pytorch实现
    本文将二阶导数的计算限制在单层网络中,以减小计算量,并证明了剪枝后预测性能下降是每层重构误差的线性组合
    – 2.损失近似
    该方法通过观察损失函数的变化来判断对应枝的重要性。例如:
    2017-Pruning convolutional neural networks for resource efficient inference||Pytorch实现
    特点:滤波器级别剪枝,计算每个滤波器对于损失函数的影响程度
    基于交替贪婪准则并且需要fine tune
    – 3.根据相关性剪枝
    类似于特征工程中的PCA,如
    2017-Combined Group and Exclusive Sparsity for Deep Neural Networks
    特点:探究了特征之间的正负相关关系,在神经元节点上剪枝
    具体实现:(1)exclusive sparsity regularization ——使上层特征尽可能地由不同底层特征构成
    (2)group sparsity regularization——允许某些重要的底层特征在上层共享

剪枝与训练的结合

  • 迭代式剪枝
    训练权重——剪枝——训练权重
  • 动态剪枝,剪枝与训练同时进行,一般指稀疏约束的方法
    具体做法是在网络的优化目标中加入权重的稀疏正则项,使得训练时网络的部分权重趋向于0,而这些0值正是剪枝对象。
  • 不在训练时剪枝,只对单个样本推理阶段剪枝

网络量化

量化可以分为Low-Bit Quantization(低比特量化)、Quantization for General Training Acceleration(总体训练加速量化)和Gradient Quantization for Distributed Training(分布式训练梯度量化)。也可以分为二值量化,三值量化,多值量化

  • 二值量化( binary quantization)
    思想是将权值矩阵中的单精度浮点数用两个值来表示,一般考虑使用符号函数或者加入线性化的符号函数来近似。对权重量化:如使用哈希把二值权重量化,再通过哈希求解对feature map量化:如将量化分为两步,第一步先对feature map进行量化,第二步再对权重量化,从而能够将两个同时进行很好的量化。
  • 三值量化(ternary quantization)
    在分布式计算过程中有一个很大问题,每一个分布式服务器都和中心服务器节点有大量的梯度信息传输过程,从而造成带宽限制。NIPS2017. TermGrad采取把要传输的梯度信息量化为三值的方法来有效加速分布式计算。
  • 多值量化
    对原来的模型取rounding model,round的方法有round-to-nearest和stochastic rounding
  • 其他量化
    在训练过程中量化:英特尔在NIPS2017提出的Flexpoint方法。在32位浮点和16位浮点存储的时候,第一位是符号位,中间是指数位,后面是尾数。他们对此提出了把前面的指数项共享的方法,这样可以把浮点运算转化为尾数的整数定点运算,从而加速网络训练。

紧凑模型设计

  1. Mobilenet系列
    MobileNets V1和MobileNets V2,其中使用了depthwise的1x1卷积。MobileNets V1是一个在网络非常精简情况下比较高性能的网络,MobileNets V2开始于通道比较少的1×1的网络,然后映射到通道比较多的层,随后做一个depthwise,最后再通过1x1卷积将它映射回去,这样可以大幅减少1×1卷积计算量。

  2. shufflenet
    把1×1的卷积通过分组来减少计算的方法,由于分组以后存在不同通道之间信息交流非常少的问题,他们又在卷积层之间增加channel shuffle过程进行随机扰乱,增加了不同通道之间的信息交流。

你可能感兴趣的:(深度学习,深度学习,网络,神经网络)