不同框架的修剪技术
迭代修剪技术这一概念可追溯到 Yan Le Cun 在 1990 年乃至更早的研究。这个概念很简单,每个神经网络都有冗余参数,对输出的贡献不大。通过去除对结果影响较小的神经元和突触,网络将会变得更小、更快。
修剪神经网络就像玩积木游戏一样。移除一块积木本身很容易,但最有趣的部分是如何避免整个积木塔倒塌。基于 Song 的论文而形成的赛灵思修剪技术至今已被引用了 2000 多次。三级管道仍被视为先进的修剪技术,在 Alexnet 上速度可提高 35 倍,在 VGG16 上可提高 49 倍,同时不会降低精度。
加州大学伯克利分校视觉和学习中心(BVLC)的一名教师指出:“无论您花费多少时间来研究深度学习课题,难免会碰到 Caffe 这个术语。”由于 Caffe 框架中运算符的实现非常标准,因此基于 Caffe 的修剪工具可轻松适用于不同网络。
Caffe 框架中的典型修剪工作流程包含四个步骤。敏感分析是整个工作流程中最关键的部分,它将神经元和突触逐层排列。换言之,分析策略将在很大程度上决定修剪网络的性能。分析完成后需要设置修剪率以进入下一步。
$ ./decent_p ana –config config.prototxt
第二步是修剪。修剪率简单定义了您想要剪掉的比例。根据排列表将参数设为零,直到达到修剪率。随后摘要表将展示修剪后的精度、参数和操作如何变化。
$ ./decent_p prune –config config.prototxt
第三步是微调。修剪后,精度会有所下降,需要微调进行恢复。如果修剪过度,网络可能无法恢复,这就是所谓的“迭代修剪”,需要重复多次修剪和微调步骤,逐渐提高修剪率。
$ ./decent_p finetune –config config.prototxt
下面是配置文件修改的示例:
workspace: "examples/decent_p/"
gpu: "0,1,2,3"
test_iter: 100
acc_name: "top-1"
model: "examples/decent_p/float.prototxt"
#weights: "examples/decent_p/float.caffemodel"
weights: "examples/decent_p/regular_rate_0.1/_iter_10000.caffemodel"
solver: "examples/decent_p/solver.prototxt"
# change rate from 0.1 to 0.2
#rate: 0.1
rate: 0.2
pruner {
method: REGULAR
}
最后一步是转换。到目前为止,模型都带有掩码,低级参数为零。转换之前工作负载保持不变。最后一步将进行真正的修剪,并将其转换为更轻量化的模型。
$ ./decent_p transform –model baseline.prototxt –weights finetuned_model.caffemodel
作为基于 C 语言的框架,Darknet 几乎没有依赖性,目前受到了很多关注。Yolo 网络对其普及应发挥重要作用。相对于 Caffe 而言,Darknet 对于像 MaxPool 这样的运算符的实现有所不同。不过,Darknet 框架的修剪工具并没有太大变化,同样也是四步工作流程。在修剪步骤中,需要设置阈值参数而不是修剪率,这可能就是最大的区别所在。两个参数的定义如下:
修剪率– 修剪后希望减掉多少工作负载。
阈值– 每层能承受多少精度损失。
仅从精度的角度来看,阈值与修剪率成正比。
TensorFlow 是当今世界面向丰富编程 API、分布式训练策略和灵活设计平台的领先机器学习框架之一。赛灵思推出的 TensorFlow 框架修剪工具仍遵循经典的四步工作流程,但是对输入图形或 API 而言可能有一定的限制。对于内部没有 Keras API 的图形和权重,输入图形需要采用 .pbtxt 和 .chpt 形式。
为了帮助用户更好地了解不同框架的修剪工具,每个步骤的输入和输出总结如下表所示:
Caffe | Darknet | TensorFlow | ||||
---|---|---|---|---|---|---|
Input | Output | Input | Output | Input | Output | |
Ana |
|
NA |
|
|
|
NA |
Prune |
|
|
|
|
|
|
Fineture |
|
|
|
|
|
|
Transform |
|
|
|
|
|
|
综上所述,赛灵思在 Caffe、Darknet 和 TensorFlow 框架上采用了经典、统一的四步修剪工作流程。统一的修剪概念使得工具易于使用,当两个网络使用不同的框架设计时也不会产生额外的成本。