【李宏毅2020 ML/DL】P45-50 Network Compression
2021/6/22 23:28:23
本文主要是介绍【李宏毅2020 ML/DL】P45-50 Network Compression,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
我已经有两年 ML 经历,这系列课主要用来查缺补漏,会记录一些细节的、自己不知道的东西。
已经有人记了笔记(很用心,强烈推荐):https://github.com/Sakura-gh/ML-notes
本节内容综述- 为什么提出模型压缩?因为我们有把Deep Model放在移动端设备的需求,因此要压缩空间、加快计算速度。
- 李老师不擅长硬件,因此今天的内容中没有这方面的。
- 第一部分是 Network Pruning 。最后得出结论,对神经元而非weight进行Pruning,可以保留转换成矩阵的特性,不会在运算速度上造成伤害。
- 接下来是 Knowledge Distillation 的内容。
- 第三部分是 Parameter Quantization 。
- 第四部分是 Architecture Design,李老师认为这可能是最有效的做法之一。
- 最后,简单介绍了一下 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
- Using less bits to represent a value.
- 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
如图,根据目前情况,选择不同的计算方案(强力的耗费资源的,或弱小的但不费资源的)。
有几个解决方案:
- 训练大量的分类器(从小到大),但是这样会占用存储空间;
- 可以将不同的 layer 提取,从而有不同的分类器。如下图。
但是,如上图两个表,这也会面临两个问题:
- 靠近输入层的layer其output对于任务表现并不好;
- 此外,对中间层进行训练,还会影响整体网络的性能。
Multi-Scale Dense Networks
李老师提及了 Multi-Scale Dense Networks,让大家可以参考。
这篇关于【李宏毅2020 ML/DL】P45-50 Network Compression的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享