[2022]李宏毅深度学习与机器学习第十三讲(必修)-Network compression
做笔记的目的
1、监督自己把50多个小时的视频看下去,所以每看一部分内容做一下笔记,我认为这是比较有意义的一件事情。
2、路漫漫其修远兮,学习是不断重复和积累的过程。怕自己看完视频不及时做笔记,学习效果不好,因此想着做笔记,提高学习效果。
3、因为刚刚入门深度学习,听课的过程中,理解难免有偏差,也希望各位大佬指正。
Outline
虽然大的模型效果不错,但是小的模型同意有应用市场。需要把模型跑在资源有限的情况下比如手表,这种情况就不适合用大的模型。如果传到云端,但是可能会有延时(自动驾驶),同时可能涉及隐私安全。所以我们需要小的模型,但是也要保证小的模型的准确率。
大纲如下:
Network can be pruned
有两种思路:
- 删除一些weight
- 删除一些神经元
整个步骤如下图,当network够小时,就停止了。
修剪的单位可以是参数可以是神经元,如果是weight,这样网络就不规则了,这样不好进行实现,同时GPU加速也不好加速。为了加速方便会把weight变为0.
但实际上,准确率降低了的同时运算时间基本上没有改变,所以这种方法并不是很实用。
删掉一些神经元
Why Pruning
为什么不能直接训练一个小的模型那?直观的来说就是,直接训练一个小的模型,效果并不如剪枝的效果好。但是同样的模型,为什么剪枝的效果更好那?比较著名的有Lottery Ticket Hypothesis(彩票假设)。
大的network可以看成包括多个小的network,所以有很多机会可以win,我们选出来的就是win的部分。
Lottery Ticket Hypothesis(彩票假设)的实验,剪枝后剩下来的是幸运的模型,尽管确定了模型架构但是如果这个时候随机初始化训练不起来,同时如果采用一开始的随机初始化就可以训练起来。同时假说还证明了只要不改变正负号,就可以训练起来,正负号是能不能训练起来的关键。
也有一些论文在讨论随机初始化,然后修剪调一些神经网络,之后进行直接预测。
但是也有反对彩票假说的,认为彩票假说是只有在学习率小的时候符合。
Knowledge Distillation
训练一个大的模型做为老师,然后用小的模型去学习老师。为什么不直接train小的那?从结果上看是效果没有学习老师的效果好。为什么那?因为Teacher net可能会给student一些额外的信息,比如1像7,所以如果训练的时候没有看过7,也有可以看出来
Ensemble
多个模型求平均,然后用来教学生。Ensemble这个技术不仅仅能用在Knowledge Distillation上,在很多比赛上前几名往往就是多个模型的平均。
Temperature for softmax
要取一个Temperature,让分布平滑,这样就能学习到一些关系。
Parameter Quantization
用少的空间,取储存参数,Weight Clustering每一个Cluster center 取一个值。
有的方法如下图。
Binary Weights 技术是神经元只有两种状态0-1,他的效果还不错,同时不容易过拟合。
Architecture Design-Depthwise Separable Convolution
filter number等于channel number。每个filter只管一个channel。
Depthwise Convolution 之后进行Pointwise Convolution,这里每个filter里面的卷积核都是1*1的。每个filter产生一个channel。
参数对比
为什么这一招有用那?这样优化会让w有一些限制,但是这个是减少参数非常常用的方法,同时这也做也不容易过拟合。
Dynamic Computation
同一个模型在不同的机器上运用,可能需要Dynamic Computation技术
Dynamic Depth
加一个extra Layer,这个训练方法就可以达到Dynamic的效果。
Dynamic Width
同一个网络不同的宽度,训练的时候一起考虑,这样训练需要一些技巧。
Computation based on Sample Difficulty
对于简单问题提取停下来,对于难的问题往后面走
前面4个技术都可以让net变小,同时这四个技术并不互斥,可以一起被使用。