zoukankan      html  css  js  c++  java
  • DEEP COMPRESSION小记

    2016ICLR最佳论文 Deep Compression: Compression Deep Neural Networks With Pruning, Trained Quantization And Huffman Codin

    主要针对神经网络模型巨大,在嵌入式机器中比较难运行的问题。

    abstruct

          压缩网络包括三个阶段:pruning, trained quantization and Huffman coding,能将模型减小1/35~1/49,并且不影响精度。首先

    只通过学习重要连接来剪枝网络,接着量化权重,使得权重共享;最后使用Huffman编码进一步压缩。经历了前两个阶段后,重新训练网络

    来fine tune剩下的连接和quantized centroids。剪枝使得连接减小1/9~1/13,量化使得bits从32减小至5。如下图所示。

         
    Network Pruning

          网强剪枝经常被用在减小模型复杂度避免过拟合上。剪枝如上图所示:正常训练网络;根据阈值剪掉一些小的连接;对得到的稀疏

    网络再训练。

          在存储稀疏网络时,采用的是稀疏行(compressed sparse row,CSR) 或稀疏列(compressed sparse column,CSC),

    需要2a+n+1个参数。其中a指的是非零元素的个数(非零元素所在列),n是指行数或列数。怎么得来的呢?

          假设存在如下一个稀疏矩阵

          

         CSR将原始矩阵分为三部分,AA,JA,IC

         

          其中AA指的是所有非零元素,长度为a;JA指的是每一行第一个非零元素在AA中的位置,最后一个元素为非零元素数加1,长度为

    行数加1,即n+1;IC指的是AA中每个元素所对应的列号,长度为a。同理,由这三个指标可得到稀疏矩阵A。所以确定CSR的大小。

    为了进一步压缩模型,存储非零元素的绝对索引(index difference)而不是绝对路径,即后面的元素存储的是与前一个非零元素的

    索引差值。在论文中,采用bits来编码索引差值。以下图为例,如果采用3bit,则最大的span为8,如果某非零元素距离前一个非零

    元素超过8,则将span为8的元素置为0即可。在conv layer和fc layer中,分别采用8bits和5bits对其进行编码。

    Trained quantization and Weight sharing

          网络量化和权值共享可以通过减少权重表达所需的位数,来进一步压缩剪权网络。通过共享权重来限制有效权重的数量,然后对

    共享权重进行fine-tune。

          在Fig3中,左上为权值矩阵,左下为gradient矩阵。作者将矩阵进行聚类成4种cluster,得到量化后的

    权值矩阵,属于同一类的weight则共享权值。在图中,原来的每个weights需要32位,现在只需2位,压缩了16倍。

     Weight Sharing

              使用k-means对每一层的weight聚类,同属一个cluster共享权值,跨层的weight不进行权值共享。对于

    k-means来说,初始点的中心选择很重要,作者采用了三种方式:Forgy(random)density-based, and 

    linear initialization,并以AlexNet中的conv3的权重分布为例,比较了三种方式:

    由上图可以看出,Forgy 和 density-based 方法产生的centroids很少落入到大权值的范围中,

    造成的结果就是忽略了大权值的作用;而Linear initialization产生的centroids非常平均,没有这个问题存在。

    后续的实验结果也表明,Linear initialization 的效果最佳。

    量化之后,目标函数的求导就变为了量化后聚类中心的值的求导:

    Huffman Coding

    Huffman Coding 是一种非常常用的无损编码技术。它按照符号出现的概率来进行变长编码。figure 5为AlexNet的最后一个全连接层

    权重以及权值索引分布。其分布是非均匀的、双峰形状,因此我们可以利用Huffman编码来对其进行处理,该图显示了压缩前和压缩后的长度分布。

    参考:http://blog.csdn.net/zijin0802034/article/details/53982812

             http://blog.csdn.net/cyh_24/article/details/51708469

             http://blog.csdn.net/boon_228/article/details/51718521

             http://blog.csdn.net/shuzfan/article/details/51383809

             http://blog.csdn.net/may0324/article/details/52935869

    http://blog.csdn.net/wangqingbaidu/article/details/52649775

    http://blog.csdn.net/cv_family_z/article/details/51917143

    http://blog.csdn.net/stdcoutzyx/article/details/50926174

  • 相关阅读:
    Sizzle源码分析 (一)
    VueJS 数据驱动和依赖追踪分析
    使用 nvm 来管理nodejs版本 。
    在node中使用 ES6
    mongoDB & Nodejs 访问mongoDB (二)
    mongoDB & Nodejs 访问mongoDB (一)
    Javascript原型链和原型继承
    Javascript 闭包与高阶函数 ( 二 )
    SDOI2019&十二省联考 游记
    Luogu-3648 [APIO2014]序列分割
  • 原文地址:https://www.cnblogs.com/573177885qq/p/6689656.html
Copyright © 2011-2022 走看看