作者 | 戚路北
编辑 | 青暮
自2018年下半年开始,到现在为止,预训练语言模型的发展基本呈现爆发趋势,研究人员数目越来越多,研究方向也越来越广。
近日,在第十九届中国计算语言学大会(CCL2020)上,华为诺亚方舟实验室语音语义首席科学家刘群介绍了预训练语言模型研究进展和趋势展望。
演讲内容包括自然语言处理的预训练方法的背景,预训练语言模型的近期进展,华为课题组的成员们做的工作,以及目前的成就与未来的展望。
刘群是自然语言处理和机器翻译领域的国际著名专家,研究方向包括多语言信息处理、机器翻译模型、方法与评价等。2012 年 7 月之前,刘群是中国科学院计算技术研究所的研究员和自然语言处理研究组负责人。2012 年 7 至 2018 年 6 月,刘群任都柏林城市大学教授、爱尔兰 ADAPT 研究中心(前身 CNGL 研究中心)自然语言处理主题负责人。
2018 年 7 月开始,他正式加入华为诺亚方舟实验室,任语音语义首席科学家,主导语音和自然语言处理领域的前沿研究和技术创新,除了语音、对话、翻译、多模态以外,其实验室也在重点布局预训练语言模型。
以下是演讲全文,AI科技评论进行了不改变原意的整理。
1
自然语言处理的预训练方法的背景
自然语言处理的预训练方法属于自然语言的表示学习,自然语言表示学习的形成已经经过了长期的历史发展。
首先,1948年N-gram分布式模型被提出来,这是最初的语言模型。1986年出现了分布式语义表示,即用一个词的上下文来表示该词的词义。2003年神经语言模型被提出,开始使用神经网络来进行语言建模。
2013年word2vec的提出,标志着神经网络方法开始在NLP领域获得成功,word2vec将词语从一个符号空间映射到了一个向量空间,使得NLP中大规模使用神经网络方法成为可能。到2018年,出现了预训练语言模型。
不管是统计方法还是神经网络方法,都是一种基于数据的方法。如果数据不够的话,模型就无法有效建立。但是现实生活中,数据永远是一个很大的问题。在实际应用场景中,我们得到的很多数据都是无标注的,在这种情况下传统模型就无法解决实际问题。
预训练的思想是,在利用标注数据之前,先利用无标注的数据也就是纯文本数据,去训练一个模型,这个模型能够学到一些潜在的跟标注无关的知识。然后在具体的任务上,预训练模型就可以利用大量的无标注数据训练所得到的知识。
第一代自然语言处理预训练模型是词向量模型。词向量模型是把大量的无标注的文本送到一个比较简单的神经网络里面,经过训练,每个词都会被赋予一个静态的向量。
词的静态向量在空间分布上有一个非常好的特点,即相似的词会聚在一起。词与词之间的关系也会以一种向量的形式得到体现,从而实现了符号空间到向量空间的映射。
第二代自然语言处理的预训练模型,就是我们今天研究和使用的预训练语言模型。
预训练语言模型是词向量模型的进化,它的本质其实是有上下文的词向量模型。预训练语言模型的训练过程是,首先给句子中的每个词赋予一个静态向量,然后它会跟句子的上下文词进行交互,最后就得到了这个词在句子中的变化的词向量。这种特殊的词向量模型我们叫做预训练语言模型。
预训练语言模型有一个很重要的特点,它既会给每一个句子赋予一个概率,同时还会给每个词赋予一个表示或一些特征。
利用预训练语言模型的这个特点,就可以使用现实生活中几乎无穷无尽的无标注文本,来训练预训练语言模型,然后就能把经过训练的预训练语言模型,用在任何的下游任务上。
这不仅可以使下游任务的性能得到非常大的提高,还可以大大降低下游任务所依赖的标注语料的规模。
实际上,预训练语言模型的出现,几乎使所有的下游任务的性能都得到了很大的提高,使得自然语言处理技术又上了一个台阶,因此这是一个具有重大意义的突破。
在实际应用中,使用预训练语言模型可以分成两个过程,一个叫预训练,一个叫微调。首先在大量的文本上训练出一个预训练语言模型,然后在下游的任务上,根据实际情况对得到的预训练语言模型进行微调。
Transformer模型是预训练语言模型的主要框架,它的主要特点就是词与词之间可以互相关注。
类似于卷积神经网络中具有多个卷积核,并且每个卷积核会自动去会分配不同的权重,Transformer的基本结构的每一层都由多头的自注意力网络,以及一个前向的神经网络共同组成。
自注意力机制是预训练语言模型中非常有趣的机制。通过一些可视化工具,我们可以看到不同的自注意力头呈现出不同的特点或不同的关注结构,比如关注句子的第一个词、相邻的词、中心词甚至是句子结尾的标点符号。所有的关注信息,或者说词的注意力都可以在可视化图里看到。
预训练语言模型出现以来发展得非常迅速,目前已经演化形成了一个家族。
2
预训练语言模型的近期进展
预训练语言模型的近期进展包括以下几个方面:
1.更强大,也被戏称为叫大力出奇迹。
2.更小巧,即怎么把做模型做的更孝更快。
3.更优秀、功能更多、性能更高、训练更快的模型。
4.更聪明,即怎么引入外部知识。
5.更能干,即预训练语言模型如何影响了自然语言处理以外的一些领域。
1.更强大
预训练语言模型几乎成为了大公司之间的军备竞赛,目前学术界还还很难参与这种军备竞赛。
很多大企业都将自己的预训练语言模型做的越来越大,仿佛没有终点,并且这种趋势还在不断加强。
预训练语言模型的做大不仅仅是带来量的提高,更带来了模型使用性质的变化。
最早在词向量模型时期,整个自然语言处理就被带入了神经网络时代。在神经网络时代,单一的CPU已经不能满足需求了。可以通过GPU,在不需要进行过多额外计算的情况下,做到在整个词表上进行词的选择,这在以前的SMT上是不可想象的。正是有了GPU,我们才可以通过词向量模型这类神经语言模型来完成这类工作。如果没有GPU支持,或者用以前的统计方法,是难以想象的。
预训练语言模型通过使用更大的GPU,更多的数据,也带来了更大的变化,即微调的模式。微调为下游任务大致规定了几种固定的模式,包括句子分类、句子关系的分类、词语序列标注,以及QA任务中常见的句子片段的提取等。
以前解决每个NLP问题,都要先设计模型。现在通过微调这一简单的模式,我们不再需要去为每个任务去设计特定的NLP模型,而可以将所有的NLP任务都纳入几个模式。
GPT-3有一个非常吸引人的地方,就是它几乎无需做微调,并且它的演示效果也很好。
GPT-3给我们带来了非常大的冲击。这个模型有着极高的训练成本,使得实际上绝大部分的企业和科研机构都无力承担。它的1750亿参数比BERT-base模型大了100倍,比 GPT-2大了10倍。它单次训练需要1万亿单词的训练数据,以及1200万美元的训练成本,能够承担这种训练成本的企业在世界范围内也非常少。
虽然它的训练成本如此之高,但是它的效果非常令人吃惊。以前我们解决特定的问题,都需要专门去找语料,做专门的训练才能做。现在这个模型,只要是需要的功能都可以直接实现,基本不用训练。
还有一些我们原来觉得很难做到的事情,GPT-3也能做到,例如算术计算、写代码等等。它还能够很细致的区分56和49这两个词,甚至在数量上都能区分出来,如此的细腻度令人吃惊,这也给它的商业价值也带来巨大的想象空间。
很多人都在想,大算力会不会成为预训练语言模型的瓶颈?实际上,算力最终并不会成为瓶颈。上世纪90年代IBM提出统计机器翻译模型的时候,大家几乎都重复不了。但是99年以后,统计机器翻译模型基本上变成普遍的、所有人都能用的模型了。
深度学习也是一样,深度学习在GPU出现以前,也是曲高和寡,然而 GPU的出现,突破了算力瓶颈以后,也变成了一种普通的工具。那么GPT-3这样的模型,现在的成本虽然非常高,但是我们大家可以去憧憬一下,未来的某一天,它或许也会变成一种非常普遍的工具。
训练大模型实际上是很困难的,它并不是在单一的CPU或者GPU上进行训练,而是在多个硬件的组合结构上进行训练。但同时,每引入一种更复杂的硬件结构,也会带来更多的问题。上图为一些常见的用来解决这些问题的技术。下面着重介绍三维并行训练技术和稀疏注意力加速技术。
三维并行训练技术,是指把数据和模型进行各种维度的切分,包括数据并行、pipeline并行和模型并行。模型并行又包括不同类型的模型变形,通过把整个数据和模型进行三维的切分,建立三维并行坐标和物理设备之间的映射,然后每一个区域运行一小块的方法。
稀疏注意力加速技术也是一个被证明有效的技术,GPT-3就使用了这个技术。它的原理是把一个注意力矩阵分成两个小型矩阵的乘积,这是一个可以有效处理更长注意力的机制,这也是目前为止被证明非常有效的办法。
2.更小巧
目前的大型预训练模型,不但训练麻烦,而且推理时间也很长,因此只能用在云端应用上,在设备端应用有明显的局限性。因此训练出更小的模型,实际上也具有非常大的应用价值。
就华为来说,华为目前的业务方向除了手机业务外,也在做大量的用于物联网的小设备。既然希望将模型用到小设备上,我们就面临将模型进行加速和压缩的问题。
预训练语言模型就形成了这两种趋势。一方面是人们把模型越做越大,去探索模型能力的边界。另外一方面就是模型越做越小,让它在各种下游任务上形成生产力,即在手机端等各种小设备上能够单独运行。
目前模型压缩这一方面研究也非常多,主要包括三大类技术,一类是基于知识蒸馏的预训练语言模型压缩,另一类是基于剪枝的预训练语言模型压缩,还有一类是基于量化的预训练语言模型压缩。
基于剪枝的预训练语言模型压缩,就是基于一定的准则,去除掉参数矩阵的冗余部分。比如在神经网络模型中,我们可以去掉一些冗余的神经元节点,和神经元连接,使得模型变小一点。
基于量化的预训练语言模型压缩,就是减少数值表示所需要的比特值。目前我们使用的GPU都是用32位的浮点数计算,计算代价非常高。我们可以将它量化为8位的浮点数,甚至4位的浮点数、2位的浮点数,这样运算过程就得到了简化。
还有一些别的压缩技术,比如矩阵参数分解、参数共享、模型架构设计与搜索。
矩阵参数分解就是将一个大矩阵,分解成两个小矩阵的乘积。
参数共享有很多方式,比如Transformer有很多层,各层之间可以共享其中一些参数。而ALBERT,就是所有的层共享其中一层的参数。共享参数的好处就是参数量大大减少,但实际上在推理时间上并不能大幅度减少,所以它能带来的好处还是有限。
模型架构设计与搜索这方面的发展,其实跟近年来自动机器学习的发展有关系,我们希望通过自动机器学习,能够去搜索出更好的、更精简的架构。
3.更优秀
目前看来Transformer模型架构确实非常优秀,当下也很难去做大的改动。真正做出一些影响力的工作是transformer XL,它的贡献是引入了recurrent的思想,以及引入了相对位置编码。而其它方面的话,大的改动很少。
另外就是试图降低复杂度,因为attention机制是每两个词之间都要做一次 attention,这样的话attention的计算数量就是一个句子长度的平方级。
在日常处理更长的文本的时候,都会面临这样的问题。目前我们需要的文本长度一般都不能超过1024,很多任务甚至只能用512或者256。很多研究工作速度希望把它的计算数量从平方量级降到线性量级,从而可以使语言模型处理更长的文本,所以目前这方面的研究也非常多。
除了去寻找更好的模型结构,我们还需要训练更复杂的任务。现在BERT训练的过程实际上并不高效,它的训练时间很长,很多学者就试图在这方面去改进,提出更好的训练任务。
Baseline是基础的预训练语言模型的训练,包括LM、MLM和NSP等训练任务。除此之外,大家也提出了各种各样的新的训练任务来进行改进。
BERT就提出了几种新的训练方法,一种叫做next sentence prediction(NSP),就是根据前文预测下一个句子。
另一种叫做whole word masking,这跟BERT的设计有关系。因为BERT里很多词都被拆分成一个个小单位,这样单独预测其中一个subword难度就比较校通过把小单位合起来,加大训练难度,预测效果就会更好一点。
以下还列举了其它模型的一些训练任务。
replaced token prediction:也就是将一个词给换掉,然后来预测这个词是换掉之后的词还是原来的词。
Sentence order prediction:将两个句子的顺序给颠倒,来检测哪种顺序是正确的。
Denoising Autoencoder:这个是更复杂的训练任务,它是对一个句子进行插入、删除、替换等操作之后,再将它还原出来。
Multi-task Learning:它同时使用了多种训练任务。
Generator and discriminator:它是用一个生成器去替换一些词,然后由判别器来判断每个词是否替换。它的好处在于一个句子中的所有词都可以做错误的反向传播,所有词都能被我们使用,而BERT一个句子只能利用15%的词。这样我们就能加快它的训练速度。
另外我们还在追求更多的功能,比如多语言预训练语言模型,像mBERT和XLM,另外还有一些想法就是把GPT和BERT这一类模型给综合起来,像UniLM和PMLM。
4.更聪明
现在,人们都意识到语言模型缺乏知识,那么是否可以融入一些外部知识呢?知识这个话题很大,目前也有一些争议,但是相关研究还是很多的。
图中是刘知远团队跟华为合作的早期工作,就是试图把采用TransE预训练得到的知识空间的向量表示嵌入到语言模型里面去。
这是刘知远团队改进后的工作叫KEPLER,也就是将知识图谱融入到语言模型中,像这一类的工作还有很多。
还有一种更简单的想法,Span知识融入:就是让实体或者关系对应着句子中的一个span,通过利用span的方式来把知识嵌入。
图中是赵海团队做的SemBERT, 这种方法是将语义角色标记这种更复杂的句法语义的知识融入到语言模型。
5.更能干
目前在预训练语言模型中,有很多想法都非常好,而且在自然语言处理方面取得了成功。因此很多人都在想,能不能将这种思路应用到别的领域?这个想法很好,做起来很困难,但最终也取得了一些喜人的成果。
比如说在语音识别领域, Facebook提出了 wave2vec,它就是通过使用大量没有标注的、纯语音的数据,去预训练一个模型,然后利用这个模型,在一个少量文本标注的语料上进行语音识别,最终取得了非常好的效果。
那么最近在图像上面,包括图像分类、目标检测等任务,都有一些预训练的相关研究。其中,DETR是用了transformer模型,但不算预训练。
信息检索也已经开始用预训练语言模型,并取得了非常好的效果。在这方面目前大概有两类模型,一类采用sparse索引,它是使用传统的搜索引擎的前提下,去改进传统倒排表的方法。另一类采用dense索引,这种方法不需要建立传统的倒排表,而是直接用dense向量去对文本进行信息检索。
3
我们的工作
接下来我将介绍一下华为诺亚方舟实验室在这方面所取得的成果。首先,我们开发了一个自研的预训练语言模型叫哪吒。其次,我们在模型压缩方面做的工作非常多,华为的TinyBERT模型被压缩的非常小,小到可以用在端侧。
如今的预训练语言模型太多了,但我们还是希望有自主开发的模型,然后兼收并蓄,融合好的技术,并且把新技术也结合,然后训练好用的模型。同时我们也把它开源,大家可以去网上下载。目前我们已经推出了不同的版本,另外还有生成模型和TinyBERT,也都开源了。
哪吒的性能也是非常强的,我们在目前中文的CLUE排行榜上是第二名,仅次于human模型,事实上在之前很长时间内我们都是第一名。
另外在英文的排行榜SUPERGLUE,我们现在已经排到第二名,第一名的是目前在规模上大哪吒十倍的T5模型。
哪吒在华为产品的落地,包括华为云,华为手机小艺,以及华为的 HMS。
哪吒在华为产品落地的技术,包括基础的算法和模型,对话系统,还有推荐搜索等。
TinyBERT是我们目前取得成就最多的一个模型,接下来我着重讲一下TinyBERT的原理。
TinyBERT知识蒸馏的基本流程包括两步,第一步叫做general distillation,即使用一个大的预训练语言模型,训练一个小的预训练语言模型。
第二步叫做task-specific distillation,即使用一个大的预训练语言模型,去对一个小的预训练语言模型进行微调。在这里我们引入了一个新的技术,叫做数据增强,这个技术非常重要,如果没有这个技术的话,整个模型的性能会下降很多。
TinyBERT知识蒸馏的损失函数中一个比较重要的就是,让中间层去学习隐藏状态和attention向量。
TinyBERT知识蒸馏的选层策略就是,我们用4层或者6层的学生模型,去学习12层的教师模型。但是让哪一层去学习哪一层,这就是一个有关映射的策略的问题了。我们最早提出的是一个均匀映射模型,即用小模型的1,2,3,4层,去依次学习大模型的3,6,9,12层。
后来我们就在想,是否可以让每一层都自动去搜索一个最合适的层次学习?我们就引入了进化学习算法。然后我们发现,对小模型来说,最好的学习层次是0,0,5,10。即小模型的第一层,第二层不要去学习,最好直接使用自动反向传播去调。用第3层去学大模型的第5层,第4层去学大模型的第10层,这样效果最好。6层的学生模型我们学到的是0,5,0,0,0,10。通过选层策略可以发现,选择好的层次的话就可以提高整体的效果。
TinyBERT知识蒸馏数据增强是一个非常有效的技术。因为下游任务一般数据都比较少,那么我们在蒸馏小模型的时候,数据的数量经常是不足的。
我们采取的办法,就是把用于下游任务的数据进行增强。数据增强实际上就是利用了BERT本身的特点,它的每个词都是可以替换成别的词的。我们采用一种替换策略,就是把每个词都去做一些替换,这样的话就会生成很多的跟原来的句子很相似的句子,比如10个词的句子换掉2个或者3个词,去生成增强的语料。
最后,我们发现大概增强20倍的时候,即将原来的一个句子替换生成20个左右相似的句子,用来做下游任务的蒸馏的效果最好。
这是我们的实验结果,我们看到在4层的模型,在GLUE上面,总的分数大概降低了2.5,从79.5降到77。6层的TinyBERT基本上是跟12层的没有什么变化。
在参数量方面,BERT-base有109M,而4层的模型只有14.5M,只有原模型的13.3%。6层的模型只降到了原来的一半。
在速度方面,我们也可以看到4层的模型提速了9.4倍,提速非常高。
并且我们现在模型空间非常小,参数量是14.5M的模型大小只有50M左右,完全可以放入手机之中,并且它的推理速度比原来快将近快10倍。目前我们这个模型已经大量的运用在华为的设备与应用之中。
我们还做了一个工作,在华为自研的BOLT深度学习加速库下,利用了底层的硬件再一次进行压缩和加速,使得TinyBERT最终的推理速度,可以达到1.3毫秒。
我们的TinyBERT在中文的CLUE小模型排行榜上一直是第一名。然后我们参加了 NLPCC的小模型评测比赛,也是获得了第一名。
4
总结与展望
从历史角度来讲,模型越来越大。GPT-3已经这么大了,我们还能做得更大吗?当然如果未来计算设备的硬件的问题解决了,可以更大,但是近期内呢?
更大的模型应该是什么样子?我设想的一种方式就是分布式,把模型分布到很多机器上计算,就像搜索引擎一样。
像BERT这一类模型如何再把它训练的更大?现在最大的几个预训练语言模型都是GPT类的,BERT这一类模型很难做得更大,一些工程上的问题目前还是很难解决的。那么未来我们是否可能训练更大的BERT类的模型?
小模型相反, BERT这类模型可以压缩的很小,GPT模型就很难压缩。BERT这个模型的压缩是不是还有潜力可以挖掘?
另外知识融入是一个很有意思的问题。知识融入人们做了很多工作,实际上我是不太满意的。因为很多工作只是在解决知识类的问题效果比较好, 一般的 NLP的问题,知识融入的作用并不是那么大,所以希望知识融入能够解决一般的 NLP的问题。
还有就是知识应该如何表示?现在大部分人认为知识都是三元组,我觉得这个是存在争议的,三元组实际上能够表达的知识其实非常有限。比如序列关系、空间关系、集合关系、数值关系等等关系知识都是很难学到的。
关于搜索引擎,我希望以后预训练语言模型可以和搜索引擎结合起来,预训练语言模型就是个能够回答任何问题的搜索引擎。
最后就是多模态预训练,希望将来它能带来无限的想象空间。