大规模预训练的反思—效率与泛化

 
 
 

图灵AI公益大讲堂

 

2月18日,图灵AI公益大讲堂邀请到了清华大学交叉信息院助理教授杨植麟,和大家分享大规模预训练的最近进展。

 

 
 
 
 
 

以下是讲座内容实录:  

 

很高兴有机会跟大家一起交流和分享最近的一些最新进展,也很感谢图灵研究院的邀请。

 

今天主要分享的内容是关于超大规模的预训练模型。这也是近两年一个非常火热的话题,我们会重点去讨论两个方面的思考,一个是效率,一个是泛化

 

我们首先从这个规模定理开始,叫 Scaling Law 。对于各种不同的模型或者学习范式,大家都研究过这样的一个 Scaling Law ,对于自然语言模型来说,这个 Scaling Law 在  paper《Kaplan et al 2020 》里面其实也有所阐述,它主要讲的是对于一个语言模型,它的测试的损失也就是 test loss,它实际上是跟算力数据还有这个参数的规模,它其实是存在某种函数关系的。所以你只要持续地去增加这个算力或者模型的参数,在足够多的数据的情况下,你就可以看到这个模型会持续变好,也说它测试的损失就会不断的降低。

 

当然是否这个 Scaling Law 会存在一个极限?目前,仍然是我觉得是可以存在一些争议的,就是可能还没有一个明确的结论说它到底是否存在一个极限。然后,那我们最近也可以看到一些尝试,像一些越来越大的模型被提出来。我们可以看到说这些模型虽然可能会取得一些提升,但是在很多任务上其实相比于更小几倍的模型,可能它的提升已经是存在着一些上限。那同时我们也要意识到,说这个Scaling Low 其实是针对于语言模型本身来说的,其实天然的还存在另外一个鸿沟,是语言模型和下游任务之间的一个鸿沟。虽然你可以在语言模型上取得越来越好的效果,但是你不一定能够在下游很多实际我们关注的任务上取得更好的效果。所以我倾向于把这个参数规模或者算力规模分成两个范围:

 

第一个是还没有饱和的范围。

这个范围它更多的其实就是我们会去关注它的效率,因为你的效率其实就等价于你的性能,比如说你可以用更少的算力得到一样的效果,那当你用一样的算力的时候就可以得到更好的效果。所以在这个方面,当Scaling Law有效的情况下,其实你的性能就等于你的效率。

 

另一方面,当这种学习范式基于自然语言模型,然后去泛化到新的下游任务的范式上,可能会存在一个饱和的区域。

因为毕竟泛化之间它其实存在一个鸿沟,即使你能把自然语言建模做得非常好,你不见得能够去把其他任务做得非常好。那这个时候其实我们就需要一些新的学习范式去突破这个瓶颈。所以就对应了今天的两大主题,一个是效率一个是泛化的问题,我们会分别展开,然后去介绍我们最新的一些工作。

 

 

首先是效率。

大家可以看到随着这个时间的变化、推移,其实各种越来越大规模的预训练模型层出不穷。在这个过程中,你可以看到他用到的这个算力是越来越大的。在这个过程中,其实从最开始的可能你用 1000 个 GPU 一天可以训练一个RoBERTa - Large 模型。那其实这个规模对于大部分人来说,它其实已经是一个非常难以承受的规模。但到后来的这个 GPT- 3 它的要求的这个算力的 FLOPs 甚至是这个RoBERTa - Large 的 50 倍。所以,可以看到效率其实成为了一个很大的瓶颈,怎么样能够更加民主化这一类型的研究,解决算力的问题、效率的问题直接成为一个很大的瓶颈。

 

我们也可以看到,因为这个效率上的问题,导致我认为整个研究领域或研究方向它其实潜在的存在一些风险。这个风险它的逻辑是这样的,对于大部分的研究者,他的算力只能去支撑他去研究怎么去提升微调的算法。但是你这个微调算法其实很大程度上它的上限是你这个预训练的过程。所以你如果没有办法去直接优化这个预训练过程,你是没有办法去更进一步地去探索这个 NLP 的极限。

 

对于大部分人来说,或者对于整个 NLP 领域来说,这种非常高的进入壁垒其实是不利于长期的发展。因为比如说,可能 10 年前 99% 的 NLP 的研究者他都可以去研究最新的 State of the Art 的结果,并且能够在上面有机会去做提升。但如果是放到今天来说,可能只有 1% 的人有这样的机会去提升这个预训练的上限。所以当你投入这个领域,真正能够提升上限的人数非常少的时候,它其实对长期的发展速度,我认为它肯定是会有变慢的风险。

 

当然我们可以看到之前也做了很多工作试图去解决这个问题。比如说我们想用更高效的预训练方式,那第一种情况,你可能会去提出来更好的训练框架,比如说你用更大的batch 或者你用更好的并行机制,你用各种并行的优化的方法能够去提升它训练的效率。但是它的问题在于,这个东西是没有办法去降低你的 FLOPs 的,(这样做)更多的是去把它规模化,让整个系统能够在一千两千张卡上跑起来,但是本身是没有办法去降低它的算力,你仍然需要这么多的FLOPs 才能够去训练得到一个好的模型。

 

第二个方面,也会有一些更高效的 architecture 或者 loss function ,比如说你通过这种新的网络架构,像 Primer 或者新的一些 loss function 像 Electra 你可以去做一些提升。但这些提升相对来说对于 FLOPs 的提升相对来说比较有限,更多的可能会是在比如说 1.2 倍、1.5倍,就是一到两倍之间,对于刚才说的这种指数级增长的这样的一个FLOPs  来说,我认为这样的提升可能相对来说还是不那么充分。

 

另外还有一个方向,它更多的是去做更有效的 inference ,包括典型的三种主要的方法,做蒸馏、做量化,还有做剪枝。当然它本身其实没有办法去提升预训练的过程中的效率,它更多的是说当你这个模型预训练出来之后,我可以去提升你的推理的效率,所以它本质上也很难解决我刚刚说的这个问题。

 

所以基于这个现象,我们其实是想去探索一个问题,有没有可能在这种情况下我们能够去降低 NLP 研究的门槛,就是你能不能用更高效的方式去就能做到这个 State of the Art的结果,我们是不是真的需要训练这么大规模的预训练才能达到一样的效果。基于这个问题,我们有一个最新探索是叫 Task-Driven Language Modeling ,即 TLM ,即任务驱动的语言模型。它是一个简单而且高效的模型,不需要这种超大规模的预训练,但是它同时又能够去匹配,甚至在一定程度上是超越原来这种基于预训练模型方法的效果。

 

这里面一个关键的因素或者一个出发点是,我们认为能够去快速定位到跟任务相关的信息是非常重要。因为在整个预训练的过程中,如果大家训练过这样的模型,你就会发现其实在训练的后期你整个 loss 下降速度非常非常慢,它其实已经陷入了一种 redundancy ,就是冗余度非常高的这样的一个学习过程。那我们其实核心的想法就是想把这个学习过程中的这种各种冗余能够进一步的去除,仅仅是去精准的定位和挖掘使用中间有效的信息来帮助我的下游任务。

 

 

这个是一个新的这种学习框架。可以看到左边是传统的学习框架,我需要在一个大规模的通用语料上,去进行这个预训练,然后把这个预训练的模型直接搬到下游的任务上去进行一些微调或者是 prompting。

 

在我们这个新的框架里面,你可以看到其实我们把整个大规模的预训练这个环节直接去掉,取而代之的是,当我知道我想要的任务是什么时,可以直接从这个通用语料里面去进行查询找到相关的语料,基于这样一种精准的召回,去同时优化下游任务的目标函数和语言模型的损失函数。

 

这样就可以像我刚才说的,摆脱对超大规模预训练的依赖,极大程度的提升效率。其实这个方法它可以非常好的去匹配左边这种传统范式的性能,所以它相当于是一个在性能没有损失的情况下,极大程度地提升效率。根据刚才的 Scaling Law ,反过来就是说当你用一样的算力的时候,其实你就能得到更好的结果,在 Scaling Law 成立的情况下。

 

中间有一些技术细节我在这里也做一些简单的介绍:

 

首先是检索的过程。

比如说给定了这个任务的数据,那我们其实是想要从大规模的通用语料里面去检索出来一个文档的集合。我们这里仅仅采用了最简单朴素的方法,就是 09 年 Robertson 他们提出来的BM 25 算法,它是一个稀疏的基于 N-gram TF-IDF 计算出来得到的一个传统的检索的指标,所以它是一个最简单也是最经典的检索方法。

 

所以这里其实没有用到任何复杂的,比如说像最新的一些 Dense  Retrievers,因为我们想让这个东西尽可能的简单,同时我们也不希望引入额外的预训练。同时我们也要注意到它是一个任务无关的算法,所以不管对于什么任务,我都可以用一样的检索方法去找到对应的语料,只是因为输入的文本不一样,所以召回的语料也会不一样,但是它对这个 task 是什么或者对于 label 是什么,它本身其实是没有任何的假设。同时也很重要的一个点就是它并没有假设这个领域相关的数据是可获得的,你只需要一个通用的语料,所以它跟之前的很多工作不一样,它并不是一个针对特定领域的方法,而是你直接就可以从通用的语料里面进行召回,所以它整个方法的输入或者对数据的要求是跟传统通用的这种预训练的范式是完全一样。

 

 

这个是序列的目标函数,你可以看到它会分成几个不同的项。其中有一些 notation,这个 S 指的是这个外部的数据,也就是解锁出来的数据。这个 T 指的是对于任务来说内部的数据。

 

我们实际上是会同时在这两种数据上进行优化。在外部数据上我们优化的是这个标准的语言模型的函数,在内部数据上我们同时优化语言模型函数和任务的函数。整个网络结构我们其实也没有去做任何的调整,都跟原始的 BERT 是完全一样。然后我又会在这个最后的 feature 基础上去加一个 LM 的 head 去做这个语言建模,然后加一个 CLS 的 head 去做分类。

 

 

这里讲了 TLM 的这个方法,那我们可以去对比这种新的框架,TLM 跟传统的这种预训练语言模型它之间会有什么区别?它主要体现在几个方面的区别:

 

1、首先是在损失函数上。

传统的预训练其实只仅仅优化了语言建模这样一个函数,它需要在效任务上去进行微调,这个微调的过程其实是属于另外一个阶段。所以他在整个训练这个 PLM 的时候,其实仅仅用到了 IM 的损失函数,但对于 TLM 来说,是同时去联合优化任务本身的损失函数和 IM 的目标函数。

 

2、对于训练数据来说也是截然不同的。

PLM 用到了完整的整个通用语料,但是对于 TLM来说,只是用到了里面非常小的一部分。可能在很多任务上,它就是一个 1% - 3% 这样的一个数量级,也说你可以去精准地定位到实际上哪些语料对你去完成这个任务是有效的。

 

3、在算力方面,也有两个数量级的提升。

比如说用传统的 PLM 你要达到对应的性能,你需要 1000 个 GPU/ 天。对于 TLM 来说,它是在 10 个 GPU /天以下,有两个数量级的提升。

 

4、在通用性方面, PLM 更胜一筹。

PLM 跟这个任务是无关的,但是 TLM 是一个 Task -Driven 的形式,所以在实际应用的过程中其实会有一个取舍:你到底是要一个任务驱动的模型,还是说你要一个对可能任务本身不敏感,它可能是更偏通用的一个模型,但是随之而来的可能是更多的算力的投入。

 

 

我个人认为,TLM 的出发点,其实是想去民主化 NLP ,让越来越多的人能够以较低的门槛去从事 NLP 的研究工作,能够在 state of the art 的效果附近能够做一些提升和突破,这个范式它其实是做到了这一点,因为你可以用少两个数量级的算力,就可以去得到一个 SOTA 的效果。你可以在这个 SOTA 的性能附近去自由地探索各种网络结构、各种损失函数、各种优化的算法,怎么去利用各种数据,还有包括其他很多设计的选项,你都可以自由地去探索。

 

但是对于预训练和微调这样的范式来说,其实很多东西它已经固定,比如说这个模型已经预训练完,整个 architecture 、 tokenization 的方式已经固定了,没有办法去修改它,只能说去发明各种微调的方法,但这个微调本身的上限其实就是预训练本身。所以我们认为 TLM 的一个很核心的价值是去民主化 NLP 这个技术,然后能够用极高的效率去降低研究的门槛。

 

第二个方面跟第一个方面也是相关的,它能够极大地提升效率。

当然这个其实要区分场景,因为这里有一个中心化和去中心化的区别。我们可以看到在很多组织或者高校的研究里,两个同时会存在的,比如说可能会有一个中台部门,去提供统一的服务,去 cover 很多长尾的场景。这个时候这种通用的预训类模型它仍然会有很大的价值,但也有一些高价值的我们想去重点关注的这种非常去中心化的这样的一个研究方式。这种情况下我觉得 TLM就会产生极大的价值,因为它的效率能有极大的提高,并且允许你针对一个特定的任务去优化。

 

对于灵活度也是有影响的。

TLM会带来极大程度的灵活度的提升。你可以有很多个性化的选择,对于这个序列的程度数据怎么表示,超参怎么调节,其实每个 task 都可以有非常灵活的选择,而不是说当一个模型已经预训练好之后,你就很难去改变中间的很多选项。

 

从通用性来说,仍然像我刚才说的一样,PLM仍然会是一个更好的选择,因为 TLM 本质上是牺牲了一定的通用性去换回了效率上的极大提升。但我们最近也看到有很多其他的尝试是基于这种多任务学习,比如说 FLAN 还有 tZero,这一类的方法我认为它其实是有机会跟 TLM 结合达到一个更好的平衡取舍,那就很有可能是能够在高效的同时也能兼顾一定的通用性,或者甚至你也有可能去训练一个小规模的TLM,你用一些 TLM 的方法去优化它,也许它就能够达到跟更大规模的 PLM 一样的效果,仍然是可以在效率和民主化上取得很大的价值。

 
 
这个是我们实际得到的结果。横坐标是算力,它是用这个浮点数运算的数量来表征的,纵坐标是模型的性能,可以看到红色的是 TLM方法。可以看到整体的结论就是当你这个模型性能一样甚至更好的时候,TLM其实是可以节省两个数量级的算力。也就是说,原来你可能要用 1000 张 GPU 跑一天,现在可能只需要 8 张卡一天也能跑完,而且它可以达到接近,或者更好的效果。
 
 
这个是一些具体的数值上的效果。可以看到不管是参数数量,算力还是数据上都会有比较大的提升。
 
 

我们这里其实也做了一些消融的实验,主要会关注几部分。

 

首先是去比较不同的检索策略。第一个策略是 BM 25 的策略,第二个策略是随机的检索。这个实验主要想表明的一点,还是需要针对性地去找到语料,这也是为什么能节省这么多算力的一个核心原因。因为如果是随机去找一个很小的子集,那我们可以看到它的效果确实没有 BM 25 这么好。这其实跟我们的动机和方法设计的考量是比较一致的,可以去验证我们之前的很多猜想。

 

另外一方面非常神奇的是,这个方法可以随着你的预训练语料的规模变大而变好,而且这个提升的幅度基本上是跟传统的预训练的方法是一样的。比如从小的 BERT 的 corpus 变到这个大的 RoBERTa 的 corpus ,它可以有一个比较明显的1~2个点的提升。这个提升幅度跟之前工作验证的比如基于同一个 RoBERTa数据从小变大十倍,这样带来的提升基本上是一个比较接近的情况。它其实表明,虽然这个方法没有用到全量的语料数据,但是当你的语料去不断丰富的时候,你仍然是可以从这样一个 TLM 的方式里面去受益。

 

 

另外一点,在很多情况下,其实我们会把 shell 任务分成两种,一种是低资源的语料,一种是高资源的数据集。可以看到在这个地方是 AGNews 是低资源的, SciERC 还有 ChemProt是高资源的数据集。可以看到,当你没有太多数据的时候,你去召回很多任务,你就可以得到更好的结果。但当你有很多数据的时候,其实不需要召回那么多,也能得到一个比较有效的结果。

 

 

这个是一些具体的参数的调节。在整个优化目标中其实有三项,中间每一项它都起到了非常重要的作用。同时我们也能看到对于高资源和低资源的这些数据集来说,它对应的最优参数是不一样。这个其实也很好理解,当你的资源比较少的时候,其实可能需要更多外部数据,你要对外部数据有更高的权重。当你的资源比较多的时候,可能对外部数据就可以去降低权重。

 

 

这个是具体的召回的样本。我们可以看到在大部分情况下,通过这种非常简洁的方式,就可以去召回到一些有效的语料,它对整个训练是有帮助。比如说你遇到一些名词,可能本来你很难知道它到底什么意思,但是你通过从这个通用语料里去召回相关的语料,提供更多的上下文,能够让模型去学到具体的语义是什么。

 

刚刚讲的第一个方面,怎么提升效率。

我们其实是重新去思考了预训练模型的范式。发现其实很关键的一点是能够去快速而且精准地定位到底什么是有效的语料,从而能够去极大程度的提升预训练的效率,同时也能够为 NLP 包括整个预训练的研究去打下一些基础,能够去进一步推动它的民主化,使得每一个人都能够在这个 SOTA performance 附近能够去复现并且能够去突破这个上线,而不仅局限于别人一些已经预算好的模型。

 

 

从第二个角度,就是我们刚刚也看到 scaling law 很有可能在你泛化到下游任务的时候,其实它的泛化性能是有可能会逐渐饱和的。这个时候你会发现再训练更大的模型,也许对于效任务的争议没有那么大。其实这个现象我在最近很多更大的数千亿甚至万亿的模型也可以看到,它在效果上其实并不一定会有一个很显著的突破。那这个时候其实我们就需要去重新思考这个泛化的问题。

 

泛化的问题其实引出来了,这个可能是预训练第三个阶段的一些技术的思路。我们可以认为第一个阶段是以BERT 为代表的预训练微调阶段,我们先在大量的语料上去预训练,然后找到下游任务去微调这个模型。

 

第二阶段是以这个 GPT- 3 为代表的预训练加提示这样一个阶段。我们可能不再需要去微调这个模型,只需要对每一个任务去写一个任务的描述或者叫提示,那你就可以去完成少样本或者零样本的学习。

 

但是对于第二个阶段,其实我们仍然能看到很多问题。它随着模型 scale 的变大,它的性能逐渐趋于饱和。第二个问题是它在很多任务上,它的零样本或者少样本的性能其实仍然是比较低的,相比于传统第一阶段的方法可能还是会低上不少。所以虽然这个时候你可以不需要样本或者只需要很少样本就能做到,就能有一定的准确率,但是它准确率本身其实并不高,所以也会促使大家去思考我们接下来应该怎么去突破,怎么在这个第二阶段的基础上进一步有突破。

 

最新的进展我认为主要是两个,一个是基于这种超大规模超多任务的半监督预训练。本质上就是在之前的这种超大规模的研究之上,额外引入比较多数量的任务,进行一个半监督的学习,它不是完全纯粹的自监督学习,而是回归到更传统的想法,是不是可以直接引入这个监督数据,进行多任务学习,结合一些原有的像自监督学习的一些进展,那是不是就可以打破自监督学习的一些上限和瓶颈?

 

第二个是在这个 prompting 的过程中,怎么样能够有一些自动化的高效的方法。不管是最近的Prompt Tuning的一系列,P-tuning 还是基于离散的prompt 的一系列方法,我觉得它本质上是在解决这样的一个问题。所以我认为第三阶段很有可能是会由现在这些最新进展去构成的。一个是半监督的超多任务的预训练,一个是加上这种 prompting 的技术的优化。

 

说到新的范式,我们看到之前的一些工作,像这个 FLAN Zero 它本质上做的一个事情,就是它把很多监督任务在原来的自监督的基础上加入有监督的学习,然后通过 prompting 的方式把不同的任务进行统一。所有的任务都可以变成一个seq2seq的问题,然后用这个不同的任务描述去统一起来。这样当你在测试阶段遇到一个新的任务时,你就可以直接通过prompting的方式去用这个模型进行预测。这也就是我们所谓的零样本泛化或者叫零样本学习,它是一种新的范式。我认为它其实就是第三阶段,可能未来很多工作都需要去跟第三阶段这种半监督的训练方式去进行结合,它整体去做零样本的思路,其实跟传统的 GPT- 3思维它也是比较像,只是说你你在训练阶段的时候去引入了大量的这种有标注的任务,这个是  GPT- 3自己没有做的事情。

 

我们最新的一个工作是在这些方面想去取得一些探索和可能的突破。

 

我们首先是第一个在 1000 个任务上去进行预训练的工作。之前大家其实探索过很多不同的维度,比如说去探索模型的规模化,模型参数的规模化,或者探索提示数量的规模化,但从来没有人探索过任务的规模化,因为任务的规模化可能实现难度比较大,本身需要有这么多的任务和数据的积累。另外一方面,任务的规模化其实在整个半监督的体系当中是非常重要的。我们假设当你有足够多的任务的时候,其实是可以取得非常好的零样本泛化的性能。

 

我们实际也发现一个很有趣的现象,通过任务的规模化,其实可以取代传统的这模型规模化。意思就是说当你有足够多的任务的时候,其实你的模型参数对于结果的影响没有那么重要。通过这个我们可以节省 30 倍的浮点数运算,提升 30 倍的效率。

 

同时在零样本方面我们也取得了比较好的结果,在很多产业界的真正的生产数据集上,它是可以去比肩甚至超越传统的基于这种全量监督信号的 T5 和RoBERTa 模型。同时我们也探索了如何去自动的对于一个从来没有见过的任务,能够找到最合适的prompt 。因为在整个这种半监督的框架里面,其实 prompt 成为了一个核心。我们提出来基于这种遗传算法去找到最适合当前任务的方法,而且它的效果在给定一样的数量的 label 的情况下,可以比这个传统的 LM-BFF 或者 prompt tuning 的方法效果更好。所以这个是两种不同范式的对比。

 
 

上面是这种传统的方法,你会先预训练一个模型,然后针对一个 task 去做 Flnetuning 或者是去写一个 prompt。对于新的方法来说,其实就是pretrained一个模型,然后再进行一步这种 Prompt-based 的 Pretraining, 但它可能会在一个超多任务的集合上去完成这个事情。得到一个模型之后,我们会对新的任务去做基于遗传算法的 Prompt Search ,同时能够去对很多不同的任务去做服务,包括从来没有见过的任务去做零样本的推理和服务。

 

为了做这个事情,最关键的一点其实是怎么样去收集到足够多的数据。因为你如果只用学术界的数据,其实很难做这个事情。公开的数据集不管是英文还是中文,可能都只有 100 个左右,都是在百这个数量级,我们实际上是利用了一些产业界积累的优势。在过去几年我们其实积累了大量产业界的数据,来自不同的行业,包括像汽车、房产、保险,证券、银行等等,这里面其实也会分成好多类,我们把这些任务进行了一个集合,作为我们整个任务规模化探索的基础,然后得到一个非常有趣的结论就是这个图:

 

 

首先这个横坐标是你的训练任务的数量,纵坐标是它本身的这个性能,我们用 AUC 来度量,性能越高,它就表明这个模型预测得越准。这三根不同的颜色的这个曲线分别是代表了120亿,15亿, 3 亿三个模型。

 

大家可以看到一个非常有趣的现象,就是当你的任务数量足够多的时候,不同的模型规模之间它没有太大的区别。比如说 120 亿的模型跟 15 亿的模型的效果其实是基本一样的。这个其实就证明了,任务规模化是一个非常高效的方式,它也可以带来更好的泛化结果,可以在一定程度上去替代模型参数的规模化,你不一定是要用非常非常大的模型,而是只要你这个任务足够多,实际上它就可以在比如说 10 亿这个规模,也能取得比较好的结果。

 

同时也看到一点,这种基于多任务的学习,它会比只是基于自监督的学习要有一个很大的提升,同时当你有接近 1000 个训练任务的时候,其实可以达到跟微调的 RoBERTa  Large 一样的效果。也就是说你这个模型其实在很多任务下它是达到了一个比较高的水平,因为已经接近了全量样本微调的标杆模型的效果。

 

 

同时我们也测试了跨领域和跨任务类型的结果。

是什么意思呢?比如说在房产汽车的数据上去训练,然后看它在金融上是什么样的效果,或者在金融汽车上去训练,去看它在房产上是什么效果。它从来没有见过房地产的数据,但是仍然能够达到一个接近 90 的效果,说明任务规模化的定律,其实在跨领域同样是适用的。虽然这个时候我们看到可能百亿跟十亿的模型有一定的差距,说明你加参数的时候,对于这种跨领域的泛化仍然是有作用的。

 

另外,我们可以看到跨任务类型其实也能达到一个比较好的效果。它可能从来没有见过这种任务类型,比如说从来没有见过要抽取客户画像这样的任务类型,但是仍然能够随着任务数量的变多,得到更好的表现。所以任务的规模化定理在这里仍然是成立。

 
 

这是一些具体的数字去描述结果,主要是在学术数据集上的效果,红色是表明它其实是超越了全量样本微调的性能,加黑的表示取得了所有的零样本方法当中最好的效果。同样我们可以看到在生产的数据集上也能达到比较好的效果,可能有一半的数据集会比全量的 RoBERTa  微调的效果更好。同时有另外一半也是比较接近,它是在所有的零样本里面能够显著超越其他的零样本方法的一个效果。

 

 

之前我们提到会用遗传算法做自动的 prompt 搜索。这个地方做了一个对比,(对比)用这个方法和没用这个方法的性能差距。可以看到它在大部分任务上都有一个比较明显的提升。而且相比于现在比较流行的 Prompt Tuning的方法,用一样的数据量的时候,也能看到有一个比较明显的效果上的提升。这个是一些例子,关于怎么用 prompt 去做零样本学习。

 

 

举一个例子,比如说我们可能会在一些业务场景下监测“话术开口率”,这是对很多置业顾问的要求。我们可以问模型一个问题:对于这句话,该坐席是否有告知客户存在优惠价格,模型就可以去做一个判断。我们也可以去做情感识别类的任务,比如说把 X 这个变量输入到模板里面,然后我问它这句汽车评论的态度是什么。我们也可以去做阅读理解,比如说这个文章是什么?然后打一个变量进去,问题是什么,打另外一个变量,让他去输出一个回答,这样我们就可以完成基于 prompt 的阅读理解任务。

 

同时它也有很多别的任务,比如说命名体识别,它其实属于一个抽取任务,但它仍然可以做。比如我们可以问他这个报纸文本是这样,把整句话给它,然后问它当中有哪些是属于机构名,那它就会自动把这个机构名比如说青岛海宁和广州松日这两支队的名字给输出。

 

 

总结今天的内容,主要是覆盖了两个方面:效率、泛化

 

效率我们讲了怎么去做任务驱动的语言模型。

 

泛化层面我们去讨论了怎么去自动地做这个基于遗传算法的 prompt, 怎么去针对任务去进行规模化,以及得到了一些相关有序的结论。

 

我觉得接下来可能在这两个方面还有更多的探索和结合。比如说对于 TLM 来说,怎么样能够让它具备更通用的能力,比如 scaling 这些工作,是不是可以进行一个结合?我们怎么样理解,和现在它到底为什么会存在这种零样本泛化的能力,怎么样去理解到底哪个样本提升了哪个样本或者哪个任务提升了哪个任务,然后基于这样的观察进一步提升这个零样本泛化的性能,这些都是未来有意义的工作。

 

今天的分享就到这里,谢谢大家!

 

 

参考文献:

[1] NLP From Scratch Without Large-Scale Pretraining: A Simple and Efficient Framework. X Yao, Y Zheng, X Yang, Z Yang.

 

[2] ZeroPrompt: Scaling Prompt-Based Pretraining to 1,000 Tasks Improves Zero-Shot Generalization. H Xu, Y Chen, Y Du, N Shao, Y Wang, H Li, Z Yang.

 


 

转载原创文章请添加微信:eleven442615 或 Januaryqyy

转载请保持内容的完整性,所有内容不得删减、修改,不得做商业用途

 

 

 

首页    培训中心    大规模预训练的反思—效率与泛化
浏览量:0