Prune Part - 7GrandPa/Deep_compression GitHub Wiki
论文: “Learning both Weights and Connections for Efficient Neural Networks”,NIPS 2015
论文背景:
由于现有深度学习神经网络架构庞大,深度较深,往往会造成模型参数数量达到千万级、亿级。如此庞大的参数数量会导致需求较大的存储空间,如几百兆,甚至上G,同时,如此庞大的网络结构也会导致推理功耗大大增加。由于移动端设备上APP的软件大小限制和电池电源限制,这两个缺点限制了大型神经网络在移动端的应用。
这个时候,如果能够将神经网络进行压缩,参数存储量降低到几十MB级别,能耗降低,且不影响网络推理精度的话,能够很利于移动端的应用。
实验:
Network: Mnist-300-100 net: 一共3层全连接层:神经元个数:784, 300, 100, 10。 Step1 正常进行训练,准确率达到约 0.9746.
第一次Prune和retrain
Step2 进行Prunning, 原理是参数小于某个threshold,则对应mask位设为零,得到的Pruned weight为正常训练好的weight * mask,同时注意要把该位的gradients也设为0,不然参数即使为零也会更新的。 Step3 进行retrain, 采用的是step2 的参数开始训练,retrain开始时loss变高,accuracy变低,随着训练的进行,loss减小,accuracy最终达到0.9791. 参数少了,但结果比第一次训练更好。 压缩率为:30%左右
第二次Prune和retrain
回到Step2,step3, 这次采用的threshold比之前的更大,为上次的1.2倍,accuracy 降低了些 0.9633 压缩率为:20%
第三次Prune和retrain
再次回到Step2,step3, 这次采用的threshold比之前的更大,为上次的1.2倍,accuracy 降低了些 0.9465 压缩率为:11%
存在的问题:
- 二次训练并没有做很多fine tune,直接训练的,导致准确率有所下降(除了第一次),后续还要找到fine tune的方式。
接下来的计划:
- 做好fine tune,使得prune之后的准确率回归
- 找好prune的threshold,使得压缩尽可能的高,目前仅达到11%,论文达到了8%
- 探索tensorflow lite 的参数减少存储量的方式,目前看到可以用8bits 的quantization方式,但没能找到csr、csc稀疏矩阵的tensorflow存储方法。
- 探索tensorflow 在稀疏矩阵下的加速计算方式。