NTU ML2023Spring Part2.15 神经网络压缩
如果我们想把模型运行在资源有限的环境(手表,无人机)上,就需要压缩模型.为什么不直接在云端计算?一个原因是低延迟,另一个是保障隐私.这里不会讨论硬件方面的做法.
network pruning
在一个庞大的神经网络里,有些参数和神经元可能在摸鱼.这时我们就可以修剪掉它们.评价一个参数的重要性可以直接看它的绝对值,也可以套用 life long learning 那边的想法.对于神经元,也有一大堆方法.拿走某些参数后还要再 finetune 一下,然后可以循环上面的过程.注意不要一下剪掉太多参数,不然可能 finetune 也救不回来.
剪去某些参数后,神经网络的形状是不规则的,就不好操作.因此一般都是剪神经元.
问题来了:既然要把 network 变小,为什么不一开始就训练一个小的?答案是大的 network 比较好 train,然后再压缩之后正确率一般不会掉太多.为什么?参考过去上课视频.还有一个 假说 是 lottery ticket hypothesis,说训练 network 比较看人品,而大的 network 成功的概率更高.看起来像先射箭再画靶.还有一篇论文是解构它的,链接.还可以看 weight agnostic neural networks.
对上面的假说,也有与其同时出现的相反意见:rethinking the value of network pruning,认为小的 network 多跑几个 epoch 也能达到和 pruned model 差不多的效果.
knowledge distillation
我们的神经网络正在蒸蒸日上(雾)
大概思想就是做 supervised learning,用大网络产生 supervise 所需的数据给小网络训练(实际上就是让小网络输出的概率分布逼近大网络).不一定要从单一的大网络学习,也可以从多个大网络的 ensemble 学习.
有一个小技巧,就是给 softmax 加上 temperature:\(y' = \dfrac{\exp(y_i / T)}{\sum_j \exp(y_j / T)}\). 这样可以让大网络的输出更平缓一点,使小网络更容易看出数据之间的关联性.如果不平缓那就和从正确答案开始训练没区别了.当然也可以拿 softmax 前的数据直接学.
parameter quantization
- 丢一些精度其实对结果影响不大.
- weight clustering:对于数值相近的数字,可以用相同的数值来代表它们.
- 记录每个参数属于哪个 cluster 可以用 huffman encoding.
- 可以在训练时就要求参数间比较接近.
- 甚至可以压缩到每个元素是 \(\pm 1\).
architecture design
depthwise separable convolution 是一种对于 CNN 的优化.
-
depthwise convolution
filter 的数目等于 channel 的数目,每个 filter 只负责一个 channel.
-
pointwise convolution
有若干的 filter ,大小为 \(1 \times 1 \times k\),\(k\) 为 channel 的数目.
还有更多网络架构:
dynamic computation
让 network 自由调整运算量.
dynamic depth:为每一层训练一个输出层,按照运算资源多少决定将该层结果送往下一层还是送往该层输出层直接得到答案.在训练时可将总 loss 定义为每个输出层对应 loss 的和.这不是最好的方法,可以参考 multi-scale dense network (MSDNet) .
dynamic width:其实是差不多的,区别就是可以删掉一些宽度.参考 slimmable neural networks.感觉有点像 dropout,但是 dropout 哪些神经元是事先确定的.
也可以让 network 视问题复杂程度自行决定要用多少计算资源.

浙公网安备 33010602011771号