Model soups to increase inference without increasing compute time
摘要
在本文中,我们使用 [1] 中的三种汤食谱 (Greedy Soup Sorted、Greedy Soup Random 和 Uniform soup) 比较了三种不同模型 (ResNet、ViT 和 EfficientNet) 上的模型汤性能,并复制了作者的结果。然后,我们介绍了一种新的汤食谱,称为 Pruned Soup。对于预先训练的视觉转换器,结果比最好的单个模型要好,但 ResNet 和 EfficientNet 的结果要差得多。我们的修剪汤比原始论文中介绍的均匀和贪婪的汤表现更好。我们还讨论了在实验中发现的体重平均的局限性。我们的 model soup 库的代码和不同模型的实验可以在这里找到。
1、引言
传统上,深度学习模型的训练分两个步骤完成:首先,通过改变超参数对模型进行多次训练,然后在使用前选择性能最佳的模型。出版物 “模型汤:在不增加推理时间的情况下证明多个微调模型的权重平均” [1] 建议对不同模型的权重进行平均,以最大限度地利用所有训练,而不会浪费学习时间。这会增加非常小的内存成本、学习时间或推理时间。该论文表明,在某些模型上可以看到性能提升,甚至定义了图像分类的新水平。作者提出了两种将两个模型组合成汤的方法:贪婪汤和均匀汤。在这个项目中,我们将首先在 Resnet [3]、ViT [4] 和 EfficientNet [5] 上测试模型 Souping,以重现模拟性能改进。然后,我们测试一种新方法来创建一个类似于修剪决策树的 soup。
2、研究现状
2.1 先前研究
在撰写关于模型汤的论文之前,已经探索了组合多个模型的输出的想法。1996 年,Leo Breiman 发表了 Bagging predictors,他在其中预置了一种方法,该方法生成多个版本的 pre dictor 并使用它们来获取聚合预测器。然后,在 1999 年,Eric Bauer 和 Ron Kohavi 发表了《投票分类算法的实证比较:Bagging、Boosting 和 Variants》,他们在其中回顾了许多投票分类算法,如 Bagging 和 AdaBoost,并展示了有趣的结果。2000 年,Thomas G. Dietterich 出版了《机器学习中的集成方法》,其中解释了为什么集成可以胜过单个分类器。所有这些集成技术都提高了模型的准确性和鲁棒性,但在计算成本方面存在缺点,尤其是在模型数量很大时。
2.2 最初的论文
在原始论文中,作者提出,与其在验证集中选择具有最高准确性的单个微调模型,不如在他们所谓的模型汤中平均独立微调模型的权重,这样可以超越前者,同时不需要更多的训练,也不会增加推理成本。在他们的论文之前,沿单个训练轨迹的权重平均表明,通过随机初始化训练的模型的性能有所提高 [2]。他们的方法是应用于 fine-tuning 上下文的权重平均概念的扩展。
作者探索了两种主要的汤制作方法。第一种方法是 Uniform soup,它简单地将所有模型参数平均为 f(x 1 k k i=1 i),其中 i 表示通过微调找到的模型。另一种方法称为贪婪汤,方法是首先通过降低验证精度的顺序对模型进行排序,然后添加每个模型作为汤的成分(如果它提供的性能比保留验证集中的最佳单个模型更好)。为了使用贪婪汤的方法,他们考虑了一个用 f(k ) 表示的神经网络,其中表示通过微调模型获得的参数,其中预训练初始化为 0,超参数配置为 h。超参数的配置包括优化器、数据增强和学习率。贪婪汤的算法如算法1所示
为了评估汤模型,作者对 CLIP 、 ALIGN 和 ViT-G 模型进行了微调,这些模型都是预先训练的。在保留的验证集上评估汤,以避免过度拟合训练数据。获得的结果表明,汤的性能优于最好的单个模型,最令人印象深刻的结果是 ViT-G 模型汤在 ImageNet 上达到 90.94%,这是一种新的技术水平。从图 1 中可以看出,Greedy soup 肯定会提高准确性。他们还表明,模型汤适用于文本分类的 transformer 模型的微调。
2.3 我们的方法
根据为该项目提交的计划,我们的方法是首先尝试在一个更简单的模型上复制论文的结果。为此,我们选择实施一个 ResNet 模型,并在 CIFAR-100 数据集上对其进行训练,该数据集已公开可用。与论文类似,ResNet 模型经过训练,改变了学习率和权重衰减,获得了 36 个具有不同超参数组合的模型。然后,我们实施了文章中提出的 Greedy soup 和 Uniform soup 来评估它们。为了以与论文作者相同的方式对汤进行评估,通过将 CIFAR-100 数据集的原始测试集拆分为 2:验证集 5000 个示例和新测试集 5000 个示例来创建验证集。结果在第 3 节中介绍和讨论。
在这些实验之后,我们试图在相同的模型 (ViT-G) 上复制作者获得的结果。因此,我们找到了预训练的 ViT-G 模型,并在 CIFAR-100 数据集上使用相同的超参数对它们进行了微调。我们应用了煲汤算法,并将我们的结果与第 3 节作者的结果进行了比较。此外,我们提出了一种新算法,以类似于决策树中的修剪方式对模型的权重进行平均,我们称之为 “修剪汤”。该算法的伪代码可以在算法 2 中找到。
第三种模型的方法包括实现 EfficientNet [6] 模型,因为据说它比以前的 ConvNet(如 Resnet)[5] 实现了更好的精度和效率。该模型在 CIFAR-100 数据集上使用相同的超参数进行训练。该实现取自 Github 中为论文“EfficientNet:重新思考卷积神经网络的模型扩展”提交的代码。您可以在此处找到源代码。使用该模型是因为它专注于通过以恒定比例缩放每个方面来平衡网络宽度、深度和分辨率的维度。
2.4 实现细节
模型 soup 代码有两个主要组件:
• generate soup.py 脚本,其中包含主 make soup()函数,该函数使用 pytorch 训练的模型和计算器来生成不同类型的 soup。
• 一个 Evaluator 接口,必须由用于生成汤的 Evaluator 对象实现。Evaluator 类的示例可以在 model evaluators/cifar eval 中找到。
评估器提供模型分类和汤配料选择的指标。该代码旨在始终最大化该指标,因此我们在使用旨在最小化的 loss 等指标时必须小心。评估器负责加载所需的数据集并对其进行迭代。soup 代码设计为使用两个单独的集合:一个用于模型的初始排序和选择成分,另一个用于计算最终性能。这种区别对于避免将我们的 soup 过度拟合到单个数据集至关重要。
3、方法
3.1 实验设置
本节展示了我们的实验设置和使用三种不同方法在 CIFAR-100 上的结果。模型使用类似的设置进行训练:一个随机梯度下降优化器,动量值为 0.9,权重衰减 [1e-5, 2e-5, 5e-5, 1e-4, 2e-4, 4e-4] 和学习率 [0.01, 0.02, 0.05, 0.1, 0.2, 0.4] 因每个模型而异。每个模型都经过 10 到 15 个 epoch 的训练,batch size 为 256。首先,模型通过 36 种不同的超参数组合进行训练,从中可以注意到最佳模型的准确性。为了为每个模型创建汤,我们使用 Colab 笔记本来选择要评估的模型类型、运行次数、成分数量、策略类型和汤制作方法。为了评估汤的性能,将测试集分开以创建一个单独的验证集。用户友好的笔记本允许从 Github 轻松导入函数并测试任何模型,在我们的例子中是:ResNet、ViT 或 EfficientNet。获得排序和随机的贪婪汤、均匀的汤以及排序和随机的修剪汤的结果。
3.2 实验结果
从表 1 中可以看出,贪婪汤的性能比最好的微调模型要好,随机选择模型时的准确率为 51%,而当模型准确率降低时,准确率为 51.75%。这比最佳模型的性能 (50.3%) 高出约 1%,这与论文中获得的结果相当 [1]。我们还可以看到,所提出的方法 (Pruned soups) 实现了更高的性能,在随机选择模型时准确率为 52%,当模型排序准确率降低时为 52.1%。然而,重要的是要注意,这些结果的标准差在 0.3% 左右,因此需要更多的实验来得出结论,修剪的汤是否比贪婪的汤表现更好。另一个可以观察到的是,修剪汤的平均成分(约 3 种)比贪婪汤(约 5 种)使用更少的成分。最后,与纸张相反,均匀汤的准确率远低于最佳模型。这可以通过以下事实来解释:均匀汤中包含的一些 mod els 性能不佳,如图 3 中网格搜索的表面图所示。
在查看 ResNets 和 EfficientNets 模型时,我们可以看到,与最佳模型相比,汤的性能急剧下降,如 Ta ble 2 所示。事实上,它们的准确率接近 1%,这意味着它们并不比完全随机猜测图像类别的模型做得更好,因为 CIFAR-100 数据集有 100 个可能的类别。此外,我们可以观察到,唯一仍然可以在测试集上推广的汤是仅包含 1 种成分的贪婪汤,这意味着它与选择最佳模型或随机模型相同,这与汤的策略一致。因此,可以看出,这些模型的架构并没有很好地适应汤的创作。
3.3 消融研究
我们在图 4 中说明了成分数量对贪婪汤性能的影响。成分的增加(最多 5 种)提供了比最佳单个模型更好的最终模型,准确性提高了约 1%。本文研究的贪婪汤还为 CLIP ViT-B/32 和 ALIGN EfficientNet L2 选择了 5 个模型,它们提供了 0.7 和 0.5 个百分点的更好结果。这适用于这两种策略(考虑随机添加的模块与按准确性递减的顺序添加的模块)。还可以注意到,当将最大成分数增加到 5 个以上时,排序的贪婪汤具有相同的性能,因为添加任何其他模型会导致准确性降低。同样,随机贪婪汤的收益递减,准确率在 51.5% 左右波动。振荡可以用模型被认为添加到汤中的顺序的变化来解释。为了缓解这种情况,结果是 10 次运行的平均结果。
在图 5 的帮助下,我们可以看到,传递次数的增加会提高随机和排序修剪汤的准确性。但是,分拣后的修剪汤很快就稳定在 52.1% 的准确率,通过次数大于或等于 2。对于随机修剪汤,我们得出,每次增加传递次数时,准确率都会增加,最终达到与排序修剪汤在 5 次传递时达到相似的性能,准确率为 52.04%。这意味着可以增加传递次数,直到找到汤的最佳模型组合,并且从汤中删除任何模型都会阻碍其泛化能力。
正如我们在图 6 中看到的那样,道次的增加对修剪汤中的平均成分数量的影响会减小。从一次平均 13.5 种成分开始,该数字呈指数级减少,每增加一次通过,减少的幅度就会更小,以达到 3.2 种成分的低得多的平均值,这是使用一组经过训练的模型的最佳配置。
与论文中提到的类似,排序策略的准确性比随机排序策略略高。在图 3 和图 4 中,我们可以看到,使用 sorted soup 模型可以实现更好的准确性。
4、讨论
4.1 分析
通过平均权重来生成更好的模型。然而,均匀汤的结果较低:ViT 模型的准确率比最佳单个模型低 17%。事实上,在本文中,只有当所有单个模型都达到高精度时,均匀汤模型才能达到比最佳单个模型更好的精度,这就是为什么贪婪汤表现更好,因为它们在平均权重时排除了精度较低的模型。这意味着可以对新标准进行假设:考虑均匀汤的模型必须具有最佳模型顺序的精度,类似于一组具有相同局部最小值但变化很小的微调模型。从这个意义上说,如果模型的权重收敛到不同的局部最小值,则平均它们会将解移动到任意位置,这根本不保证位于局部最小值中。在 ResNets 和 EfficientNets 模型中观察到了这一点。
为了将不同的方法应用于汤,重要的是要进一步分析和了解模型汤在 ResNets 和 EfficientNets 上的局限性,因为平均权重方法不起作用。正如作者在论文中提到的,使用预训练模型对于使用 soups 来微调超参数至关重要。我们表明,非预训练模型的学习参数的简单平均会使性能变得更差,其性能与随机猜测相似。换句话说,soups 的概念适用于预先训练模型的微调,但不适用于从头开始训练的模型。事实上,当模型独立于相同的初始化进行调整时,soups 工作得很好,因为它们具有相同的错误情况。只有当模型之间有类似的误差情况时,平均模型权重才会产生一致的性能。这导致了原始论文中没有讨论的限制:用于制作汤的模型不仅需要预先训练,而且模型本身在微调时需要收敛到相同的误差情况,因此汤方法不能应用于所有模型架构。例如,我们实验中使用的 EfficientNets 实际上是预先训练的,但使用不同的 hyperpa rameter 进行微调会导致权重的局部最小值不同,在这种情况下,将任何模型与另一个模型平均会破坏汤的任何泛化能力。
4.2 未来的工作
尽管模型汤在某些问题上显示出一些前景,并且已被证明可以为某些问题提供最先进的结果,但更清楚地了解它们的局限性是很重要的。在这项工作中,我们展示了模型汤的一些局限性,例如需要所有模型都处于相同的错误环境中。对模型汤可能执行或可能不执行的所有模型进行全面研究对于了解模型汤的不同限制至关重要。
一个相关的假设是,批量归一化会导致微调的模型最终处于不同的误差环境中,因为它给模型的权重引入了一些随机性。验证这一假设需要更多的实验,并将导致对模型汤的局限性有更深入的理解。另一个假设是,在微调模型期间使用的优化器可能会导致不同的错误情况。为了验证该假设,可以使用不同的优化器进行更多实验,以查看该因素是否有影响。
5、 结论
这项工作表明,Model Soups 在充分利用模型的训练时间方面很有前途,并且是朝着更智能的超参数调优迈出的一步。然而,我们表明,模型汤的缺点仍然没有得到充分的了解和理解。为了进一步发展模型汤的概念并将其整合到现代深度学习管道中,需要了解这些限制,并在可能的情况下完全修复。一旦它们被很好地理解,模型汤很可能成为现代深度学习管道不可或缺的一部分,因为它们对训练效率和性能改进的好处不会被削弱