我从一个神经网络中移除了74%的神经元。 这仅使准确率下降了0.50%。 以下是详细信息(附带代码):
训练好的神经网络总是有一些神经元对性能没有实质性贡献。 但它们仍然消耗内存。 这些神经元可以被移除,而不会显著影响准确性。 让我们看看如何识别它们!
以下是步骤: 步骤 1)像往常一样训练神经网络。 步骤 2)将验证集通过训练好的网络,对于隐藏层中的每个神经元,计算: - 平均激活值 - 激活值的方差(如果激活值可以为负) 查看这个👇
步骤 3) 剔除激活均值和方差接近零的神经元,因为它们对模型输出的影响很小。 理想情况下,绘制多个剪枝阈值下的性能,以选择适合您大小与准确性权衡的模型。 查看这个 👇
让我们看看代码。 我们首先定义一个简单的神经网络并对其进行训练。 由于我们稍后将计算神经元级别的激活以进行剪枝,因此我们在前向传播中返回所有中间激活。 查看这个👇
接下来,我们定义两个包含三个元素的列表: - 一个将存储激活的均值 - 另一个将存储激活的标准差 我们将验证集传递通过我们的模型,以计算每个隐藏层的这些统计数据。 查看这个 👇
在这一点上,让我们创建一个神经元级统计数据的分布图,如上所生成。 如下所示,大多数神经元的平均激活值及其标准差都严重集中在接近零的值附近。 接下来我们尝试修剪它们。
对于修剪,我们遍历一个阈值列表并: - 创建一个新网络并转移通过阈值的权重。 - 评估新网络并计算总参数。 - 将结果附加到列表中。 查看这个👇
该表比较了修剪模型在多个阈值下相对于原始模型的准确性和大小减少情况。 在均值=0.1 和标准差=0.4 时: - 模型的准确性下降了 0.08%。 - 模型的大小减少了 62%。 这是一个巨大的减少。 查看这个 👇
这是另一个有趣的结果。 在mean=0.5和std-dev=1的情况下: - 模型的准确率下降了0.5%。 - 模型的大小减少了74%。 所以从本质上讲,我们以1/4的参数获得了几乎相似的性能。 查看这个 👇
当然,准确性和大小之间存在权衡。当我们减小大小时,准确性会下降(请查看视频)。 但在大多数情况下,准确性并不是我们优化的唯一指标。 相反,效率、内存等多个操作指标是关键因素。
48.62K