网络结构如下
Layer (type) Output Shape Param # ================================================================= prune_low_magnitude_conv2d ( (None, 26, 26, 12) 230 _________________________________________________________________ prune_low_magnitude_max_pool (None, 13, 13, 12) 1 _________________________________________________________________ prune_low_magnitude_flatten (None, 2028) 1 _________________________________________________________________ prune_low_magnitude_dense (P (None, 10) 40572 ================================================================= Total params: 40,804 Trainable params: 20,410 Non-trainable params: 20,394
我们看到参数的数量现在已经改变。这是因为tfmot
为网络中的每个权重添加了不可训练的掩码,以表示是否应修剪给定的权重。掩码为0或1。
让我们训练这个网络。
我们可以看到修剪模型不会损害性能。红线对应于修剪后的实验。
注意:
- 必须指定修剪计划,以便在训练模型时实际修剪模型。我们还指定
UpdatePruningStep
回调,以使其在训练过程中处理修剪更新。 PruningSummaries
提供有关在训练期间如何保持稀疏度和幅度阈值的摘要。- 将修剪计划视为超参数。
tfmot
提供了另一个现成的修剪计划-PolynomialDecay
。 - 将修剪计划中的
end_step
参数设置为小于或等于训练模型的时期数。另外,您可能需要试验一下frequency
(表示应应用修剪的频率),以便获得良好的性能以及所需的稀疏性。
我们还可以通过编写如下测试来验证tfmot
是否达到了目标稀疏性:
for layer in model.layers: if isinstance(layer, pruning_wrapper.PruneLowMagnitude): for weight in layer.layer.get_prunable_weights(): print(np.allclose( target_sparsity, get_sparsity(tf.keras.backend.get_value(weight)), rtol=1e-6, atol=1e-6) ) def get_sparsity(weights): return 1.0 - np.count_nonzero(weights) / float(weights.size)
在修剪的模型上运行它应该为修剪的所有层生成True
。
方法2:随机初始化网络,通过从头开始训练来修剪网络
在这种情况下,除了我们不是从一个已经训练的网络开始,而是从一个随机初始化的网络开始,一切都保持不变。
绿线对应于从头开始实验的修剪。我们可以观察到相对于其他两个模型,性能有所下降,但这是可以预料的,因为我们不是从一个已经训练好的模型开始的。
当我们通过从头开始训练来修剪网络时,通常会花费最多的时间。由于网络正在研究如何最好地更新参数以达到目标稀疏度,这也是可以预料的。
要真正理解修剪的力量,我们需要更深入地研究:
- 导出同一网络的已修剪和未修剪的类型,对其进行压缩,然后记下其大小。
- 量化它们,压缩它们的量化版本,记下它们的大小,并评估它们的性能。
让我们在下一部分中进行处理。
评估
我们将使用标准的zipfile
库将模型压缩为.zip
格式。序列化修剪的模型时,我们需要使用tfmot.sparsity.keras.strip_pruning
,它将删除tfmot
添加到模型的修剪包装。否则,我们将无法在修剪的模型中看到任何压缩优势。
但是,压缩后的常规Keras模型仍然相同。
with zipfile.ZipFile(zipped_file, 'w', compression=zipfile.ZIP_DEFLATED) as f: f.write(file) return os.path.getsize(zipped_file)
file
应该是已经序列化的Keras模型的路径(修剪和常规)。
在下图中,我们可以看到压缩模型的大小小于常规Keras模型,并且它们仍具有相当好的性能。
我们可以使用TensorFlow Lite量化模型以进一步在不影响性能的前提下减小模型尺寸。请注意,在将修剪后的模型传递给TensorFlow Lite的转换器时,您应该去除修剪后的包装。
除精度测量外,压缩率是另一种广泛使用的用于测量特定修剪算法的指标。压缩率是修剪后的网络中剩余参数的分数的倒数。
这种量化的方式也称为训练后量化。因此,这里有一个简单的方法供您遵循,以优化您的部署模型:
在下一节中,我们将介绍一些现代修剪方法。如果您想进一步追求模型优化,那么这些想法将值得进一步探索。
一些现代修剪方法
让我们从以下问题开始本节:
- 当我们重新训练修剪后的网络时,如果未修剪的权重初始化为它们的原始参数大小会怎样?如果您是从经过训练的网络(例如网络A)中获得的修剪的网络,请考虑网络A的这些初始参数的大小。
- 当在具有预训练网络的迁移学习方案中执行基于量级的修剪时,我们如何确定权重的重要性?
中奖的彩票
Frankle等人在他们关于彩票假说的开创性论文(https://arxiv.org/abs/1803.03635)中对第一个问题进行了极大的探索。因此,在修剪已经训练好的网络之后,将具有上述刚刚初始化的子网络称为Of Winning Tickets。
资料来源:原论文
根据此方法的基本原理,您可以推断出,在网络的初始训练期间,参数的特定初始化方式指导了优化过程。现在,在优化环境中响应良好的权重(意味着它们比其他权重传播得更远)实际上最终落入了中奖彩票。因此,为了使它很好地进行(重新)训练,我们将权重初始化为最大,这样优化过程会很好地吸引他们。
本文提出了许多不同的实验来支持这一假设,因此绝对推荐阅读。
彩票假说的系统探索
在原始的彩票假说论文中,Frankle等人。仅探讨了如果在训练之前将权重重新初始化为最大初始大小,则修剪后的网络的性能如何。在ICLR 2019上提出彩票假说后,Zhou等 发表了一篇关于“解构彩票”的论文(https://arxiv.org/abs/1905.01067),研究了在修剪过程中处理存活下来和未存活下来的权重的不同方法。还提出了超级掩模。
资料来源:原论文
彩票假说的推广
为了能够将彩票假说使用到ImageNet,Frankle等人的数据集,有人发表了关于线性模式连通性的论文(https://arxiv.org/abs/1912.05671),该论文对彩票假设进行了概括。它提出了权重反卷积后作为修剪后初始化网络权重的一种潜在方法。之前,我们以最大的初始量来初始化它们。权重反卷积的作用是将剩余的权重倒带到原始网络训练中的某个位置。换句话说,幸存的权重从原始网络训练的批次5开始初始化。
资料来源:原论文
Renda等人扩展了这个想法。发表了一篇有关“学习速率倒带”的论文,该论文适用于在训练经过修剪的网络时倒带学习率时间表。作者还建议将其作为微调的替代方法。
这是一些令人兴奋的想法,主要围绕基于幅度的修剪而发展。在最后一节中,我们将看到一种比基于幅度的修剪效果更好的修剪方法,尤其是对于迁移学习机制而言。
根据权重变化进行修剪
Sanh等人在有关权重变化修整的论文(https://arxiv.org/abs/2005.07683)中。提出了一种基于幅度的修剪的替代方法,该方法专门用于处理用于迁移学习任务的预训练模型的修剪。
基于幅度的修剪与我们之前已经讨论过的重要性概念正相关。在这种情况下,此处的重要性仅表示权重的绝对大小。这些幅度越低,意义就越小。现在,当我们尝试使用在不同数据集上预先训练的模型进行迁移学习时,这种重要性实际上可以改变。优化源数据集时重要的权重可能对目标数据集不重要。
资料来源:原论文
因此,在迁移学习期间,朝着零移动的预训练权重相对于目标任务实际上可以被认为是不重要的,而向远处移动的权重可以被认为是重要的。这就是该方法的运动修剪。
结论和最终想法
我希望这份报告能使您对深度学习背景下的修剪有一个清晰的认识。我要感谢Raziel和Yunlu(来自Google),向我提供了有关tfmot
的重要信息以及有关修剪自身的其他一些想法。
我想在此领域中探索的其他一些想法是:
- 如果我们可以在训练和再训练带有修剪功能的网络时使用区分性的修剪时间表,该怎么办?
- 当进行幅度修剪时,Zhou等人。向我们展示了在修剪的网络中处理权重初始化的不同方法。我们可以学习一种有效的方法来系统地结合它们吗?
到目前为止修剪的最新方法之一是SynFlow。SynFlow不需要任何数据来修剪网络,它使用Synaptic Saliency Score来确定网络中参数的重要性,以后再写相应的文章进行详细介绍
引用(无特定顺序)
- Model Pruning Exploration in Keras by Matthew Mcateer
- Official
tfmot
guide on Pruning in Keras - Dissecting Pruned Neural Networks by Frankle et al.
- Lottery Ticket Hypothesis explanation video by Yannic Kilcher
- Movement Pruning explanation video by Yannic Kilcher