其他分享
首页 > 其他分享> > 【李宏毅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

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能优化的大小与卷积核尺寸有关。

其应用有很多:

Dynamic Computation


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

有几个解决方案:

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


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

Multi-Scale Dense Networks


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

 

标签:DL,Convolution,Depthwise,李宏毅,网络,如图,Pruning,Network
来源: https://blog.51cto.com/u_15279775/2938526