【DL论文精读笔记】 深度压缩
深度压缩
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)
参考:
【深度神经网络压缩】Deep Compression (ICLR2016 Best Paper) - 知乎 (zhihu.com)
【DL论文精读笔记】 深度压缩的更多相关文章
- 【深度学习 论文篇 02-1 】YOLOv1论文精读
原论文链接:https://gitee.com/shaoxuxu/DeepLearning_PaperNotes/blob/master/YOLOv1.pdf 笔记版论文链接:https://gite ...
- [置顶]
人工智能(深度学习)加速芯片论文阅读笔记 (已添加ISSCC17,FPGA17...ISCA17...)
这是一个导读,可以快速找到我记录的关于人工智能(深度学习)加速芯片论文阅读笔记. ISSCC 2017 Session14 Deep Learning Processors: ISSCC 2017关于 ...
- 论文学习笔记 - 高光谱 和 LiDAR 融合分类合集
A³CLNN: Spatial, Spectral and Multiscale Attention ConvLSTM Neural Network for Multisource Remote Se ...
- GoogLeNetv3 论文研读笔记
Rethinking the Inception Architecture for Computer Vision 原文链接 摘要 卷积网络是目前最新的计算机视觉解决方案的核心,对于大多数任务而言,虽 ...
- GoogLeNetv2 论文研读笔记
Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift 原文链接 摘要 ...
- GoogLeNetv1 论文研读笔记
Going deeper with convolutions 原文链接 摘要 研究提出了一个名为"Inception"的深度卷积神经网结构,其目标是将分类.识别ILSVRC14数据 ...
- GoogLeNetv4 论文研读笔记
Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning 原文链接 摘要 向传统体系结构中引入 ...
- [论文阅读笔记] LouvainNE Hierarchical Louvain Method for High Quality and Scalable Network Embedding
[论文阅读笔记] LouvainNE: Hierarchical Louvain Method for High Quality and Scalable Network Embedding 本文结构 ...
- [论文阅读笔记] Structural Deep Network Embedding
[论文阅读笔记] Structural Deep Network Embedding 本文结构 解决问题 主要贡献 算法原理 参考文献 (1) 解决问题 现有的表示学习方法大多采用浅层模型,这可能不能 ...
- DL论文
题目:Accurate Image Super-Resolution Using Very Deep Convolutional Networks(2016CVPR) 摘要:文中提出了一种高精度处理单 ...
随机推荐
- OKR之剑(理念篇)02—— OKR布道之旅
作者:vivo互联网平台产品研发团队 1.我们是如何引入的 1.1.企业文化匹配 大概是在2013年底,一些创业者在硅谷深受OKR洗礼,并在自己的公司内小范围运用,以此OKR开始传入中国.而vivo初 ...
- 认识RocketMQ4.x架构设计
消息模型 单体的消息模型 RocketMQ消息模型跟其他的消息队列一样 都是 producer - > topic->consumer producer 生产消息 也就是发送者 topic ...
- Beats:通过Metricbeat实现外部对Elastic Stack的监控
- rocketmq 4.x 双主双从同步读写
文章标题写的是多M多S同步双写集群安装,但是看具体参数配置,写的是异步复制Master brokerRole=ASYNC_MASTER flushDiskType=SYNC_FLUSH #刷盘方式 # ...
- 手把手教你使用LabVIEW人工智能视觉工具包快速实现传统Opencv算子的调用(含源码)
前言 今天我们一起来使用LabVIEW AI视觉工具包快速实现图像的滤波与增强:图像灰度处理:阈值处理与设定:二值化处理:边缘提取与特征提取等基本操作.工具包的安装与下载方法可见之前的博客. 一.图像 ...
- 智能工厂的ERP和MES之间的区别?
无论在哪里,ERP(Enterprise Resource Planning,企业资源计划)和MES(Manufacturing Execution System,即制造执行系统)系统都不是同样的东西 ...
- 使用 Apache Hudi 实现 SCD-2(渐变维度)
数据是当今分析世界的宝贵资产. 在向最终用户提供数据时,跟踪数据在一段时间内的变化非常重要. 渐变维度 (SCD) 是随时间推移存储和管理当前和历史数据的维度. 在 SCD 的类型中,我们将特别关注类 ...
- token字段,请务加在请求地址的头部header
如下图所示,你必须在请求的头部加上 token参数,主要原因有两个.第一点,这个是登录标志,因为接口访问用不了cookie,所以只能通过这个header请求标志判断用户是否已经登录.第二点,系统有时候 ...
- .NET API 接口数据传输加密最佳实践
.NET API 接口数据传输加密最佳实践 我们在做 Api 接口时,相信一定会有接触到要给传输的请求 body 的内容进行加密传输.其目的就是为了防止一些敏感的内容直接被 UI 层查看或篡改. 其实 ...
- 如何免安装使用 Python?推荐 17 个在线的 Python 解释器!
作者:Al Sweigart 译者:豌豆花下猫@Python猫 英文:https://inventwithpython.com/blog/2022/10/30/17-online-python-ide ...