• 2021 神经网络压缩 (李宏毅


    首先,为什么需要对神经网络模型进行压缩呢?我们在之前的课程中介绍过很多大型的深度学习模型,但当我们想要将这些大模型放在算力比较小的边缘设备或者其他IoT设备里面,就需要对大模型进行压缩。

    Lower latency:低时延 Privacy:私密性

    介绍5个网络压缩的方法,我们只考虑算法(软件)层面,不考虑硬件层面的解决方法。

     

    1. Network Pruning(网络剪枝)

    对于一个大的网络来说,我们能想到的是,众多网络参数中一定会有不重要/冗余的一些参数,因此我们将这些参数减掉达到网络压缩的目的。

    网络剪枝的步骤如下:首先,我们预训练一个大规模的网络,然后评估里面参数的重要性,包括权重(weight)的重要性和神经元(neuron)的重要性。

    • 评价weight重要性,我们可以用绝对值衡量,即绝对值越大,weight越重要,或者采用之前介绍的life long learning的想法(也許我們也可以就把每個參數的 bi 算出來、就可以知道那個參數重不重要)。
    • 评价neuron重要性,我们可以用其输出的结果为0的次数衡量,即输出0越多越不重要。

    接着我们对多余的参数的重要性评估并修剪,得到一个小的网络,再对里面的参数微调,再评估、修剪。。。重复上述过程,直到满足要求,完成Network pruning过程。(一次剪掉大量参数可能对network伤害太大,所以一次只剪掉一点参数比如10%)

    刚才提到,修剪的单位有两种,一种是以权重(weight)为单位,一种是以神经元(neuron)为单位,这两者有什么不同呢?实作上差别较大

    首先Weight pruning,但这样就造成network 形状不规则(irregular),难以编程实现(pytorch定义network每一層有幾個 Neuron/ vector),同时难以用GPU加速(矩阵乘法)。通常的做法是将冗余的weight置为0,但这样做还是保留了参数(等于0),不是真正去除掉。

    在这篇论文中有个关于参数pruning多少与训练速度提升关系的实验验证,其中紫色线sparsity表示参数去掉的量。可以发现,虽然参数去掉了将近95%,但是速度依然没有提升。

    (這個 Network Pruning 的方法、其實是一個非常有效率的方法、往往你可以 Prune 到 95% 以上的參數、那但是你的 Accuracy 只掉 1~2% 而已)

    接着Neuron pruning,通过去除冗余的神经元,简化网络结构。这样得到的网络结构是

  • 相关阅读:
    【Linux】关于磁盘操作命令
    电机控制算法
    【Vue五分钟】五分钟了解webpack实战配置案例详情
    JAVA计算机毕业设计延安市图书馆管理Mybatis+系统+数据库+调试部署
    43页县域农业大数据运营服务中心方案介绍
    requirements.txt文件如何生成及导入
    堆排序算法和Topk思想
    POWER SOURCE ETA埃塔电源维修FHG24SX-U概述
    MySQL性能调优——索引篇
    研发中台拆分过程的一些心得总结
  • 原文地址:https://blog.csdn.net/linyuxi_loretta/article/details/127693695