当前位置:   article > 正文

【网络轻量化】模型剪枝——Deep compression_deep compression 剪枝

deep compression 剪枝


开始之前学习一个单词热热身:

scrutiny 英[ˈskruːtəni]
n. 仔细检查; 认真彻底的审查;
[例句]His private life came under media scrutiny
他的私生活受到媒体的密切关注。


1 摘要

     “The “deep compression”, a three stage pipeline: pruning, trained quantization and Huffman coding”

     deep compression出自ICLR 2016,主要工作是压缩神经网络模型,最直观的表现是缩小神经网络权值文件大小,上升一个层次就是缩减模型大小使得神经网络应用可以部署在受硬件计算能力限制的移动端。

     主要的创新点条理清晰,根据下图,给定一个定义好的神经网络:
在这里插入图片描述
1、进行剪枝,去除冗余的连接结点,仅保持提供有用信息的连接;
2、对retrain后的权值量化与共享,量化是利用k-means方法对权重进行聚类,得到聚类后的值;共享是将权重中聚类后对应分组的位置统一设为聚类后的值;(图中Code Book指的是effective weights),这样仅仅需要存储Code Book和索引值;
3、应用哈夫曼编码进一步减少冗余;

2 网络剪枝

网络剪枝可分为三个过程:
1、对网络进行剪枝:对于网络中每一个卷积层,若其权重ω小于设定阈值,则将其设为0;
2、再次训练剪枝后的网络,得到新的权重文件;
3、将权重文件存储为sparse structure,其格式为compressed sparse row (CSR)compressed sparse column (CSC) ,具体操作为:

      得到的新的权重文件中包含很多稀疏的n×n的矩阵,矩阵中大多数的值为0,可以通过相应的存储稀疏矩阵的方式(CSR、CSC)对这个稀疏矩阵进行存储,采用该方式对矩阵进行存储可以减少相应的存储量。

      首先把所有的非零值存入列表AA,假设所有的非零值的元素的个数为a,然后把稀疏矩阵每一行第一个非零元素对应在AA的位置索引存入列表JA,在列表JA最后再添加一个数字,其值为所有非零元素的个数+1,所以JA中的元素个数就是行数n+1,然后把AA中每一个元素在原始矩阵中的列索引存入列表IC。这样就把一个原始的n×n的稀疏矩阵转换为2a+n+1个数字。

在这里插入图片描述
      将稀疏矩阵转换为CSR/CSC格式后,其列表中存储的参数是绝对参数,因为列表中表示索引的参数是递增的,所以如果采用相对参数的话,即两个索引参数的差值,存储的值会更小。比如用三个比特存相对参数,3 bit可以包含的间距为8

  • 当间距小于8时:用3比特的值就可以恢复出相应的位置;
  • 当间距大于8时:在第8个位置插入0值,然后用3bit的与插入的0值的差分位置恢复出相应的位置;
  • 间距大于8的倍数时:每隔8个位置插入0值,与最后一个0值的3bit的差分位置恢复出位置;
    在这里插入图片描述

3 权值量化与共享

      上一步处理了神经网络的结点以及权值文件的存储方式以减少权值文件大小,这一步主要针对的是权重系数中矩阵的数值处理
在这里插入图片描述

      对于上图4×4大小的ω权重矩阵,对其应用k-means聚类算法,将相近的数值归为一类。上图中将数值归为4类,对应的数值为[2.00, 1.50, 0.00, -1.00]。对于4×4大小的ω权重矩阵梯度,将k-means聚类后相同类别位置的梯度值相加,得到的四个梯度求和值即为对于[2.00, 1.50, 0.00, -1.00]的梯度值,利用梯度值更新后,得到新的权重值[1.96, 1,48, -0.04, -0.97],最后再将该四个值填补到ω权重矩阵对应的分类位置即可。

     这样最终保存权重文件时仅需要存储四个浮点数以及其对应的索引位置即可,相比原来存储16个浮点数,所占内存大大减小。

  • 运用K-means的聚类方法,将权值接近的共享。运用聚类中心点的值作为所有权值的值。例如上面相同颜色的就是同一个聚类类别。只在层内共享权重,层间不共享。
  • 权值更新方法:将所有聚类的点的梯度相加作为权值中心的梯度用于更新权值。
  • 确定初始的聚类中心点:
    在这里插入图片描述
    权值共享的是聚类中心点的值,初始的聚类中心点是如何确定的呢?
          有三种方法可以确定聚类中心点的位置。第一种是随机的方法,就是在权值中随机的选k个值做为聚类中心点。第二种是基于密度的初始化,上图中横轴是对应的权重值,纵轴是权值的数量,类似于直方图一样。红色的线是权值的直方图统计,蓝色的线是权值的累积统计,类似于概率密度函数和概率累积函数。插入一个解释:

PDF(probability density function),是概率密度函数,描述可能性的变化情况,如正态分布密度函数,在中间出现的情况最大,两端出现的情况较小。
CDF(cumulative distribution function),是分布函数,描述发生某事件概率。任何一个CDF,是一个不减函数,最终等于1。而PDF描述了CDF的变化趋势,即PDF为CDF曲线的斜率。
我理解的是,我们最终目的是算概率,而算概率需要CDF,要了解CDF你就得知道PDF的情况,否则就很难入手。

      基于密度的初始化就是把权值数量分布从小到大等分成k份,然后每一份数量分界点对应的权值就是聚类的中心。第三种的线性初始化就是直接把权重值的最小值最大值之间直接线性进行划分。

      因为网络中大的权值往往是更重要的,前两种方法容易让聚类的中心点往概率密度大的地方累积而非取到极大值,而线性分类法得到的权值更容易是极大值,所以线性的初始化方法比较好,作者通过实验也发现通过线性的分类方法取得了更好的准确率。

4 哈夫曼编码

      哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,主要目的是根据使用频率来最大化节省字符(编码)的存储空间。如果考虑到进一步节省存储空间,就应该将出现概率大(占比多)的字符用尽量少的0/1进行编码,也就是更靠近根(节点少),这也就是最优二叉树-哈夫曼树。
      总而言之,哈夫曼编码运用字符出现的概率来进行编码,只要权重值不是均匀分布的,用短码代表出现频率高的权重,用长码替代出现频率低的权重,就能减少一定的冗余。

参考: https://blog.csdn.net/zhaomengszu/article/details/54562039

欢迎关注【OAOA

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/190783
推荐阅读
相关标签
  

闽ICP备14008679号