2021李宏毅机器学习笔记--13 Network Compression
摘要
未来有可能将深度学习技术应用于一些移动设备上,但是这些设备有可能存储空间或者资源受到限制,不能存放过深或者过大的模型,也或者受限于计算能力,network不能有太多层或者太多参数。所以说network compression这件事非常重要,本篇文章着重介绍一些让network变小的方式。
一、Network Pruning(修剪)
1.1基本思想
神经网络的参数很多,但其中有些参数对最终的输出结果贡献不大而显得冗余,将这些冗余的参数剪掉的技术称为剪枝。剪枝可以减小模型大小、提升运行速度,同时还可以防止过拟合。
剪枝分为one-shot和iteration剪枝:
one-shot剪枝过程:训练模型–> 评估神经元(或者kernel、layer)的重要性–>去掉最不重要的神经元–> fine-tuning–>停止剪枝。
iteration剪枝过程:训练模型–> 评估神经元(或者kernel、layer)的重要性–>去掉最不重要的神经元–> fine-tuning–>判断是不是要继续剪枝,如果是回到第二步(评估神经元的重要性),否则停止剪枝。
1.2 why pruning
为什么要进行修剪?为什么不直接在数据集上训练小的模型,而是先训练大模型?有两个解释:
一是:因为模型越大,越容易在数据集上找到一个局部最优解,而小模型比较难训练,有时甚至无法收敛。
二是:大乐透假设(Lottery Ticket Hypothesis)
1.3 大乐透假设(Lottery Ticket Hypothesis)
提出大乐透假设试图解释为什么需要修剪。
我们先对一个network进行初始化(红色的weight),再得到训练好的network(紫色的weight),再进行pruned,得到一个pruned network
如果我们使用pruned network的结构,再进行随机初始化random init(绿色的weight),会发现这个network不能train下去
如果我们使用pruned network的结构,再使用原始随机初始化original random init(红色的weight),会发现network可以得到很好的结果。
所以有结论:可能神经元会不会被训练起来与初始值有很大关系,是一种大乐透现象。
1.4 Rethinking the Value of Network Pruning
作者通过数个网络和数据集的prune 测试,得到了三个观察和结论:
1.如果有一个确定的“压缩”模型,训练一个大网络不是必要的;
2.在prune算法中,我们所认为“重要”的权重,其实对裁剪的小模型来说,并不是那么有用;
3.对于最终的压缩小模型来说,通过prune算法得到的网络架构,比通过prune得到的“重要”的权重更加重要。
并得出一个最终结论:对于SOT的剪枝算法而言,使用裁剪的权重来fine-tune只能得到类似的或者更差的效果;对于通过剪枝算法得到的特定网络模型,可以直接随机初始化训练,而不用经历传统的裁剪管道(训练大网络,裁剪出权重,finetune小网络)。
同时,作者对彩票假说