是否有任何算法/方法可以采用经过训练的模型并减少其权重数量,同时尽可能少地对其最终性能产生负面影响?
假设我有一个非常大(太大)的模型,其中包含 X 权重,我想将其缩减为 0.9*X 权重,同时尽可能减少对最终性能的损害(或者在某些情况下甚至可能获得最高收益)。
通过更改模型的基本架构和删除层或通过减少所述层中的特征深度来减轻重量。显然,在减少之后,将需要对剩余权重进行一些微调。
是否有任何算法/方法可以采用经过训练的模型并减少其权重数量,同时尽可能少地对其最终性能产生负面影响?
假设我有一个非常大(太大)的模型,其中包含 X 权重,我想将其缩减为 0.9*X 权重,同时尽可能减少对最终性能的损害(或者在某些情况下甚至可能获得最高收益)。
通过更改模型的基本架构和删除层或通过减少所述层中的特征深度来减轻重量。显然,在减少之后,将需要对剩余权重进行一些微调。
你可能想检查:
http://yann.lecun.com/exdb/publis/pdf/lecun-90b.pdf
以及有关该主题的最新论文:
https://arxiv.org/pdf/1506.02626v3.pdf
但是,我无法找到这两个的实现。所以你需要自己实现它。
在阅读了一些有用的评论和答案后,我自己做了一些重点阅读。
正如其他答案中提到的,这个过程被称为修剪,就像神经网络领域的许多其他想法一样,它并不新鲜。据我所知,它起源于 LeCun 1990 年发表的可爱的“最佳脑损伤”论文(该论文引用了 80 年代后期关于网络最小化的一些早期工作,但我并没有深入兔子洞那么远)。主要思想是近似删除特征图引起的损失变化并将其最小化:
ΔC(hi) = |C(D|W0) - C(D|W)|
其中 C 是成本函数,D 是我们的数据集(x 个样本和 y 个标签),W 是模型的权重(W0 是原始权重)。hi 是参数 i 产生的输出,它可以是卷积层中的完整特征图,也可以是密集层中的单个神经元。
最近关于该主题的作品包括:
在本文中,他们提出了以下以贪婪方式修剪 CNN 的迭代过程:
他们提出并测试了修剪过程的几个标准。第一个也是最自然的使用是oracle pruning,它希望最小化完整模型和修剪模型之间的准确性差异。但是计算成本非常高,需要 ||W0|| 对训练数据集的评估。计算效率更高的更多启发式标准是:
2016 - 高效 DNN 的动态网络手术 与以前以贪婪方式完成此任务的方法不同,它们将连接拼接纳入整个过程,以避免不正确的修剪,并将其作为持续的网络维护。使用这种方法,在没有任何精度损失的情况下,他们有效地将 LeNet-5 和 AlexNet 中的参数数量分别压缩了 108 倍和 17.7 倍。
这些数字和我写的大部分内容都是基于原始论文。另一个有用的解释可以在以下链接中找到:Pruning deep neural networks to make them fast and small。
修改训练有素的 Keras 模型的一个好工具是Keras-surgeon。它目前支持简单的方法:从层中删除神经元/通道、删除层、插入层和替换层。
我没有找到任何实际修剪过程的方法(测试标准、优化等)