C/C++教程

【李宏毅2020 ML/DL】P45-50 Network Compression

本文主要是介绍【李宏毅2020 ML/DL】P45-50 Network Compression,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

我已经有两年 ML 经历,这系列课主要用来查缺补漏,会记录一些细节的、自己不知道的东西。

已经有人记了笔记(很用心,强烈推荐):https://github.com/Sakura-gh/ML-notes

本节内容综述
  1. 为什么提出模型压缩?因为我们有把Deep Model放在移动端设备的需求,因此要压缩空间、加快计算速度。
  2. 李老师不擅长硬件,因此今天的内容中没有这方面的。
  3. 第一部分是 Network Pruning 。最后得出结论,对神经元而非weight进行Pruning,可以保留转换成矩阵的特性,不会在运算速度上造成伤害。
  4. 接下来是 Knowledge Distillation 的内容。
  5. 第三部分是 Parameter Quantization 。
  6. 第四部分是 Architecture Design,李老师认为这可能是最有效的做法之一。
  7. 最后,简单介绍了一下 Dynamic Computation 。

 

文章目录

  • 本节内容综述
  • 小细节
      • Network Pruning
        • 如何做
        • Why Pruning?
        • Lottery Ticket Hypothesis
        • Rethinking the Value of Network Pruning
        • Network Pruning - Practical Issue
      • Knowledge Distillation
        • Temperature
      • Parameter Quantization
        • Binary Weights
      • Architecture Design
        • Low rank approximation
        • Review: Standard CNN
        • Depthwise Separable Convolution
      • Dynamic Computation
        • Multi-Scale Dense Networks

 

小细节

Network Pruning

Networks are typically over-parameterized (there is significant redundant weights or neurons).

Prune them!

在生物学,在90年代就有《Optimal Brain Damage》这样的文章,相关研究。

如何做

对于一个神经网络,可以通过衡量并去除其不重要的weight或者neuron,得到新网络。

之后,再用数据训练。

注意,不要一次 remove 太多东西,否则网络可能不会 recover 。一般来讲,都是多次做几次 fine-tune 。

Why Pruning?

How about simply train a smaller network?

It is widely known that smaller network is more difficult to learn successfully.

Larger network is easier to optimize?https://www.youtube.com/watch?v=_VuWvQUMQVk

有一篇论文提出了“大乐透假设”:Lottery Ticket Hypothesis。

Lottery Ticket Hypothesis


如上,对完整的网络初始化、训练、压缩,之后:

  • 如果对新的小网络完全重新初始化,那么不会训练成功;
  • 如果对新的小网络像之前一样初始化,那么会训练成功。

作者由此提出:可能神经元会不会被训练起来,与初始值有很大关系,是一种大乐透现象。

Rethinking the Value of Network Pruning


但是这篇文章,正好得出了与“大乐透假设”相反的结论。

Network Pruning - Practical Issue


如上,做完了 Pruning 的网络,难以组成矩阵,用 GPU 加速了…因此,实际操作上,可能直接把 Pruning 掉的量直接设为 0 。

但是,这样又不会让网络占有的空间变小。因此,实际应用中,运行 Pruning 后的网络是一件比较复杂的事。


如上,发现如果使用取消了连接的 Pruning 后的网络,使用 GPU 的加速并快不到哪里去。

因此,如上,直接去掉某一个神经元是一个比较好的 Pruning 方向。这不会增加计算负担,不会妨碍构成矩阵运算。

Knowledge Distillation

训练一个大网络,用小网络(Student Net)学习大网络。

为什么这样有用?因为小网络学的是一个基于大网络的 distillation 。不仅仅学到一个输出神经元的价值,而是多个神经元的输出。


此外,实际上可以用 Student Net 学习集成模型。这样大大起到了压缩空间的效果,又能较好地进行学习。

Temperature


如上,在输出层,我们为Target Network在做 softmax 除以一个“温度”(通常大于1),以此,让这些值变得相近,方便 Student Network 的学习。

李老师:作业证明,加了温度也不会有什么额外的效果...

Parameter Quantization

  1. Using less bits to represent a value.
  2. Weight clustering.


如图,只要保存各个参数的类别,以及类别对应的数值表就可以。

此外,还可以进行哈夫曼编码等压缩。

Binary Weights


如图,对神经网络进行梯度下降,进行优化;最后把参数都元整为1或-1,则参数就可以用一个位来表示了。记录这个模型。


如图,发现在不少问题上,有了 Binary Connect 效果更好。这可能因为 Binary Weights 本身就是一种正则。

Architecture Design

Low rank approximation


如图,加了一层,是有可能让参数变小的。

Review: Standard CNN

如图,标准的CNN架构,其中两个通道,4个filter,一共有72个参数。

Depthwise Separable Convolution

首先,在 Depthwise Convolution 中,我们的 filter 不是立体的,不需要多通道高,每个 filter 只处理自己的 channel 。

接下来,用 Pointwise Convolution 中,用 1×1 的filter 进行多通道卷积。

这样,其 input 与 output 与标准的卷积层相比,参数少了许多,只有18+8=26个。


具体解释一下,如上图,Depthwise Separable Convolution进行了“参数共享”。


如上,因为一般来输出的通道数 O O O 可能很大, 1 O ≈ 0 \frac{1}{O} \approx 0 O1​≈0;可见,Depthwise Separable Convolution能优化的大小与卷积核尺寸有关。

其应用有很多:

  • SqueezeNet
  • MobileNet
  • ShuffleNet
  • Xception

Dynamic Computation


如图,根据目前情况,选择不同的计算方案(强力的耗费资源的,或弱小的但不费资源的)。

有几个解决方案:

  1. 训练大量的分类器(从小到大),但是这样会占用存储空间;
  2. 可以将不同的 layer 提取,从而有不同的分类器。如下图。


但是,如上图两个表,这也会面临两个问题:

  • 靠近输入层的layer其output对于任务表现并不好;
  • 此外,对中间层进行训练,还会影响整体网络的性能。

Multi-Scale Dense Networks


李老师提及了 Multi-Scale Dense Networks,让大家可以参考。

 

这篇关于【李宏毅2020 ML/DL】P45-50 Network Compression的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!