Papper-Learning both Weights and Connections for Efficient

1.摘要

  • 目的:减少存储量和计算量而不影响准确性,使网络更适合在移动设备上运行;同时可以自动学习网络结构(即剪枝);也可以防止过拟合。

  • 方法:简单地说是只学习重要的连接,修剪冗余的连接减少模型参数

  • 步骤:

    • train,学习哪些连接是重要的,不需要学习权重最终值。
    • prune,剪去重要性低于阈值的不重要连接 ,将密集的全连接转换为稀疏连接网络。
      • 阈值确定:首先这个阈值相关于这一层权重的标准差,同时每一层的阈值的确定也要参考相应层对裁剪的敏感度。
    • retrain,finetune重训练网络微调剩下的连接权重,以便其余连接可以补偿删除连接。
    • prune和retrain可以反复迭代进行
  • 生物学意义:就像在哺乳动物的大脑中一样,在儿童发育的前几个月里,突触是在这里形成的,然后逐渐修剪少量使用的连接,成为一个“人”。

  • 结果:

    • AlexNet减少模型参数量61million->6.7million,没有精度损失
    • VGG-16减少模型参数量138million->10.3million,没有精度损失

2.相关工作

  • [Vanhoucke et al] 8-bit整数(vs 32-bit浮点) activations,用8位int型的activation代替32位float。
  • [Denton et al] 寻找适当的低阶参数近似值并保持原始模型的1%以内的精度
  • [Gong et al] 使用矢量量化(Deep Compress论文中介绍的),和剪枝可以同时使用
  • [Network in Network和GoogleNet模型]使用global average pooling代替全连接层来减少参数,但在使用ImageNet的参数时,需要另外增加一个线性层。(这是在网络结构方面寻求参数缩减)
  • [Optimal Brain Damage和Optimal Brain Surgeon]修剪网络以减少基于损失函数的Hessian的连接数量,并且表明这种修剪比基于权重的修剪(例如权重衰减)更准确。 但是二阶导数需要额外的计算。
  • [Shi et al和Weinberger et al]HashNet,通过使用散列函数将连接权重随机分组为哈希桶来减少模型大小,同一个哈希桶中所有连接共享单个参数值,稀疏性使散列冲突最小化。和prune结合可能会得到更好的效果。

3.Trick

3.1Regularization

  • 采用不同的regularization会影响prune和retrain的效果:
    • L1会将更多的参数转换成接近0,这在prune之后retrain之前有很好的准确率,但是留下的参数在retrain后效果不如L2
    • L2会获得更好的剪枝结果

3.2Dropout率调整

  • 用于防止过拟合,两次训练过程均用到了。
  • 在二次训练中,考虑到模型容量的变化,必须调整dropout率。
  • 由于prun已经减少模型容量,所以retrain时dropout ratio应该调小一点。
  • dropout中,每个参数在训练期间概率性下降,特征检测器停止工作但在测试的时候会升回来。(?)
  • 有如下公式:
    • Ci:第i层的连接数
    • Cio:原神经网络
    • Cir:重新训练后的神经网络
    • Ni:第i层神经元数目
    • D0:原始dropout ratio
    • Dr:再训练期间的dropout ratio
  • 由于dropout对神经元起作用,且Ci与Ni是二次变化关系,所以根据公式1,修剪参数后的dropout应遵循公式2

3.3局部修剪和参数协调

  • 在第二次训练过程中,最好保留prun后存活的连接的初始训练阶段权重,而不是重新初始化修剪过的layer。
  • 原因:
    • CNNs contain fragile co-adapted features: gradient descent is able to find a good solution when the network is initially trained, but not after re-initializing some layers and retraining them.
    • 第二次训练过程中降低计算量:因为反向传播不需要通过整个网络。
  • 问题:随着网络变深,容易出现梯度消失,使得修剪错误难以恢复。
  • 解决:只训练prune后shallow layer保存下来的params。

3.4迭代修剪

  • 反复prune-retrain、prune-retrain步骤。
  • 每次迭代都是一次贪心搜索。

3.5修剪神经元

  • 在修剪连接之后进行。
  • 一些0输入或者0输出的神经元也被prune。
  • 原因:retrain阶段到达死神经元将具有零输入连接和零输出连接的结果。 这是由于梯度下降和正则化而发生的。