论文核心
传统非结构化剪枝虽然较大幅度减少了模型参数量,但是由于非结构化的原因导致网络稀疏化,因此很难对剪枝后的模型进行训练。这是非结构化剪枝相对于结构化剪枝不被看好的原因之一。 而本文中提出可以在任意初始化后的原始模型中找到子模块(即非结构化剪枝后的模型),该初始化后的子模块训练时间不会超过原始模型,并达到或超过原始模型的精度,该子模块在论文中被称作“中彩票”。
注意事项
论文中经过实验发现第一次随机初始化至关重要,中彩票的子模块结构和随机初始化参数有关。实验找到子模块后对子模块重新初始化,此时子模块的性能明显下降。对此,论文给出的理由:子模块初始化的参数与优化算法、数据集和模型有关,如中奖彩票的最初初始化的参数特别适合所选择的优化算法,因此优化效果很好。
不足之处
- 本论文只在较小的数据集上进行相关研究测试
- 非结构化修剪是论文作者找到唯一的能找到中奖彩票的方法,未能在结构化剪枝的方法中找到中奖彩票
- 未能明确解释初始化为何对中奖彩票如此重要
- 在更深的网络中,迭代修剪无法找到中奖彩票,除非用超参数learning rate warmup来调节
寻找中彩票的子模块算法
算法一:
- 随机初始化神经网络,保存初始化值,并创建掩码
- 训练迭代
- 裁剪参数,并更新掩码
- 重置裁剪后的神经网络权重,使权重值恢复到初始化值
- 重复2-4步骤,直到得到裁剪充分的网络
算法二:
- 随机初始化神经网络,保存初始化值,并创建掩码
- 训练迭代
- 裁剪参数,更新掩码
- 重复2-3步骤直到得到裁剪充分的网络
- 重置裁剪后的神经网络权重,使权重值恢复到初始化值
论文提出两种算法,差别在于第二种每一轮修剪后使用已训练的权重进行重新训练,而第一种在每次重新训练前重置权重,实验证明算法一在训练速度和测试集精度上都要优于第二种
部分代码
# 创建掩码用于模型裁剪
def make_mask(model):
global step
global mask
step =