在 Keras 进行修剪
Posted
技术标签:
【中文标题】在 Keras 进行修剪【英文标题】:Pruning in Keras 【发布时间】:2017-06-16 22:44:54 【问题描述】:我正在尝试使用 Keras 设计一个优先考虑预测性能的神经网络,但通过进一步减少每层的层数和节点数,我无法获得足够高的准确度。我注意到我的很大一部分权重实际上为零(> 95%)。有没有办法修剪密集层以希望减少预测时间?
【问题讨论】:
“有效为零”究竟是什么意思?您使用哪些图层类型?你试过什么? @MartinThoma 我使用的是基本的Dense
层。大多数权重要么等于零,要么非常接近于零,以至于将它们设置为零不会改变任何输入的网络输出。然而,在不增加平均测试用例损失的情况下,不能从网络中删除单个节点。我的假设是,在大多数权重无用的时候,稀疏网络在预测方面会更有效。
“非常接近于零,以至于将它们设置为零不会改变任何输入的网络输出”——这是什么意思? 10^-5? 10^-6? 10^-100?
@MartinThoma 我认为“无关阈值”大约是< 10^-15
,根据经验确定
您现在可以使用 keras 修剪神经网络
【参考方案1】:
不是专门的方式:(
目前没有简单(专用)的方式使用 Keras 来做到这一点。
https://groups.google.com/forum/#!topic/keras-users/oEecCWayJrM 正在进行讨论。
您可能也对这篇论文感兴趣:https://arxiv.org/pdf/1608.04493v1.pdf。
【讨论】:
非常有趣的论文,谢谢。您对何时(或是否)将在 Keras 中实现这一点有任何见解吗?还是我应该切换到不同的框架? 老实说,我不相信改变框架会有多大帮助。据我所知,tensorflow 和 theano 都没有实现这种功能。尽管如此,您仍然可以手动计算出一些东西......您对权重的绝对值进行阈值化,将它们从层中移除,并移除与您刚刚移除的神经元相对应的权重,如果是这样的话。这听起来并不直接,但我认为也没有什么大秘密。 tensorflow.org/model_optimization/guide/pruning 是 Keras 中的专用方式。正如我在下面建议的那样,对延迟改进的支持正在进行中【参考方案2】:看看 Keras Surgeon: https://github.com/BenWhetton/keras-surgeon
我自己没有尝试过,但文档声称它具有删除或插入节点的功能。
另外,在查看了一些关于剪枝的论文后,似乎许多研究人员创建了一个具有更少通道(或更少层)的新模型,然后将权重从原始模型复制到新模型。
【讨论】:
刚刚尝试使用 Surgeon 进行修剪,只要满足条件,这很容易。似乎没有现成的剪枝启发式方法,只有工具本身。【参考方案3】:请参阅此 tf.keras 专用工具。 https://www.tensorflow.org/model_optimization/guide/pruning
正如概述所示,对延迟改进的支持正在进行中
编辑:Keras -> tf.keras 基于 LucG 的建议。
【讨论】:
tensorflow的一些model_optimization函数实际上是专用于tf.keras的,不适用于keras本身。【参考方案4】:如果您将单个权重设置为零,这不会阻止它在反向传播期间更新吗?从一个时期到下一个时期,重量不应该保持为零吗?这就是为什么在训练之前将初始权重设置为非零值的原因。如果您想“移除”整个节点,只需将该节点输出上的所有权重设置为零,这样可以防止该节点在整个训练过程中对输出产生任何影响。
【讨论】:
我们将权重初始化为非零也是因为我们希望每个神经元的梯度不同。 0 处的单个权重得到更新。 @LucG 是的,你是对的。您必须将其重置为零或创建一个遮罩层以防止它在反向传播期间被更新。以上是关于在 Keras 进行修剪的主要内容,如果未能解决你的问题,请参考以下文章