来源:https://www.zhihu.com/question/303922732

编辑:深度学习与计算机视觉

声明:仅做学术分享,侵删

作者:鸫棟tian
https://www.zhihu.com/question/303922732/answer/547325762

专门做这个方向的,说一下自己的观点吧。

首先,“直接训练一个小的CNN”这个说法并不是很恰当,因为你需要一个前提:已经有一个设计好了的小模型(VGG19 ResNet152这种大模型并不是石头里面蹦出来的,也是人家精心设计、试错才推出来的)。所以这边就涉及到了一个问题:如何设计一个小模型。

然鹅,整个模型加速算法体系中就有一个分支专门研究这个问题,美其名曰:精简网络设计。典型的代表就是 SqueezeNet MobileNet v1/v2 ShuffleNet v1/v2 IGC v1/v2/v3。看起来很多,本质上都是在group卷积的前提下工作的。

其次,压缩/加速一个模型是为了更好地让其进行部署,譬如部署到手机,FPGA,无人机上去。一个是pretrained model,一个是 the compact version,两者精度一般差不多,后者功耗会低很多,当然要压缩/加速模型。(如何保证精度差不多那是算法的事情)

再者,使用一些加速压缩算法去push一个模型,不但可以得到更快更小的模型,而且精度还可以超出所给的pretrained model(这个一般通过加速压缩算法中的distillation技术实现)。显然地,锦上添花的一件事情。

更锦上添花的事情:压缩算法还可以将模型push到 low-bit(通过quantization实现),实现硬件级别的加速。典型的工作,BinaryConnect、BNN、XNOR-Net。这方面的工作以后势必会合深度学习芯片协同设计,更是可以极大地加速一个模型,很具有实际意义。

最后,模型加速算法体系中的各个分支算法可以叠加使用,譬如你先过一遍pruning再来一次quantization,加速效果嗖嗖的。

忘了说,这个体系一般分:1)pruning 2)quantization 3) knowledge distillation 4)low-rank decomposition 5)compact architecture design 这几个分支的方法。(还有其他的比较小众而且实际意义不是很大的就不提了)

贴两篇综述:A Survey of Model Compression and Acceleration for Deep Neural Networks ([1710.09282] A Survey of Model Compression and Acceleration for Deep Neural Networks

Recent Advances in Efficient Computation of Deep Convolutional Neural Networks([1802.00939] Recent Advances in Efficient Computation of Deep Convolutional Neural Networks),总结地还是很不错的。

作者:peike
https://www.zhihu.com/question/303922732/answer/542209549

作为常用的模型压缩方法,网络剪枝(Network Pruning)被广泛用于降低CNN的模型复杂度与计算量。典型的剪枝算法pipeline通常有三个阶段,首先训练一个大型模型,然后进行剪枝和最后微调。在剪枝过程中,根据一定的标准,对冗余权重进行修剪并保留重要权重,以最大限度地保持精确性。普遍观念认为模型压缩通常能大幅减少参数数量,压缩空间,从而降低计算量。

Liu, Zhuang, et al. "Rethinking the Value of Network Pruning."arXiv preprint arXiv:1810.05270(2018).

在这篇论文里,发现了几个与普遍观念相矛盾的的观察。他们了试验了几种剪枝算法,发现对剪枝后的模型进行fine tuning,只比使用随机初始化权重训练的网络的性能好一点点,甚至性能更差。文章认为自动剪枝算法的价值在于识别有效的结构和执行隐式架构搜索(implicit architecture search),而不是选择“important”权重。所以训练一个大型的、over-parameterized的模型对于最终得到一个有效的小模型不是必需的; 为了得到剪枝后的小模型,求取大模型的“important” weights不一定有用; 剪枝得到的结构本身,而不是一组“important” weights,这才是导致最终模型效果提升的原因。总结来说就是剪枝算法可以被视为“隐式网络结构搜索”(network architecture search)。

当然问题也是显而易见的,CNN的模型的复杂度代表了其学习能力的容量(虽然目前理论上还无法定量的进行描述)。 固定的CNN网络结构的学习容量有限的,在没训练出模型之前,我们并不知道究竟多大的网络才合适我们给定的任务和数据集,我们并不知道多少的学习容量才是合适的。如果上述文章的结论,即剪枝算法实际上是隐式网络结构搜索成立,从这个角度来说,模型压缩算法是top-down的寻找合适的模型。所以在目前的范式下,模型压缩有着重要的工程和实践意义

有没有办法能够bottom-up的寻找到给定任务和数据集合适的空间呢?其实在Incremental learning 或者叫 life long learning 的任务中,有着两种实现途径,一是Regularization approach,对应算法主要就是蒸馏(distillation),而网络结构不变。另外一种实现途径就是Dynamic Architecture, 随着学习任务的不断增加动态的改变网络结构本身。所以我一直在想在一个真正的人工智能系统中,固定不变的网络结构怎么能够不断学习新的任务而不会灾难性遗忘呢?

作者:张皓
https://www.zhihu.com/question/303922732/answer/542149953

卷积神经网络通常是过参数化(over-parameterization)的。这是因为,参数量越多、模型的容量(capacity)越大、学习能力越强。我们在设计网络的时候,不知道对当前任务来说多大的模型容量或者多强的学习能力是合适的,如果模型学习能力不足,将会欠拟合(underfit)。因此,通常的做法是设计一个有非常大的网络,并使用很多正则化的技巧来缓解过拟合(overfit)。这种策略的弊端是参数存在巨大冗余。Denil等人发现,只用部分参数子集(大约是全部参数数量的5%),即可准确预测其余的参数。

Misha Denil, Babak Shakibi, Laurent Dinh, Marc'Aurelio Ranzato, and Nando de Freitas. P redicting parameters in deep learning. NIPS, pages 2148-2156, 2013.

冗余的特征会使模型占用更多的资源,例如存储空间、计算时间和CPU/GPU资源等。但是,这种冗余在模型的训练阶段是十分必要的。因为深度卷积神经网络面临的是一个极其复杂的非凸优化问题,对于现有的基于随机梯度下降的优化算法而言,这种参数上的冗余保证了网络能收敛到一个比较好的局部最优。因此,在一定程度上,模型的参数量越多、网络越深、最终性能越好。

Emily L. Denton, Wojciech Zaremba, Joan Bruna, Yann LeCun, and Rob Fergus. Exploiting linear structure within convolutional networks for efficient evaluation. NIPS, pages 1269-1277, 2014.
Geoffrey E. Hinton, Nitish Srivastava, Alex Krizhevsky, Ilya Sutskever, and Ruslan Salakhutdinov. Improving neural networks by preventing co-adaptation of feature detectors. CoRR abs/1207.0580, 2012.

因此,大部分的网络压缩算法旨在将一个已经训练好的大网络压缩成一个精简的小网络。也有研究者利用试图直接设计精简的网络结构,对小网络直接训练。主要利用的思路是:

(1). 瓶颈(bottleneck)结构及1×1卷积。这种设计理念已经被广泛用于ResNet和Inception系列网络设计中。

Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun. Deep residual learning for image recognition. CVPR, pages 770-778, 2016.
Christian Szegedy, Wei Liu, Yangqing Jia, Pierre Sermanet, Scott E. Reed, Dragomir Anguelov, Dumitru Erhan, Vincent Vanhoucke, and Andrew Rabinovich. Going deeper with convolutions. CVPR, pages 1-9. 2015.

(2). 分组卷积和等深(depthwise)卷积。分组卷积最早由AlexNet提出,当时是为了将模型部署在两块GPU上进行训练。使用分组卷积/等深卷积可以大幅减小参数量。

Saining Xie, Ross B. Girshick, Piotr Dollár, Zhuowen Tu, and Kaiming He. Aggregated residual transformations for deep neural networks. CVPR, pages 5987-5995, 2017.
Mark Sandler, Andrew G. Howard, Menglong Zhu, Andrey Zhmoginov, and Liang-Chieh Chen. MobileNetV2: Inverted residuals and linear bottlenecks. CVPR, pages 4510-4520, 2018.

(3). 扩张卷积。使用扩张卷积可以保持参数量不变的情况下扩大感受野。感受野越大,神经元能利用的相关信息越多。和经典计算机视觉手工特征相比,大的感受野是深度学习方法能取得优异性能的重要原因之一。

Fisher Yu and Vladlen Koltun. Multi-scale context aggregation by dilated convolutions. ICLR, 2016.

作者:Donald
https://www.zhihu.com/question/303922732/answer/821816763

从实际使用的角度强答一发~

对于移动端部署来说,应该很少用剪枝的策略,主要以设计小模型为主,之后定点化再部署。移动端的模型本来就很紧凑,剪枝的话,效果不好,稍不留神掉点非常严重。如果模型剪枝后各个方面,精度啊,在更大数据集的泛化能力啊,定点化后的精度啊,都相差不大的话,只能说明这个模型本可以设计的更紧凑,来能达到速度和精度的平衡~移动端的话,定点化比剪枝策略在内存 速度和精度损失上收益更大,建议多花时间研究定点化。

对于云端部署来说,都使用的大模型,参数量多,可以用剪枝策略,来降低模型复杂度从而加速。

作者:Zhaozhe Song
https://www.zhihu.com/question/303922732/answer/561902762

没有人说过“不直接训一个小的CNN”。有足够的gpu就训呗。模型压缩一个重要价值是你可以直接拿一个公开的大模型用少量的计算压成一个小模型。performance就算高也不会高多少,毕竟冗余性永远摆在那。

相比很多文章压缩出来的杂乱的结构,小模型更适合部署因为它就是为了快而设计的。小模型并不需要花很多时间去调参,根据你想要的大小把mobilenet/shufflenet里channel数整体乘个系数,或者去掉/增加几层,一般就能work了。相反很多模型压缩算法更需要调参。

两者都是很有趣的学术方向。至于工业界目前用什么我也很好奇,至少我目前还不知道有什么简单粗暴的standard way去压缩一个模型。个人觉得直接训小模型更有潜力一些,就算你把pruning作为implicit architecture search,最后搜出来的也大概率和人工的heuristic相吻合,回报太低。

作者:bearbee
https://www.zhihu.com/question/303922732/answer/541660954

先说结论: 压缩大网络能取得比直接训小网络更好的结果,可以参考 To prune or not to prune: exploring the efficacy of pruning for model compression 一文,论文指出在模型相同非0个数的条件下, large sparse模型比small dense模型表现都更优异。

主要原因可能是:相比于大网络来说,小网络的模型表达能力明显不足,这个在模型迁移性和鲁棒性上也有体现。那么如果直接训练小网络,可能很难学到更具代表性的特征。

不断更新资源

获取更多精彩

长按二维码扫码关注

为什么要压缩模型,而不是直接训练一个小的CNN?相关推荐

  1. pytorch学习 训练一个分类器(五)

    训练一个分类器 就是这个, 你已经看到了如何定义神经网络, 计算损失并更新网络的权重. 现在你可能会想, 数据呢? 一般来说, 当你不得不处理图像, 文本, 音频或者视频数据时, 你可以使用标准的 P ...

  2. PyTorch-3 训练一个分类器

    本文源自 http://studyai.com/pytorch-1.4/beginner/blitz/cifar10_tutorial.html 就是这个!你已经了解了如何定义神经网络.计算损失和更新 ...

  3. 【CV】SqueezeNet:用于嵌入式设备的轻量化 CNN 压缩模型(0.5MB)

    SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size 论文名称:SqueezeNe ...

  4. 联邦学习【分布式机器学习技术】【①各客户端从服务器下载全局模型;②各客户端训练本地数据得到本地模型;③各客户端上传本地模型到中心服务器;④中心服务器接收各方数据后进行加权聚合操作,得全局模型】

    随着计算机算力的提升,机器学习作为海量数据的分析处理技术,已经广泛服务于人类社会. 然而,机器学习技术的发展过程中面临两大挑战: 一是数据安全难以得到保障,隐私数据泄露问题亟待解决: 二是网络安全隔离 ...

  5. 「模型训练」如何迁移学习一个小网络到移动端

    https://www.toutiao.com/i6715373426858525198/ 作者 | 言有三 编辑 | 言有三 0 引言 现在很多的图像算法都是离线计算的,而学术界刷榜单那些模型,什么 ...

  6. pytorch 训练过程acc_pytorch入门练手:一个简单的CNN模型

    由于新型冠状肺炎疫情一直没能开学,在家自己学习了一下pytorch,本来说按着官网的60分钟教程过一遍的,但是CIFAR-10数据库的下载速度太慢了-- 这台电脑里也没有现成的数据库,想起之前画了一些 ...

  7. 基于LSTM三分类的文本情感分析,采用LSTM模型,训练一个能够识别文本postive, neutral, negative三种

    基于LSTM三分类的文本情感分析,采用LSTM模型,训练一个能够识别文本postive, neutral, negative三种 ,含数据集可直接运行 完整代码下载地址:基于LSTM三分类的文本情感分 ...

  8. 【自然语言处理】【大模型】Chinchilla:训练计算利用率最优的大语言模型

    Chinchilla:训练计算利用率最优的大语言模型 <Training Compute-Optimal Large Language Models> 论文地址:https://arxiv ...

  9. 前端 3DTiles 效率优化(2)—— 采用 Draco 压缩模型

    Draco 是一个用于网格压缩的 glTF 扩展,它是谷歌开发的一个开源库,用于压缩和解压缩 3D 网格,以显著减少 3D 内容的大小.它可以压缩顶点位置.法线.颜色.纹理坐标和任何其他一般的顶点属性 ...

最新文章

  1. 野火linux核心板原理图,野火_f429挑战者_核心板_原理图_v2 1.pdf
  2. 37条常用Linux Shell命令组合
  3. 20140923 cin.get() getline cin
  4. Spring Cache 实战:兼容所有缓存中间件!
  5. 边缘设备上的实时AI人员检测:选择深度学习模型
  6. php inqude函数,Python匿名函数(lambda函数)
  7. Crackme010
  8. Tomcat源码学习(2)-How Tomcat works(转)
  9. ionic引用自定义html,pipe - Ionic 4自定义管道可以在app.component.html中正常工作,但不能在其他.html页面上工作(在.ts文件下工作) - 堆栈内存溢出...
  10. 对C标准中空白字符(空格、回车符(\r)、换行符(\n)、水平制表符(\t)、垂直制表符(\v)、换页符(\f))的理解
  11. 玩qq游戏提示计算机内存不足,玩QQ游戏内存不足如何解决?
  12. Centos7安装Mysql、九条命令搞定
  13. Pixelmator Pro for Mac(媲美PS的修图软件)
  14. C++复原2048小游戏(纯文字)
  15. Jenkins 与 Gitlab 之间非交互拉取代码并进行代码部署
  16. C#行转列绑定DGV
  17. 如何提高自己的编程能力
  18. Oh My ZSH让你的终端美如画
  19. 运筹学基础——库存管理
  20. 关于浅拷贝、深拷贝的探究

热门文章

  1. 2020R2移动式压力容器充装考试及R2移动式压力容器充装证考试
  2. 在64位CAD上配置合适的ARX程序
  3. java基于聚类的离群点检测_基于两步聚类的离群点检测
  4. 计算机与u盘连接使用,独家分享:教你解决U盘使用中出现的各种问题
  5. 在access中一列称为_11.Access2010数据表中的一列,称为()
  6. python玩转android_Python Xplorer
  7. 牛客挑战赛34 A 能天使的愿望 (dp 分组背包)
  8. 美洽发送离线消息到开发者服务器
  9. 红米4鸿蒙系统刷机包,红米4官方固件rom系统线刷刷机包_红米4线刷官方系统升级包...
  10. 访问学者的推荐信要注意这4点?