深度压缩

DEEP COMPRESSION: COMPRESSING DEEP NEURAL NETWORKS WITH PRUNING, TRAINED QUANTIZATION AND HUFFMAN CODING:用剪枝、训练量化和霍夫曼编码压缩深度神经网络

这篇论文是Stanford的Song Han的 ICLR2016 的 best paper

1 Abstract

  • 论文想解决的问题?

    神经网络的计算密集性以及内存密集性使得其在嵌入式设备上难以部署

  • 论文如何解决该问题?

    • 通过剪枝减少连接数量

    • 通过量化权重增加共享权重

    • 应用哈夫曼编码

  • 应用结果

    • 减少AlexNet、VGG-16在ImageNet上的训练所需内存,不掉精度

    • 允许将模型装入片上静态存储器,而不是片外动态存储器

    • 有效应用于受带宽限制的移动应用

    • 在cpu、gpu、移动gpu上更快的分层速度和能源效率

2 Introduction

  • 研究背景

3 Network Pruning 网络剪枝

  • 剪枝过程 先正常训练学习连接性,然后将权重低于阈值的连接删除(剪枝),最后重新训练网络学习剩余稀疏连接的最终权重。

    根据作者之前的论文,阈值(threshold)的计算方式为:


     s是参数,称为灵敏度,std为层权重参数的标准差

  • 存储方式
    补充知识:在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵

    对于稀疏矩阵来说,采用二维数组的存储方法既浪费大量的存储单元用来存放零元素,又要在运算中花费大量的时间来进行零元素的无效计算。所以必须考虑对稀疏矩阵进行压缩存储。

    通过压缩稀疏行(CSR) 或者压缩稀疏列(CSC)格式,来存储剪枝后的稀疏结构。CSR实现细节:Compressed Sparse Row(CSR)——稀疏矩阵的存储格式 - 知乎 (zhihu.com)

  • 为了进一步压缩

4 训练量化和权重共享

TRAINED QUANTIZATION AND WEIGHT SHARING

  • 通过减少表示权重的比特位数量,网络量化和共享权重将更大程度的压缩被修剪后的网络。通过让多个连接共享相同的权重来限制需要存储的有效权重的数量,然后对这些共享权重进行微调。

  • 权重被量化为四个箱(颜色),同一个箱的所有权重共享一个权值,因此对于每个权重,只需要将一个小索引存储到共享权重表中。在更新期间,所有梯度都按颜色分组并相加在一起,乘以学习率并被上次迭代的共享质心减去从而得到新的共享质心。

  • 压缩率计算

    n为连接数,k为簇数,b为每个连接所占位数

    比如上图,原本有4x4=16个连接每个占32位,16个权重值,将其分为4簇,则n=16,b=32,k=4则 r = 16 x 32 ÷ (16 x log4 + 4 x 32) = 3.2

  • 权重初始化 质心初始化影响聚类质量,从而影响网络的预测精度。作者采用以下三种方法:

    (1)Forgy 随机初始化

    (2)基于密度初始化

    (3)线性初始化:初始化在原始权重的[min,max]之间线性间隔质心。与前两种方法相比,该初始化方法对权重的分布是不变的,并且是最分散的。

实验表明线性初始化效果最佳。

  • 前馈和反向传播

一维k均值聚类的中心是共享权值。在查找权值表的前向阶段和后向传播阶段存在一个间接层。为每个连接存储共享权重表的索引。在反向传播过程中,计算每个共享权的梯度,并用于更新共享权。

质心梯度计算公式:

L表示损失,Wij表示权重,I表示Wij的质心索引,Ck表示层的第k个质心,指示符函数

  • 哈夫曼编码

Huffman Coding 是一种非常常用的无损编码技术。它按照符号出现的概率来进行变长编码。上图的权重以及权值索引分布来自于AlexNet的最后一个全连接层。由图可以看出,其分布是非均匀的、双峰形状,因此我们可以利用Huffman编码来对其进行处理,最终可以进一步使的网络的存储减少20%~30%。

5 实验

6 代码

我将模型剪枝进行了简单的复现,采用的是百分比取阈值的方式

项目连接:DeepLearning/神经网络剪枝 at main · NongGX/DeepLearning (github.com)

参考:

(9条消息) DEEP COMPRESSION: COMPRESSING DEEP NEURAL NETWORKS WITH PRUNING, TRAINED QUANTIZATION AND HUFFMAN_落地生根1314的博客-CSDN博客

【深度神经网络压缩】Deep Compression (ICLR2016 Best Paper) - 知乎 (zhihu.com)

【DL论文精读笔记】 深度压缩的更多相关文章

  1. 【深度学习 论文篇 02-1 】YOLOv1论文精读

    原论文链接:https://gitee.com/shaoxuxu/DeepLearning_PaperNotes/blob/master/YOLOv1.pdf 笔记版论文链接:https://gite ...

  2. [置顶] 人工智能(深度学习)加速芯片论文阅读笔记 (已添加ISSCC17,FPGA17...ISCA17...)

    这是一个导读,可以快速找到我记录的关于人工智能(深度学习)加速芯片论文阅读笔记. ISSCC 2017 Session14 Deep Learning Processors: ISSCC 2017关于 ...

  3. 论文学习笔记 - 高光谱 和 LiDAR 融合分类合集

    A³CLNN: Spatial, Spectral and Multiscale Attention ConvLSTM Neural Network for Multisource Remote Se ...

  4. GoogLeNetv3 论文研读笔记

    Rethinking the Inception Architecture for Computer Vision 原文链接 摘要 卷积网络是目前最新的计算机视觉解决方案的核心,对于大多数任务而言,虽 ...

  5. GoogLeNetv2 论文研读笔记

    Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift 原文链接 摘要 ...

  6. GoogLeNetv1 论文研读笔记

    Going deeper with convolutions 原文链接 摘要 研究提出了一个名为"Inception"的深度卷积神经网结构,其目标是将分类.识别ILSVRC14数据 ...

  7. GoogLeNetv4 论文研读笔记

    Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning 原文链接 摘要 向传统体系结构中引入 ...

  8. [论文阅读笔记] LouvainNE Hierarchical Louvain Method for High Quality and Scalable Network Embedding

    [论文阅读笔记] LouvainNE: Hierarchical Louvain Method for High Quality and Scalable Network Embedding 本文结构 ...

  9. [论文阅读笔记] Structural Deep Network Embedding

    [论文阅读笔记] Structural Deep Network Embedding 本文结构 解决问题 主要贡献 算法原理 参考文献 (1) 解决问题 现有的表示学习方法大多采用浅层模型,这可能不能 ...

  10. DL论文

    题目:Accurate Image Super-Resolution Using Very Deep Convolutional Networks(2016CVPR) 摘要:文中提出了一种高精度处理单 ...

随机推荐

  1. day33-线程基础03

    线程基础03 6.用户线程和守护线程 用户线程:也叫工作线程,当线程的任务执行完或者通知方法结束.平时用到的普通线程均是用户线程,当在Java程序中创建一个线程,它就被称为用户线程 守护线程(Daem ...

  2. 如何使用U盘重装Windows7系统?

    一.重装步骤 第一步 将U盘制作为启动盘. 备注:推荐使用比较纯净的制作工具,如开源工具Rufus制作USB启动盘. 第二步 进入BIOS界面,选择U盘启动. 备注:不同的电脑进入BIOS界面的方式不 ...

  3. ElasticSearch介绍和基本用法(一)

    ElasticSearch 引言 1.在海量数据中执行搜索功能时,如果使用MySQL, 效率太低. 2.如果关键字输入的不准确,一样可以搜索到想要的数据. 3.将搜索关键字,以红色的字体展示. 介绍: ...

  4. K8s nginx-ingress 如何配置二级目录转发远程静态服务器基于Vue路由history模式打包的应用程序

    背景 首先这标题有点绕,我先解释下: 首先我们有静态服务器,上面某个目录有Vue路由history模式打包的应用程序(也就是build后的产物): 但是静态服务器一般不做对外域名用的,我们需要在k8s ...

  5. k8s中节点级别的日志

    容器化应用程序写入到 stdout 和 stderr 中的任何信息,都将被容器引擎重定向到某个地方.例如,Docker 容器引擎将 stdout 和 stderr 这两个输出流重定向到 logging ...

  6. netstat -lnp |grep XXX后不显示进程

    netstat -lnp |grep XXX后不显示进程,不一定是没有进程,可能是这个命令不好使,换成 ps -ef | grep XXX

  7. vue3 自定义指令控制按钮权限

    经过1个周的摸索和查阅资料,终于搞定VUE3中自定义指令,实现按钮级别的权限控制.当然,只是简单的对按钮进行隐藏和删除的dom操作比较容易,一直纠结的是当按钮无权限时,不是直接删除当前dom元素(bu ...

  8. 关于WinSCP如何通过Tunnel隧道进行远程连接-进行文件的传输

    对于公司业务相关的重要的Linux服务器,一般都会限制源IP登录,一般就会使用到jumper server(跳板机) 这样一来,我们的Client就无法直接ssh/scp/sftp到目标服务器了,这样 ...

  9. C#实现登录某web进而获取其token数据

    实习在学C#,记录一下学习过程! 首先是需求描述(基于C#的.net core MVC实现): User: Resource Owner Agent:Brower auth.brightspace.c ...

  10. Docker容器技术基础

    Docker基础 目录 Docker基础 容器(Container) 传统虚拟化与容器的区别 Linux容器技术 Linux Namespaces CGroups LXC docker基本概念 doc ...