Learning Efficient Convolutional Networks through Network Slimming

Abstract:

讲道理 它这个摘要写得好霸气。。太猛了
这个方法它可以同时做到以下三件事:
1. 减小模型大小
2. 减小运行时的内存占用
3. 在牺牲一点点精度的情况下大幅减少计算
能做到以上这些事情的其他方法也有,但是其他方法或需要特殊的硬件,或需要额外的训练开销,但是这个方法都没有!
那么它是怎么做到呢?简单来说,就是拿一个大型网络(如resent105),往里面搞点东西,然后拿去训练,在训练的过程中自动的把那些额外的channel删掉,进而得到一个比较精简的模型。
效果也是很不错的:模型大小是原来的1/20,操作数是原来的1/5。

Motivation

1. 现有方法并不能解决所有问题(就是摘要里说的1. 减小模型大小;2. 减小运行时的内存占用;3. 在牺牲一点点精度的情况下大幅减少计算);
2. 现有的很多方法需要额外的软/硬件加持,比如针对权重剪枝的压缩方法显然不适用于常见的加速矩阵运算的GPU。


Method

文章先抛出一些比较常见的压缩方法:

这个方法之前想过,就是利用SVD来对权重矩阵进行降维,进而达到压缩模型的作用。
这个方法的优点很明显,那就是够简单(毕竟连我都想得到。。。。),缺点就是只能针对全链接起作用(因为全链接才可以把权重写成矩阵的形式),而在处理CV的大型网络中,最占存储和最耗费计算资源的其实是CNN,所以整体效果并不明显。

这个应该怎么翻译呢。。。权重分桶?可能吧.. 其实这个方法也挺有趣的,就是把各个权重进行聚类,然后使用聚类中心代替当前权重。然后再用一个表来存储一个字节数较小的数和聚类中心之间的映射关系,然后再用这些字节数较小的数放到权重中。(讲得有点绕,但是很简单就对了)
优点:很明显,在存储的时候压缩效果特别好。试想,从double变成int8, 减少了这么多倍。
缺点:也很明显,就是:
1. 并不能减少推理时候的内存消耗和时间加速,因为你需要把你映射出来的float32/float64放到内存中,需要该用多少还是用多少;
2.准确率损失绝对大。试想,如果使用uint8来存储,那就只能有256个聚类中心,但是一个channel的大小可能是512*512,那平均每个聚类中心就有1024个数值了,这个准确率绝对会受到很大的影响。但是如果你使用int16或者int32来存储的话,那精度的确会上升,但是这个时候,你的压缩效果就绝对没那么高了。

这个是权重剪枝,就是把一些不重要的权重置0/删除。
优点:我觉得没有优点。。。
缺点:做权重剪枝有两个办法,一个是把不重要的权重置0,一个是把不重要的权重删掉。如果你把不重要的权重置0,看起来好像是ok的,但是你0也是个数值,所以不管是在外存还是内存中,该占用的内存还是占用了。而对于第二个处理方式(把不重要的权重删掉),首先不说主流的框架不支持,主要是主流的硬件也不支持。因为深度学习采用GPU的原因正是因为GPU使用矩阵运行来加速我们的训练,而把不重要的参数删掉之后,那这个矩阵就出现了空洞,这时候就没办法用矩阵运算了。

基于结构的剪枝。paper中说道,我们的方法也是属于这个范畴,但是他说其他的一些结构化剪枝没有咱们文中这个丝滑(我还没看他对比的那几篇paper,姑且就相信他吧)。
优点:这种基于结构化的剪枝不需要软/硬件加速,因为没有破坏矩阵运算的结构,但是我觉得本质原因是结构化剪枝是得到一个小规模的正常的网络,所以它和其他网络并没有区别。
缺点:作者说说这篇paper提出的方法更加丝滑。

这个我不懂了,没接触过,不过按照paper中的描述,应该有点像AutoML。

Detail

用简单的一句话概括就是:将L1正则化从权重扩展到channel。
其实这个也解决了我之前的一个问题:我之前用L1来normalize网络中的权重,然后将权重删掉虽然可行,但是就陷入了前面所说的,基于权重剪枝的问题。那我如何把L1的作用水平从weight到更高呢?
在这里,他就把损失函数定义成

, 其中g(*)就是平滑L1正则。那么虽然L逐渐被优化,绝大多数的
都变成了0,这时候我们再看另外一个公式
:当绝大多数
变成0的时候,很多的channel也变成了0,那就可以把他们删除掉了。

一开始我是有点疑惑,为什么

为0的channel正好就会是不重要的,然后我发现了
是和
有关的,那就懂了,这就变成了一个优化问题了。

然后这篇paper中有提到一个trick也是不错的:就是使用smooth L1正则化来代替L1正则化。

这篇也给了一些启示,或许从L2出发思考也会有其他的不错的方案。

内存中有两个4字节以压缩的bcd_卷积神经网络的压缩与加速 -- 剪枝(PRUNING)论文(二)...相关推荐

  1. 内存中有两个4字节以压缩的bcd_【汇编程序】循环程序设计方法 求A和B两个4字节BCD数之和 他们在内存中以压缩BCD码形式存放...

    ;循环程序设计方法 求A和B两个4字节BCD数之和 他们在内存中以压缩BCD码形式存放 ;低字节在前 高字节在后 要求结果以同样形式存放以SUM的单元中 data segment a db 44h,3 ...

  2. 内存中有两个4字节以压缩的bcd_高中对口计算机微机原理04第一二章测验

    原理第一.二章练习 一.选择题 1.下列四个不同进制的数中,数值最大的是__________ A. 1001001B B. 110 O C. 71D D. 4AH 2.下列四种不同数制表示的数值最小的 ...

  3. 卷积核里面的参数怎么来的_FSNet:利用卷积核概要进行深度卷积神经网络的压缩...

    据官方消息,ICLR 2020会议将取消线下会议,并于4月25日-30日线上举办虚拟会议.本届会议共有 2594篇投稿,其中 687篇论文被接收(48篇oral论文,107篇spotlight论文和5 ...

  4. 多模态语义分析_「CV学霸开讲」卷积神经网络压缩、多模态的语义分析研究

    原标题:「CV学霸开讲」卷积神经网络压缩.多模态的语义分析研究 [新智元导读]2017年度百度奖学金10位候选人中,人大的陈师哲和北大的王云鹤所学专业主要集中在计算机视觉,本文将详细呈现CV学子的求学 ...

  5. 设备管理器中的计算机有什么用,为什么计算机设备管理器中有两个图形卡?

    为什么计算机设备管理器中有两个图形卡?该小组中的一个朋友今天问了一个问题,说当我今天使用Dxdiag命令检查计算机的硬件信息时,我发现计算机设备管理器中有两个. 显卡,以为我的电脑有问题,我看上去很着 ...

  6. Android方法的概括,Android_Android中startService基本使用方法概述,Android中有两种主要方式使用Ser - phpStudy...

    Android中startService基本使用方法概述 Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindServi ...

  7. 内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)

    如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看. majflt代表major fault,中文名叫大错误,minflt代表minor faul ...

  8. JS中有两种自加法操作

    JS中有两种自加法操作.它们的运算符是++,它们的函数是向1添加运算符. 我和我的区别在于操作的顺序和组合的方向. 其中: ++var被称为预自动添加,变量执行自动添加操作后.它的操作是先执行自动加法 ...

  9. 汇编:将指定的内存中连续N个字节填写成指定的内容

    1.loop指令实现 1 ;=============================== 2 ;循环程序设计 3 ;将制定内存中连续count个字节填写成指定内容(te) 4 ;loop指令实现 5 ...

最新文章

  1. Android View体系(六)从源码解析Activity的构成
  2. android.hardware.camera2使用指南
  3. java开发手册:线程池不允许使用 Executors 去创建
  4. Gourmet Cat
  5. java 命令行eclipse_在命令行中运行eclipse中创建的java项目
  6. SQL Server下载安装
  7. antd权限管理_推荐6款超好看实用的管理后台模版
  8. 霸气!任正非:即使美企断供 也无法威胁华为生存
  9. Leanote使用mysql_《搭建个人Leanote云笔记本》阿里云体验实验室 教程
  10. werkzeug Request
  11. 【转】JAVA中的浅拷贝和深拷贝
  12. 谈谈一些有趣的CSS题目(十三)-- 巧妙地制作背景色渐变动画!
  13. oracle10g 64位安装包下载地址,Oracle10g下载地址--多平台下的32位和64位
  14. windows下python Tkinner环境布置(包含PIL环境安装)
  15. visual studio可以开发app吗_做好APP定制开发的计划,可以让你的应用开发事半功倍...
  16. word20161210
  17. 计算机应用基础第3次平时作业,计算机应用基础第3次作业.doc
  18. WMS系统仓库条码管理流程解析
  19. (八)、MultipartFile
  20. 1.6 Go语言适合做什么

热门文章

  1. php 函数有命名空间吗_一篇弄懂PHP命名空间及use的使用
  2. OS / 线程哪些内容是私有的和共享的?
  3. 用ESP32玩转真彩屏
  4. modern php怎么网,Modern PHP
  5. python代码调试快捷键_6. Pycharm的传参、快捷键、执行代码、调试模式
  6. python编程从入门到精通读书笔记(基础知识)
  7. Java通过Pattern类使用正则表达式
  8. 实现一个简单的代码字计数器(二)
  9. CodeForces - 760E Nikita and stack
  10. Ubuntu/linux 系统彻底杀死一个进程的方法