听课(李宏毅老师的)笔记,方便梳理框架,以作复习之用。本节课主要讲了Network Compression,包括为什么要压缩,压缩的主要手段(pruning,knowledge distillation,parameter quantization,architecture design,dynamic computation)
引言
为什么要压缩模型?
- resource-constrained:因为有时需要把模型跑在计算资源有限的设备上,比如手表
- lower latency:比如智能驾驶,把资料从车传到云端又传回来,sensor需要非常及时的响应
- privacy:把资料传到云端,则云端系统持有者就能看到我们的资料
Network Pruning
概念
有些没有工作的参数可以剪掉,不然会占资源。就像人刚出生时没什么神经连接,但是6岁时就很多,再长大到14岁时反而少一点了。
基本框架
- 预训练(此时是大模型)
- 评估重要性(参数或者神经元的)
- 剪枝
- 微调
- 可以再次回到评估阶段,循环多次
在剪枝后准确率会下降,但是可以通过微调,让模型恢复一些。最好不要一下子剪太多,不然模型无法恢复。可以一次剪一点,比如10%。
weight pruning
剪掉参数之后,模型不规则。所以用pytorch不好实践(主要是函数库的问题,如果写了不规则模型的函数库也可以),硬件也不允许。所以想通过把剪掉的参数补0来让模型变得规则,但实际上模型并没有变小。
sparsity是指有多少百分比的参数被剪掉了,图中的sparsity接近1,但基本上没加速,多数情况下还变慢了
neuron pruning
Why pruning?
提出大乐透假说
为什么要先train大的再把它变成小的?怎么不直接从小的开始train?
因为大的模型更好train,直接train小的比train完大的变小的结果差。
为什么大的更好train?有一个假说叫大乐透假说。
大乐透假说的解释
一开始买更多彩票增加中奖率。可以把一个大的network看做是很多的sub-network。只要有一个sub-network成功,那这个大的network就能成功。
实验证明大乐透假说
剪枝之后的小network,如果里面的参数都是random init的而不是没剪枝之前的,那就train不起来(对应绿色的参数);但是如果是用的剪枝之前的参数,相应位置的参数一一对应(红色的参数),这个小网络就能train。
正负号是初始化参数能不能训练得起来的关键,绝对值不重要
反驳大乐透假说
- 直接train小的也可以,只要多点epoch(Scratch-B)
- 大乐透假说只在特定条件下起作用(小learning rate, unstructured)
这里的unstructured指的是以weight为单位prune才能观察到大乐透现象。