如果你曾经使用过神经网络来解决一个复杂的问题,你就会知道它们的规模可能非常庞大,包含数百万个参数。例如,著名的BERT模型大约有1.1亿。
为了说明这一点,以下是NLP中最常见架构的参数数量,正如NathanBenaich和IanHogarth在《年人工智能状态报告》中总结的那样。
给定架构中的参数数量。资料来源:NathanBenaich和IanHogarth的《年AI状况报告》
在Kaggle比赛中,赢家模型通常是一个组合,由几个预测因子组成。虽然它们可以在精度上以很大的优势击败简单模型,但它们巨大的计算成本使得它们在实际中完全无法使用。
有没有办法利用这些强大但庞大的模型来训练最先进的模型,而不扩展硬件?
目前,在保持预测性能的同时,有三种主要的方法来压缩神经网络:
权重裁剪量化知识蒸馏
在这篇文章中,我会介绍知识提炼的基本原理,这是一个令人难以置信又令人兴奋的想法,它建立在训练一个较小的网络来接近大型网络的基础上。
什么是知识蒸馏
我们想象一个非常复杂的任务,比如数千个类的图像分类。通常情况下,你不可能只在ResNet50上加上一个,就指望它能达到99%的准确率。所以,你建立了一个模型的集合,平衡每个模型的缺陷。现在,您有了一个巨大的模型,虽然它的性能非常出色,但是没有办法将它部署到生产中并在合理的时间内得到预测。
然而,该模型很好地概括了看不见的数据,因此可以放心地相信它的预测。(我知道,也许情况并非如此,但现在让我们继续进行思维实验。)
如果我们用大而笨重的模型的预测来训练一个更小的,所谓的学生模型来近似大的模型呢?
这实质上就是知识提炼,本文介绍了杰弗里·辛顿、奥利尔·维尼尔斯和杰夫·迪恩在神经网络中提取知识的方法。
大致来说,过程如下:
培养一个能很好表现和概括的大模型。这就是所谓的教师模式。
取你所有的数据,计算教师模型的预测值。包含这些预测的总数据集称为知识,而预测本身通常称为软目标。这就是知识提炼的步骤。
利用之前获得的知识来训练较小的网络,称为学生模型。
为了可视化这个过程,您可以考虑以下几点。
知识蒸馏(图源自作者)让我们把重点放在细节上。如何获得知识?
在软逻辑层中,通过将概率转换为软逻辑层,给出了概率:
在这里
是最后一层生成的逻辑。而是使用稍微修改的版本:
其中T是一个称为温度的超参数。这些值称为软目标。
如果T较大,则类概率比较“软”,也就是说,它们之间的距离会更近。在极端情况下,当T接近无穷大时,
如果T=1,我们得到softmax函数。就我们的目的而言,温度设置为高于1,因此命名为蒸馏。
Hinton、Vinyals和Dean的研究表明,一个蒸馏模型的表现可以和由10个大模型组成的复合模型一样好。
为什么不从一开始就训练一个小型网络呢?
你可能会问,为什么不从一开始就训练一个更小的网络呢?不是更容易吗?当然,但不一定有效。
经验证据表明,参数越多,泛化效果越好,收敛速度也越快。例如,SanjeevArora、NadavCohen和EladHazan在他们关于深度网络优化:通过过度参数化实现隐式加速的论文中对此进行了研究。
左图:单层网络与4层和8层线性网络的对比。右图:使用TensorFlow教程对MNIST分类的过参数化与基线模型。资料来源:关于深层网络的优化:由SanjeevArora、NadavCohen和EladHazan进行的过参数化隐式加速
对于复杂的问题,简单的模型很难在给定的训练数据上很好地进行泛化。然而,我们拥有的不仅仅是训练数据:教师模型对所有可用数据的预测。
这对我们有两个好处。
首先,教师模型的知识可以教会学生模型如何通过训练数据集之外的可用预测进行归纳。回想一下,我们使用教师模型对所有可用数据的预测来训练学生模型,而不是原始的训练数据集。
其次,软目标提供了比类标签更有用的信息:它指示两个类是否彼此相似。例如,如果任务是对狗品种进行分类,那么像“柴犬和秋田犬非常相似”这样的信息对于模型的泛化是非常有价值的。
左图:秋田犬右图:柴犬源自维基百科迁移学习的区别
正如Hinton等人所指出的,通过传递知识来压缩模型的最早尝试之一是重用经过训练的集成体的某些层,如CristianBuciluǎ、RichCaruana和AlexandruNiculescuMizil在其年题为“模型压缩”的论文中所做的那样。
用Hinton等人的话说:
“…我们倾向于用所学的参数值来识别训练模型中的知识,这使得我们很难理解如何在保持相同知识的同时改变模型的形式。知识的一个更抽象的观点是,它是一个从输入向量到输出向量的学习映射
因此,与迁移学习相反,知识蒸馏不直接使用学习的权重。
使用决策树
如果您想进一步压缩模型,可以尝试使用更简单的模型,如决策树。虽然它们不像神经网络那样有表现力,但它们的预测可以通过单独观察节点来解释。
这是由NicholasFrosst和GeoffreyHinton完成的,他们在论文中研究了这一点,将神经网络提取到一个软决策树中。
他们表明,提取确实有一点帮助,尽管更简单的神经网络也比他们有更好的表现。在MNIST数据集上,提取的决策树模型的测试准确率为96.76%,比基线94.34%的模型有了一定的提高。然而,直接的两层深卷积网络仍能达到99.21%的准确率。因此,在性能和可解释性之间存在权衡。
提取BERT
到目前为止,我们只看到了理论上的结果,而没有看到实际的例子。为了改变这种情况,让我们考虑近年来最流行和最有用的模型之一:BERT。
最初发表在JacobDevlin等人的论文《BERT:DevlingforLanguageUnderstanding》上。从Google开始,它很快就被广泛应用于各种NLP任务,如文档检索或情感分析。这是一个真正的突破,推动了几个领域的最新发展。
不过,有一个问题。BERT包含约1.1亿个参数,需要花费大量时间进行训练。作者报告说,训练需要4天,使用4个pod中的16个TPU芯片。以目前可用的TPU每小时定价计算,培训成本约为美元,不包括碳排放等环境成本。
一个成功的尝试是通过HuggingFaces来减少BERT的大小和计算成本。他们使用知识蒸馏来训练DistilBERT,它是原始模型大小的60%,同时速度提高了60%,并保持了97%的语言理解能力。
更小的架构需要更少的时间和计算资源:在8个16G的VGPU上运行90小时。
如果你对更多细节感兴趣,你可以阅读原始论文DistilBERT,它是BERT的精简版:更小、更快、更便宜、更轻。这是一本很棒的读物,所以我强烈建议你这么读一读!
结论
知识蒸馏是压缩神经网络并使其适用于功能较弱的硬件的三种主要方法之一。
与权值裁剪和量化这两种强大的压缩方法不同,知识蒸馏并没有直接对网络进行简化。相反,它使用原始模型来训练一个更小的模型,称为学生模型。由于教师模型甚至可以在未标注的数据上提供预测,学生模型可以像教师一样学习如何进行归纳。
(源自:Medium编译:ODRobots)