腾讯QQ团队研究人员已经对BERT进行了模型压缩。在影响损失小的基础上,LTD-BERT模型大小为22M,与BERT模型相比,内存和存储开销可以减少近20倍,而且在计算速度上,4核CPU单机机器可以预测速度将加快80倍以上。相关代码和更多成果将在近期开源。BERT已被验证为解决口语类短文本语义量化的极其有效的工具,对FAQ、语音助手等口语类人机交互系统具有重要意义。但受限于模型复杂度高、计算量大,其工业在线应用进展不如预期,尤其难以满足QQ等亿级用户产品的性能需求和QQ空间。为了解决这个问题,QQ团队研究人员提出了LearningtoDistillBERT(LTD-BERT)模型来压缩BERT模型。在小效果损失的基础上,LTD-BERT模型大小为22M,相比BERT模型内存和存储的成本可以降低近20倍。在计算速度上,4核CPU单机可以预测速度将加快80倍以上。此外,LTD-BERT也被验证在下游任务中保持与BERT相似的效果,包括相似度计算、短文本分类、短文本聚类等。其应用场景包括但不限于语义匹配、意图识别、文本聚类分析等。据机器之心介绍,自2019年8月在腾讯内部开源以来,LTD-BERT的效果已经在QQ、腾讯新闻、腾讯游戏、腾讯看点、腾讯的实际任务中得到验证健康等服务于大量用户的产品,保证算法具有足够的泛化能力和实用性。此外,团队还表示,LTD-BERT相关代码及更多成果将在近期开源。2018年底,谷歌提出并开源了BERT(BidirectionalEncoderRepresentationfromTransformers)。对NLP的影响一直持续到今天。基于预训练的BERT已经列出了很多NLP公共任务。或者通过finetuning将BERT应用到实际业务中。但是在这个过程中让大家很头疼的是,因为参数量很大,BERT的计算速度和资源开销很难平衡。GPU的联机速度更快,但成本高;CPU在线时的计算速度较慢,需要做大量的底层优化工作。为了解决这个问题,QQ研究团队提出了一种基于知识蒸馏的方法,可以在保证预训练BERT的文本理解能力不丢失的前提下,大大降低模型规模,提高预测速度越多越好。QQ研究团队主要针对基于从BERT得到的sentenceembedding完成更高层次任务的需求,也能满足目前对BERT的大部分需求,包括文本分类、文本聚类、相似度计算等。当然,词级压缩也可以通过近似的方式实现。图1.BERT的输入和嵌入(摘自[1])BERT中的加权句子嵌入由于拟合是基于BERT的句子嵌入,因此第一步是确定如何获得BERT的句子嵌入。如上图所示,BERT会在句子级别为上层任务添加[CLS]到一个完整的句子,并添加[SEP]作为句子分隔符。通常的做法是用[CLS]所在的向量作为sentenceembedding。因为【CLS】在句子级别参与了“句子与二进制关系的预测——是否是下一句”的预训练任务,所以【CLS】的位置可以将句子的语义反映到一定程度程度,至少能从整体上反映句子的主题。另一种常用的方法是对embedding上下文中的每个词(中文)进行平均来表示句子,这种方法经常用在wordembedding层面。但实际上,一般来说,尤其是句子级别的任务,句子的信息更多是由关键词提供的,所以QQ研究人员提出用IDF值来衡量句子中词的权重,从而得到BERT。句向量,在实验中也取得了较好的效果。具体方法是:首先,在大量的文本上,使用分词工具对词进行分词,并计算词粒度的IDF,即:然后,对任意一个句子进行分词后,可以得到每个词的权重词(即这个词的IDF)。但是,由于BERT得到的是词向量,所以要用词的权值除以词的长度,得到词的权值。最后将每个词的权重加到平滑项上,再用每个词的权重除以整个句子的所有权重之和,得到每个词的最终权重。计算完句子中每个词的权重后,对该词的BERT向量进行加权求和,得到加权后的句子向量,即为什么不直接计算词的权重主要是因为词的语义通常不够清楚,而且依赖于上下文,同时也依赖于组词,所以词的IDF值更有实际意义。此外,加权方法的另一个考虑是它对特定任务有足够的适应性,可以通过权重调整来关注与特定任务更关注的词。LTD-BERT知识蒸馏是一种常用的模型压缩方法,由Hinton于2014年提出[2]。在Teacher-Student框架中,将一些学习能力强的复杂网络学习到的特征表示“知识”提炼出来,迁移到参数小、学习能力弱的网络中。普通蒸馏一般将Teacher和Student应用于同一个问题,可以在one-shotlabel上提供Student无法学习到的softlabel信息,其中包含类间信息,Studentsmallnetwork无法学习而Teachernetwork可以学习到的特征表示"knowledge”,因此Student网络的准确性通常可以得到提高[3]。之前提出的一些蒸馏方法[5,6,7,8]多用于文本分类、语义匹配、序列标注等任务。BERT作为Teacher直接执行标准的蒸馏过程,或者以此为基础提高Student的学习目标。对于下图2所示的BERT训练过程,这部分工作更侧重于右边的Supervised部分。BERT的突破很大程度上依赖于图中左侧弱监督过程中从大量文本数据中学习到的语义建模能力。所以,这里LTD-BERT的初衷是希望Student模型能够提炼出这部分能力,所以错误的Student网络建立目标任务,Student的目标只是拟合句子向量Teacher网络,不再关注Teacher网络的预训练任务。通过适当的损失函数设计,实验验证了简单的Student网络能够更好地拟合BERT生成的句向量,并将其应用于各种任务。图2.BERT应用于NLP任务的过程。(摘自[4])Distillingprocessandarchitecture整个BERT压缩过程分为几个部分。首先对输入的句子做一些清洗(BERT本身也有一定的清洗过程),然后如前所述,单词级别的权重计算需要分词,计算/获取权重,对字符进行均分(如如下图预处理所示)。经过预处理,得到单词列表和每个单词对应的权重,作为LearningtoDistilling过程的输入。一方面,训练过程使用预训练好的BERT(谷歌开源的中文预训练模型)对句子进行建模,通过加权平均得到BERT向量(如图中训练阶段右侧所示)图);另一方面,使用简单的序列模型(本文介绍的结果以LSTM为例)以相同的方式对句子进行建模,得到上下文中每个词的语义,并使用相同的权重得到句子嵌入,以及然后使用基于向量距离的损失函数进行训练。通过对百万数据的向量拟合训练,得到大小仅为BERT1/20的LTD-BERT模型,为句子构造句子向量。句子向量可以直接用于句子相似度计算和基于语义的文本聚类。此外,LTD-BERT还可以像BERT一样在实际任务上进行finetune,以获得对目标数据更好的适应性。这里QQ团队提出的方法只优化了最后一句的向量,因为使用的是序列模型作为LTD-BERT的基准模型。原则上,这个过程可以直接用BERT对每个汉字的建模结果进行拟合。但这还没有完成。一方面,直接拟合已经可以得到很好的sentenceembedding;另一方面,拟合过程使用预先生成的基于BERT的句子嵌入。如果省去每个词的向量存储开销,那将是巨大的。是的,如果不进行pre-generation,训练速度会被BERT的inferencespeed卡住。图3.LTD-BERT训练流程LTDStudent模型结构图4.LTD-BERTStudent模型这里详细介绍一下目前使用的Student模型(即LTD-BERT)的模型结构,这里基本就是一个标准的双向LSTM,在wordembedding上构建正向和反向LSTM得到下一个汉字上下语义的语义,然后用和BERT一样的权重(图中w)做加权求和得到一个向量与BERT具有相同的维度。这里需要使用双向LSTM是因为BERT预训练任务为每个词构造了上下文感知表示,保持建模过程的一致性可以保证更好的拟合效果。因此,这里的LTD-BERT基础模型唯一的限制就是需要在对每一个汉字进行建模时,提供上下文语义建模。QQ研究团队还试验了一个不满足这个假设的基础模型,效果会大打折扣。该效果已于2019年8月在腾讯内部开源,LTD-BERT效果已在以下业务得到验证:QQ、腾讯新闻、腾讯游戏、腾讯看点、腾讯健康等海量用户产品线,包括文本分类、语义匹配、文本聚类等任务保证了算法具有足够的泛化能力和实用性。针对具体任务,本文选取了一些有代表性的对比数据来说明模型的效果。因为涉及到具体,这里主要用“类别数+数据量+数据类型+评价标准”来区分数据的特征。文本分类语义匹配综上所述,在任何句子级别的任务上,该方法的方法都可以提供一个小规模的LSTM模型来替代BERT,随意使用。并且实验发现,当数据量比较小的时候,尤其是在业务数据中常见的几k到几十k的规模上,LTD-BERT明显优于LSTM和上面提到的蒸馏算法,效果更接近BERT,通常加上上面的一些其他逻辑或者简单的方法就可以和BERT持平,甚至比单独使用BERT的效果更好。尤其是对于资源有限或者业务量大的业务,可以有效解决BERT好吃却只能线下看的问题。此外,QQ团队还对公共任务做了一些测试,以便更好地进行对比。未来代码将开源,更多实验结果将在开源项目中发布。另外,在NLP高速发展的时代,一个阶段会产生很多相关的工作思路。在内部使用LTD-BERT的同时,我们也看到DistillBERT[9]和Tiny-BERT[10]相继推出。这两个作品与LTD-BERT的出发点是一致的,都集中在图2的左边部分,在大的层面上主要有两个区别:1.LTD-BERT侧重于预训练模型,DistillBERT和Tiny-BERT侧重于在预训练过程中引入蒸馏;2、LTD-BERT侧重于Transformer或BERT结构的蒸馏过程,探索更小计算的可能性。【编辑推荐】2019年IDEGithubstar5300+非常适合C/C++开发者。致力于为程序员开发文档开源管理系统。JetBrains推出编程字体Mono:更适合程序开发者,性能提升高达120倍!滴滴实习生提出自动结构化分支缩减算法框架【责任编辑:张艳妮TEL:(010)68476606】
