"); //-->
序列化和反序列化
迁移学习是自然语言处理领域最有影响力的最新突破之一。在其发布不到一年的时间里,谷歌的BERT及其后代(RoBERTa,XLNet等)主导了大多数NLP排行榜。虽然将这些庞大的模型投入生产可能令人头疼,但存在各种解决方案来显著减小其尺寸。在NLPTown,我们成功地应用了模型蒸馏技术来训练spaCy的文本分类器,使其在产品评论的情感分析方面的表现与BERT几乎一样优秀。
最近,自然语言处理的标准方法发生了巨大变化。直到一年前,几乎所有NLP模型都是完全从头开始训练的(通常经过预训练的单词嵌入除外),而如今,最保险的方法是下载诸如BERT这样的预训练模型,并对其进行微调以适应特定的NLP任务。因为这些迁移学习模型已经学习到了大量未标记的文本,所以它们已经获得了许多有关语言的知识:它们了解单词和句子的含义,共指,语法等。令人兴奋的是,像BERT这样的模型具有如此众多的参数,它们相当缓慢且占用大量资源。至少对于某些NLP任务,调BERT就像杀鸡用牛刀一样。
大锤模型
大多数迁移学习模型都很庞大。BERT的基本模型和多语言模型都具有12层,每层隐藏层的神经元大小为768,并具有12个自注意力头——总参数不少于110M。BERT-large拥有高达340M的参数。尽管如此,BERT与更近期的模型相比还是相形见绌,例如具有665M参数的FacebookXLM和具有774M的OpenAI的GPT-2。显然,朝着更大模型的发展将持续一段时间。
Generalmodels like BERT can be finetuned for particular NLP tasks (from: Devlin et al. 2018).
当然,语言是一种复杂的现象。很明显,参数相对较少,更传统,更小的模型无法处理您向它们抛出的所有NLP任务。但是,对于单独的文本分类或序列标记任务,是否确实需要BERT及其同类的所有表达能力是值得怀疑的。这就是研究人员开始研究如何减小这些模型的尺寸的原因。出现了三种可能的方法:通过量化以较少的位进行编码来降低模型中权重的精度,通过修剪来完全删除模型的某些部分(连接权重,神经元甚至是全权重矩阵),而蒸馏的目的是训练一个小模型来模仿大模型的行为。
用模型蒸馏进行情感分析
在NLP Town的一个暑期项目中,我们与实习生SimonLepercq一起研究了模型蒸馏在情感分析中的有效性。像庞(Pang),李(Lee)和威赛亚娜(Vaithyanathan)在他们的开创性论文中一样,我们的目标是建立一个能够区分正面和负面评论的NLP模型。我们收集了六种语言的产品评论:英语,荷兰语,法语,德语,意大利语和西班牙语。我们将带有1或2颗星的评论贴上负面标签,带有4或5颗星的评论则视为正面。我们使用了1000个示例进行培训,1000个示例用于开发(提前停止)和1000个示例进行测试。
第一步是确定我们任务的基准。在我们的每个数据集中有相同数量的阳性和阴性实例,随机基线平均将获得50%的准确度。作为一个简单的机器学习基线,我们训练了spaCy文本分类模型:词袋模型和一个相当简单的卷积神经网络的堆叠集成,具有均值合并和注意力。在此基础上,我们添加了一个节点的输出层,并让模型输出得分高于0.5时预测为正,否则为负。在测试数据上,此基准达到了79.5%(对于意大利语)和83.4%(对于法语)之间的准确性——不错,但结果也不是很好。
BERT gives anaverage error reduction of 45% over our simpler spaCy models.
由于训练集小,我们的挑战非常适合迁移学习。即使训练数据中没有测试词(例如,很棒的书),BERT也已经知道它与出色的小说,奇妙的读物或训练集中很可能出现的另一个类似的词组相似。因此,与从头开始训练的简单模型相比,它应该能够更加可靠地预测从来没见过的评论的评分。
为了微调BERT,我们改进了PyTorch-Transformers库中的BERTForSequenceClassification类,以用于二进制分类。对于所有六种语言,我们都微调了BERT-multilingual-cased,这是Google目前推荐的多语言模型。结果证实了我们的期望:BERT的准确度在87.2%(荷兰语)和91.9%(西班牙语)之间,平均比我们最初的spaCy模型高出8.4%。这意味着BERT几乎将测试集上的错误数量减半。
模型蒸馏
不幸的是,BERT并非没有缺点。我们的六个微调模型中的每个模型都占用了将近700MB的磁盘空间,其推理时间比spaCy的要长得多。这使得它们难以部署在资源有限的设备上,或者难以同时部署给许多用户。为了解决这些挑战,我们转向模型蒸馏:我们将经过微调的BERT模型作为教师,而spaCy的简单卷积模型则作为学习模仿老师行为的学生。我们遵循Tang (2019)等人描述的模型蒸馏方法。他们展示了将BERT蒸馏成简单的BiLSTM是可能的,并获得类似于具有100倍以上参数的ELMo模型的结果。
The processof model distillation.
在我们开始训练我们的小型模型之前,我们需要更多的数据。为了学习和模仿BERT的行为,我们的学生需要查看比原始训练集更多的示例。Tang等人采用了三种方法进行数据扩充(在原始训练数据的基础上创建合成训练数据):
· 屏蔽训练数据中的随机单词。例如,我现在喜欢这本书成为我[MASK]这本书。
· 用相同词性的另一个单词替换训练数据中的其他随机单词。例如,我喜欢这本书就变成我喜欢这个屏幕。
· 从训练示例中随机抽样一个长度为1到5的n-gram。
· 由于我们数据集中的产品评论可能相当长,因此我们在上述三个方法中添加了第四个方法:
· 从训练示例中随机抽取一个句子。
这些增强方法不仅帮助我们创建了一个比原始训练集大很多倍的训练集;通过采样和替换训练数据的各个部分,它们还向学生模型告知哪些单词或短语对其教师的输出有影响。此外,为了给它尽可能多的信息,我们不会向学生显示其老师为某项物品预测的标签,而是显示它的精确输出值。通过这种方式,小型模型可以了解最佳类别到底有多准确,以及与其他类别的比较。Tang等(2019)用老师的对数训练了小模型,但是我们的实验表明使用概率也可以得到很好的结果。
蒸馏结果
模型蒸馏的最大优点之一是它与模型无关:教师模型可以是一个黑匣子,而学生模型可以具有我们喜欢的任何架构。为使实验简单,我们选择了与基线相同的spaCy文本分类器作为学生。训练过程也保持不变:我们使用相同的批次大小,学习速率,退出和损失函数,并在训练数据的准确性停止上升时停止训练。我们使用上述的扩充方法将每种语言的大约60,000个示例的合成数据集组合在一起。然后,我们收集了经过微调的BERT模型针对这些数据的预测。连同原始训练数据,这已成为我们较小spaCy模型的训练数据。
The distilledspaCy models perform almost as well as the original BERT models.
尽管设置很简单,蒸馏后的spaCy模型却明显优于我们的初始spaCy基线。平均而言,它们的精度提高了7.3%(仅比BERT模型低1%),误差减少了39%。他们的表现表明,对于诸如情感分析之类的特定任务,我们并不需要BERT提供的所有表达能力。训练一个性能几乎与BERT相同但参数少得多的模型是完全可能的。
结论
随着大型迁移学习模型的日益普及,将NLP解决方案投入生产变得越来越具有挑战性。但是,诸如模型蒸馏之类的方法表明,对于许多任务而言,不需要数亿个参数即可实现高精度。我们用六种语言进行情感分析的实验表明,训练spaCy的卷积神经网络来与更复杂的模型架构(例如BERT的模型)相匹敌,是可能的。将来,我们希望在NLP Town更详细地研究模型蒸馏。例如,我们旨在找出什么是最有效的数据增强方法,或者需要多少合成数据来训练一个较小的模型。
原文标题:
Distilling BERT Models with spaCy
原文链接:
https://towardsdatascience.com/distilling-bert-models-with-spacy-277c7edc426c
编辑:黄继彦
校对:林亦霖
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。