深度学习使得很多计算机视觉任务的性能达到了一个前所未有的高度。不过,复杂的模型固然具有更好的性能,但是高额的存储空间、计算资源消耗是使其难以有效的应用在各硬件平台上的重要原因。为了解决这些问题,许多业界学者研究模型压缩方法以最大限度的减小模型对于计算空间和时间的消耗。最近团队里正在研究模型压缩相关的内容,正好在这里总结一下。(我的认识还很肤浅,本文也会不断补充和修改,欢迎拍砖)
理论基础
- 必要性
在许多网络结构中,如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年所做的工作。在这方面有几篇经典的论文。
论文
-
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%的精度。A visualization of monochromatic and biclustering approximation structures.
-
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. 网络剪枝(network pruning):
网络剪枝的主要思想就是将权重矩阵中相对“不重要”的权值剔除,然后再重新fine tune 网络进行微调。
- 广义上的修剪包括:
- 正则化regularization:修改目标函数/学习问题,所以优化后可能会得到一个参数较少的神经网络,例如添加L1Norm在损失函数中
- 修剪pruning:面向大规模神经网络,并删除某些意义上冗余的特征或参数
- 增长growing:从小型网络开始,按某种增长标准逐步增加新的单元
- 剪枝的基本流程
- 衡量神经元的重要程度
- 移除一部分不重要的神经元
- 对网络进行微调
- 返回第一步,进行下一轮剪枝
- 这一部分的核心问题包括:
- 剪枝的粒度变化——剪多深
- 剪枝方法——怎么剪
- 如何衡量权值的重要性。
- 如何选取去除权值的数量或比例。
- 什么时候剪
- 在去除不重要的权值之后,如何保持网络性能。
- fine tune之后又会产生新的不重要权值,如何解决。
我们从这几个核心问题着手展开
论文
开山之作
- 1989-杨丽坤-Optimal brain damage
- 1993-NIPS-Second Order Derivatives for Network Pruning: Optimal Brain Surgeon
- 利用二阶泰勒展开选择参数进行剪枝,将剪枝看做正则项来改善训练和泛化能力。
剪枝的粒度变化——剪多深
- 细粒度剪枝:对权重进行剪枝,fine-grained sparsity
- 优点:保留模型精度
- 缺点:非结构化剪枝,对局部进行调整,依赖于专门的运行库和硬件设备,如LeCun的1989脑损伤论文。
- 粗粒度剪枝(直接剪去filter或channel),coarse grained sparsity
- 优点:模型速度和大小有效提升,保证了通用性
- 缺点:容易造成精度大幅下降,同时模型残留冗余
- 2017CVPRW_stanford&Nvidia_Exploring the Regularity of Sparse Structure in Convolutional Neural Networks
- 探索完整的修剪粒度范围,并评估模型的regularity and accuracy之间的权衡。
- 证明粗粒修剪能够达到与细粒修剪相似甚至更好的压缩率,即使它获得的稀疏性较小。
- 展示粗粒度稀疏能够以结构化的方式跳过计算并减少内存引用,这导致更高效的硬件加速器实现
- 2017-Pruning filters for efficient convnets
滤波器级别剪枝,基于滤波器权重本身的统计量
- 特例:直接剪网络分支结构(粒度最大)2017-Driven Sparse Structure Selection for Deep Neural Networks
- 总体:引入Gate控制分支,数据驱动,动态剪枝,端到端
- 具体实现:为CNN模型训练和剪枝提出了一个统一的框架。通过在某些CNN结构上引入缩放因子和相应的稀疏正则化,将其定义为联合稀疏正则化优化问题。
- 局限性:应用于宽网络结构,在某些网络上不能用
剪枝的方法——怎么剪
-
权重衰减法
属于前面提到的正则化的方法,通过在网络目标函数中引入表示结构复杂性的正则化项来使训练的网络权重趋向稀疏化。缺点是正则化参数/权重剪枝阈值对剪枝结果影响很大- 2015-NIPS-Learning both weights and connections for efficient neural network
- 该文章设定了取舍权值的阈值,非结构化,属于细粒度剪枝
- 设定了绝对值正则项,优点是简单直接,缺点是基于小权值对网络贡献小,与网络输出没有直接关系的假设,可能会严重破坏网络。
- 2017-Automated Pruning for Deep Neural Network Compression
- 解决问题:(1)传统方法需要在多个待测试阈值上重复迭代(2)权重阈值在所有层共享,难以寻找合适的阈值
- 具体实现:权重与阈值联合优化,layer-specific thresholds,省略多次迭代过程
- 2017-ICCV-Learning Efficient Convolutional Networks through Network Slimming||pytorch实现
- channel-level ,新的重要程度衡量方法,稀疏约束实现动态剪枝
- 具体实现:1. 利用batch normalization中的缩放因子γ 作为重要性因子,即γ越小,所对应的channel越不重要,就可以裁剪 2.在目标方程中增加一个关于γ的L1正则项
- 2017-Learning Sparse Neural Networks through L0 Regularization
- 在常用损失项上加上L0范数(向量中的非零项)应用数学技巧解决这个复杂的组合优化问题
- 2015-NIPS-Learning both weights and connections for efficient neural network
-
灵敏度计算方法——数据驱动
- 利用Loss对权重的二阶导数(Hession 矩阵)计算权重重要性(LeCun1989脑损伤的做法)
- 由于Hession矩阵的计算复杂,很长一段时间没有人用
- 2017-Learning to Prune Deep Neural Networks via Layer-wise Optimal Brain Surgeon||pytorch实现这篇文章对该方法进行了改善
- 本文将二阶导数的计算限制在单层网络中,以减小计算量
- 并证明了剪枝后预测性能下降是每层重构误差的线性组合
- 损失近似
该方法通过观察损失函数的变化来判断对应枝的重要性-
2017-Pruning convolutional neural networks for resource efficient inference||Pytorch实现
- intuition:在迁移学习中,如果原先学习的特征如在VGG16中包含车,人马的识别但是在新的任务中我只需要识别猫和狗,那么有多少特征对新的分类器是有贡献的呢?
- 滤波器级别剪枝,计算每个滤波器对于损失函数的影响程度
- -基于交替贪婪准则并且需要fine tune
-
2017ICLR-Pruning convolutional neural networks for resource efficient transfer learning
- 本文是filter级别的剪枝
- 剪枝准则:选择一个filter集合中的子集,将子集计算对应的Loss与原集合对应的Loss的差异作为衡量filter重要性的准则。
- 迭代删除重要度最低的filter,并进行fine tune
-
- 根据相关性剪枝
类似于特征工程中的PCA
- 2017-ICCV-Channel Pruning for Accelerating Very Deep Neural Networks||caffe代码
- 考虑到裁剪对下一层的影响,选取最有代表性的channel
- 具体实现:(1)LASSO regression based channel selection (2)least quuare reconstruction——利用剩下的channnel重构这一层原本的输出
- 2017-Combined Group and Exclusive Sparsity for Deep Neural Networks
- 探究了特征之间的正负相关关系,在神经元节点上剪枝
- 具体实现:(1)exclusive sparsity regularization ——使上层特征尽可能地由不同底层特征构成
(2)group sparsity regularization——允许某些重要的底层特征在上层共享
- 其他
-
2016-A data-driven neuron pruning approach towards efficient deep architectures
数据驱动的滤波器级别剪枝 -
2017-CVPR-Designing Energy-Efficient Convolutional Neural Networks Using Energy-Aware Pruning
- 根据能量消耗剪枝(理论依据不足)
- 具体实现:(1)能量估计方法:通过实际的电池消耗(来自于计算与存储),建立数据稀疏与带宽减小与电池消耗的模型(2)节能意识指导剪枝:从能量消耗最多的层开始剪枝,基于最小化输出误差来剪枝(3)CNNs的能量消耗分析
- 利用Loss对权重的二阶导数(Hession 矩阵)计算权重重要性(LeCun1989脑损伤的做法)
剪枝与训练的结合——什么时候剪
- 迭代式剪枝 :训练权重——剪枝——训练权重
大多数的剪枝方法都属于这个模式。这里给一个典型的论文——2015NIPS-Learning both weights and connections for efficient neural network - 动态剪枝:剪枝与训练同时进行,一般指稀疏约束的方法
具体做法是在网络的优化目标中加入权重的稀疏正则项,使得训练时网络的部分权重趋向于0,而这些0值正是剪枝对象。 - 特殊:不在训练时剪枝,对单个样本的inference剪枝
- 2017-Adaptive Neural Networks for Efficient Inference
- 不改变网络结构,只针对单个样本的inference过程精简网络
- 具体实现:(1)early-exit stratage to bypass some layers (2)network selection such as AlexNet,GoogLeNet,etc.
- 2017-Adaptive Neural Networks for Efficient Inference
剪枝后综合处理的及其他剪枝相关论文
-
2015-Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding
该论文针对以上问题都提出了相应的解决方案。其整体流程如下图所示:image.png
其模型压缩率非常高:在ImageNet数据集上,该方法对AlexNet的内存占用减少35倍(从240MB到6.9MB)同时不损失准确率,对于VGG-16减少49倍的内存占用(从552MB到11.3MB)同样不损失准确率。可以说是非常牛了。当然,图中也说明了该压缩是剪枝、量化和哈夫曼编码共同作用的结果。不过光剪枝也就达到了十倍的压缩率了,已经相当可观了。 -
2015-Structured Pruning of Deep Convolutional Neural Networks
-
2017-PackNet: Adding Multiple Tasks to a Single Network by Iterative Pruning||【pytorch】
-
2017ICCV-ThiNet: A Filter Level Pruning Method for Deep Neural Network Compression||【caffe】
-
2017-Exploring the Regularity of Sparse Structure in Convolutional Neural Networks
-
2017-Soft Weight-Sharing for Neural Network Compression||【keras】
-
2017-Data-Driven Sparse Structure Selection for Deep Neural Networks||【MXNET】
-
2017NIPS-Net-Trim: Convex Pruning of Deep Neural Networks with Performance Guarantee||【tensorflow】
-
2017NIPS-Structured Bayesian Pruning via Log-Normal Multiplicative Noise||【tf】
3. 网络量化(Network Quantization)
一般而言,神经网络模型的参数都是用的32bit长度的浮点型数表示,实际上不需要保留那么高的精度,可以通过量化,比如用0~255表示原来32个bit所表示的精度,通过牺牲精度来降低每一个权值所需要占用的空间。此外,SGD(Stochastic Gradient Descent)所需要的精度仅为6~8bit,因此合理的量化网络也可保证精度的情况下减小模型的存储体积。
根据量化方法不同,大致可以分为二值量化,三值量化,多值量化
对网络网络进行量化要解决三个基本问题
- 如何对权重进行量化
- 如何计算二值权重的梯度
- 如何确保准确率
论文
二值量化( 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)
改进二值量化
- 2015-Neural Networks with Few Multiplications
- 在二值网络符号函数(+1,-1)的基础上,认为需要显式地增加0这个量化值
- 使用ternary connect
- 反传的时候也加入了量化,认为3-4bits足够替代原网络精度
- 2016-Trained Ternary Quantization
在常规的ternary网络基础上,使用FP32精度的数据做计算——保持计算精度 - 2016-Accelerating Deep Convolutional Networks using low-precision and sparsity
多值量化
- 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保存;没有超参数的变化——保持计算精度
量化++
这部分介绍的是网络量化+其他处理方法以达到模型压缩的目的的论文
- 2016-Deep neural networks are robust to weight binarization and other non-linear distortions
- 不是单纯量化,而是使用投影函数将权值映射到某个范围
- 2018-BinaryRelax: A Relaxation Approach For Training Deep Neural Networks With Quantized Weights
- 使用松弛量化的方法,可以在非凸假设下达到收敛的目的
- 使用continuous regularizer
- 2017-Training Quantized Nets: A Deeper Understanding
- 理论分析随机近似SR和离散近似BC表现差异的原因
- BinaryConnection有退火属性,SR没有,这一点是关键,SR会提前停止。
- 2017-Training Quantized Nets: A Deeper Understanding
- 这是一种直接对训练好的模型进行量化的方法,不需要再fine tune
- 2015-Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding
还是这篇论文,其中在剪枝之后采用了量化处理。- 采用k-means聚类来确定每一层共享的权值
- centroid initialization:3种共享权值的初始化方法
- 获取权值分布,利用huffman编码压缩数据量
变bit/组合bit量化
这一部分文章考虑对于同一个模型采用不同种类的bit组合来进行模型量化
- 2017-Adaptive Quantization for Deep Neural Network
- 为每一层找到优化的量化位数
- 度量每一层参数量化误差的方法
- 2017-Fixed-point optimization of deep neural networks with adaptive step size retraining
- 逐步调整量化步长,取得优化的长度
哈希
- 2015-Compressing neural networks with hashing trick
该文提出将映射到同一个哈希桶中的权值进行共享,共享同一个权值
量化总结
最为典型就是二值网络、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来说包含更多信息,如类间距和类内方差等,所以这也可以作为数据增广的一种手段。
监督信息
着重于研究教学监督信息的丰富与改进
- 2015-ICLR-FitNets: Hints for thin deep nets (Bengio)||keras代码||tensorflow
- 对hinton15的改进,小模型设计的又窄又深,这样压缩的效果更明显,同时又更好的performance,监督信息加入了中间特征层(原意是分成两部分训练)
- 缺点是难收敛
- 2017-ICLR-Paying More Attention to Attention: Improving the Performance of Convolutional Neural Networks via Attention Transfer
- 对fitNets的改进,提出使用attention特征作为监督信息,并给出两种有效的attention map
- 2016-AAAI-Face model compression by distilling knowledge from neurons (商汤)||caffe代码
- 针对人脸识别数据集类别纬度高的特点,用Softmax前一层网络的输出作为监督信息,设计了一个算法对神经元进行选择,保证维度的紧凑和高效。
- 2016-Deep Model Compression: Distilling Knowledge from Noisy Teachers
- 也是对hinton15的改进,基本思想是学生向多个老师学习,并通过向老师模型的logits添加扰动,实现基于噪声的正则。
- 2017-Like What You Like: Knowledge Distill via Neuron Selectivity Transfer (图森)||MXNet代码
- 看作一个分布匹配问题,使用了新的loss函数,用于中间层特征;该方法可以和其他压缩方法结合,也可以用到检测等任务中
- 2017-CVPR-A gift from knowledge distillation: Fast optimization, network minimization and transfer learning
- 和之前的方法不同,利用Gram矩阵拟合层与层之间的关系,学生模仿老师解题的过程
- 2017-Knowledge Projection for Effective Design of Thinner and Faster Deep Neural Networks
- 本文提出一种新的设定,开始和以前一样,使用一个预训练的大网络来指导一个更窄更快的小网络训练,但是用来训练的数据是新的并且标签信息有限,所以这个场景包括了不同数据域的自适应和模型压缩
- 加入了一个知识投影矩阵,是学习得到的,选择大模型的某处中间层,经过投影,加入到小模型的某处,这个过程也是学习的
- 2017-Training Shallow and Thin Networks for Acceleration via Knowledge Distillation with Conditional Adversarial Networks
- 以前的方法是通过最小化确定的损失函数来拟合学生和老师,本文通过cGANs来学习适合的loss,更好的进行知识的迁移
- 2017-AAAI18-DarkRank: Accelerating Deep Metric Learning via Cross Sample Similarities Transfer (图森)||MXNet实现
- 引入了新的监督信息,考虑不同样本之间的相似性,Learning to rank思想
学生模型设计、方法集成
- 2016-ECCV-Accelerating convolutional neural networks with dominant convolutional kernel and knowledge pre-regression
- 设计了学生模型的网络结构,压缩并加速,使用distillation提高模型的精度
- 2017-Knowledge Distillation for Small-footprint Highway Networks
- 使用了Hinton15的方法,应用在了语音识别任务,改进了学生模型,更少的参数同样的准确率
- 2017-Apprentice: Using Knowledge Distillation Techniques To Improve Low-Precision Network Accuracy
- 这里用蒸馏来弥补因为量化导致的性能下降
- 2017-Do Deep Convolutional Nets Really Need to be Deep and Convolutional?
- Yes,they do;对于稍微复杂的任务,小模型需要有卷积层,并且要深,当然不用像大模型那么深
- 2017-Moonshine: Distilling with Cheap Convolutions
- 通过更换老师模型中的卷积块,得到学生模型
- 2018-Model compression via distillation and quantization||pytorch实现
- 学生模型为浅网络,在蒸馏的同时进行量化,同时使用SGD优化量化点的位置
其他任务
- 2015-Cross Modal Distillation for Supervision Transfer
- 跨模态的知识迁移,将有标签模态模型学到的知识迁移到没有标签模态模型中,用mid-level的特征作为监督信息
- 2016-Training Constrained Deconvolutional Networks for Road Scene Semantic Segmentation
- 用于语义分割
- 2016-Sequence-Level Knowledge Distillation
- 使用蒸馏对机器翻译模型进行压缩和加速,针对Seq2Seq,提出Sequence级别的度量方法
- 2017-CVPR-Mimicking very efficient network for object detection (商汤)
- 用在检测任务中,hinton15的效果很差
- 对Hinton15的改进,中间层(Proposal)相同位置的特征作为监督信息,使用L_2损失衡量,,最终损失包含两部分
- 小网络的特征需要进行转换,为了和大网络的维度相同
- ★2017-NIPS-Learning Efficient Object Detection Models with Knowledge Distillation
- 面向检测问题的一个基于知识迁移的端到端框架;针对检测中标签少,不均衡,回归损失等问题,结合FItNets15和新的loss进行解决
- 2017-Model Distillation with Knowledge Transfer from Face Classification to Alignment and Verification
模型加速
- 2018-ICLR-Large scale distributed neural network training through online distillation
- 分布式SGD存在瓶颈,提出在线蒸馏方法提高大规模计算集群上的模型表现和计算效率
非压缩目的的蒸馏
- 2015-Net2Net: Accelerating Learning via Knowledge Transfer
- 实际工作中,需要从头训练不同的模型,很费时;基于保函数变换理论,将原网络加宽或者加深;该方法更多的用在网络结构的探索和迁移学习上
- 2017-Data-Free Knowledge Distillation for Deep Neural Networks||paper解析及tensorflow实现
image.png
- 目前的蒸馏方法都需要训练集,这有很多限制,本文提出一种方法只需要一小部分元数据,不需要原来的训练数据,需要记录每层的激活信息,利用大网络和元数据重建数据
- 2017-Data Distillation: Towards Omni-Supervised Learning
- 非压缩类,针对半监督问题,利用标注数据训练模型A,将未标注的数据经过不同的几何变换后输入A,得到若干的输出,将输出进行集成,利用集成的标签训练一个学生模型
- 2017-Knowledge Adaptation: Teaching to Adapt
- 2018-Transparent Model Distillation
总结
- 总体的来说,知识蒸馏是一种迁移学习,将大模型的知识最大程度的教授给小模型,以达到压缩模型的目的。目前来看,无论是压缩比还是蒸馏后的性能都还有待提高。
- 存在的问题和研究的趋势
- 寻“知识”的不同形式,去除softmax的限制,研究趋向于选用中间特征层
- 如何选择特征层,如何设计损失函数
- 训练学生模型数据集的选择
- 学生模型的设计
- 如何和其他压缩方法集成
紧凑网络设计
- 如果要把模型压缩分为两部分的话,我想可以分为压缩已有的网络和构建新的小网络两种。其中剪枝、量化和低秩分解可以归到第一种,蒸馏归入第二种,而更好的方法就是在模型构建的初始阶段,就选择小而紧凑的网络,也就是紧凑网络设计。
- 目前我觉得应用紧凑模型设计最成功之一要数MobileNets系列
了,当然也包括ShuffleNets系列,Inception系列(特别是V3和Xception)等。
论文
2017-MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
- 提出采用深度可分离卷积(Depthwise separable convolution)来构建卷积,并且给出了不同程度的accuracy和latency的trade off。
参考: