预训练模型发展史

以下根据车万翔老师 CCL2019 报告整理。

目录:
一、传统词向量预训练:NNLM、SENNA、Word2Vec
二、上下文相关词向量:CoVe、ELMo
三、NLP中的预训练模型:GPT、BERT、BERT改进(RoBERTa、XLNet、ALBERT等)
四、预训练模型的应用:精调、多任务学习、小样本学习
五、预训练模型的分析:下游任务、级联任务、上下文词向量、注意力探针
六、预训练模型的挑战

预训练模型

一、传统词向量预训练

1、什么是词向量?

一个词用一个向量去表示。传统的方法是用one-hot向量表示,就是给每个词都给一个编号,one-hot词向量就是以编号为下标的值为1,其余为0,导致严重的数据稀疏、离散、正交等问题。词袋模型就是每一个词对应的位置,按照数量不断加一,好处是容易获取和计算,但是忽略了词序信息。

2、如何解决传统词向量带来的数据稀疏问题?

传统解决方案

(1)增加额外特征

增加词性、前后缀等这些更泛化的属性。比如提取出tion,知道含有tion的都是名词,能够表示更多的信息。

(2)语义词典

树形结构,给每个词一个编号,如果两个词比较像,其编号在树上表示的距离就比较近。较符合人的直觉,但是有两个问题:一,无法解决一词多义。比如Apple指水果,就和香蕉近;指手机,就和华为近。如果用词典,不好解决这个问题。二,更新慢,生成速度慢

(3) Brown Clustering

不是很受重视。上面两个都是人靠语言习惯,靠直觉想出来的。这个方法是通过文本对词进行自动聚类。给一个词,0/1编号,前面0越多,两个词越像。

3、除了词自身表示之外,是否可以用其他信息表示这个词?

上面的想法都是想用这个词本身来表示词义信息。典型的例子:一个词的含义可以由它周围的词决定。叫做词的分布语义假设

词的分布表示

(1)如何表示?

统计一个大的语料库,统计共现的所有的词的信息。比如moon和shinning共同出现了38,那这里表示为38.这样表示出来的向量可以用余弦计算相似度。但也存在高维、稀疏、离散的问题,因为词表可能很大,但是真正共现的可能占一小部分。

(2)如何解决高维、稀疏、离散的问题?

  • 加权
    • TF-IDF:把常用的词,语义信息不太丰富的词,如的、了等,给它权重很低
    • PMI
  • 降维
    • SVD分解:也可以实现降维。优点是可解释性强,比如moon,每一维我们都知道是哪个词。但是缺点:更新慢,更新词表时,比如新来了语料库,必须和原来的语料库混在一起重新计算,速度慢;且不容易扩展,比如要表示一个短语或句子,就不能把这些向量直接加起来。
    • LDA

5、更好的解决方法——分布式

用词的分布式来表示,就是常说的word embedding。直接用一个低维的、稠密的、连续的向量表示一个词。如何获得这样的表示是研究重点。

分布式词表示
  • 这个工作最早是在2003年有Bengio等提出的,叫Nerual Network Language Models.
NNLM

提出了word embedding的概念,但本质上还是做语言模型,估计一个序列的概率,分解成估计下一个词的分布,用这个序列之前的信息。这个模型要干的事情就是根据前n-1个词预测第n个词,前面n-1个词本来每个词都是离散的,然后把它映射成一个分布式表示的向量,然后把这些向量拼起来,然后过一个神经网络,然后就可以预测下一个词是什么(softmax的输出是一个词表,每个位置是第i个词为目标词的概率)。虽然这个模型是使语言模型估计更准,但是有个副产物:word embedding。通过反向传播的方法,同时能把一个词的表示学好。也就是这个词的表示越好,这个语言模型的效果就越好。

  • 另一个典型的工作是SENNA,是2011年提出来的。
SENNA

也是说用一个向量表示一个词。为什么说这个工作重要呢?是最早将深度学习应用于自然语言处理的工作。他提出了一个思想是——换词,与语言模型不同。就是我把一个正常句子中的一个词给他随机替换掉,替换后句子显然不符合正常语言习惯。这样的句子构成了一个反例,原来的句子构成了一个正例。如果我能够对这两个句子进行打分,让正的分比负的分高,这就是要学习的目标。从中,也会把word embedding学好,学好的word embedding也会应用于其他任务。但是由于当时条件训练一个月,且数据量不足,没有引起很大重视。

  • 是否有更有效的方式?一种思想是简化模型,增加语料,提升模型训练效率。由此产生了Word2Vec.
word2vec

就是把模型做的特别简单,就一层的线形模型,用这个模型去做词的预测,数据量用的很大,从而弥补了模型的不足。之后这个模型作为了很多NLP任务的初始化输入,得到很大的应用。比如词义相似度计算、类比关系计算、知识图谱补全、推荐系统等。

  • 但是还没有解决一词多义的问题。

二、上下文相关词向量

上面的工作没有很好的解决一词多义的问题。比如土豆(食物 or 视频网站)。希望根据不同上下文来赋予这个词不同的含义。我们如何知道这个词在当前这个环境下是什么含义?这个比较难。

1、基于双语的词义向量表示

基于双语的词义向量表示

车老师组在2014年提出了,在单语上获得含义比较难,因为只看词本身,他们长得都一样。其实可以利用双语资料。因为有大量的双语语句对,比如第一个翻译为potatoes,另一个是TuDou。他们的工作是把汉语翻译成英语,然后在英语中做聚类。然后回过头来再映射到汉语,标注这个词到底是什么样的含义,然后再学一个语言模型等,训练出来带词意的词向量。

2、CoVe

Cove

最早提出的基于上下文的词意表示,直接做一个NMT模型,从一种语言翻译到另外一种语言,用的是encoder部分,把encoder拿出来,每一个词encoder的结果,就是这个词上下文的表示,然后用上下文的表示结合以前固定的embedding,就可以做上游任务。

3、ELMo

ELMo

虽然双语效果不错,但是语料很有限,是否可以基于单语来训练模型,就有了ELMo。ELMo是“Embedding from Language Models”的简称。它的模型架构就是一个双向LSTM的LM模型。ELMo是为了解决一次多意性,对于不同的上下文可以给出不同的词向量。

用语言模型来做预训练的任务,用语言模型训练出来每个词的embedding,可以作为上下文相关的词的向量。其他几个贡献:

  • 使用字符级别的CNN表示。由于单词级别考虑数据可能稀疏,出现OOV问题,拆成字符后稀疏性没有那么强了,刻画的会更好。
  • 训练了从左到右或从右到左的语言模型。用这个语言模型输出的结果,直接作为词的向量。
  • contextualized:这是一个语言模型,其双向LSTM产生的词向量会包含左侧上文信息和右侧下文信息,所以称之为contextualized
  • deep:句子中每个单词都能得到对应的三个Embedding:最底层是单词的Word Embedding,往上走是第一层双向LSTM中对应单词位置的Embedding,这层编码单词的句法信息更多一些;再往上走是第二层LSTM中对应单词位置的Embedding,这层编码单词的语义信息更多一些。
  • 好处是训练数据接近无限。

缺点:

  • LSTM不能解决长距离依赖
  • 双向LSTM的输出直接拼接得到embedding,没有进行深度融合。

为什么有效?解决了未登录词的问题。

Q:什么是未登录词?
A:新来的词语,词表中没有的。因为是字符级别的建模,因此把新来的词拆成字符就可生成embedding。

三、NLP中的预训练模型

前面的方法不能算是我们现在所说的预训练模型。因为上面的模型训练出来的词向量/词的表示,在做其他任务时作为一个额外的输入,是不变的;而预训练模型是整个模型的结构就是为了用来做目标任务的,我在进行目标任务的同时,还回过头来进行fine-tune,更好的把我当前的任务/模型进行精调。这是两者的区别。

1、GPT

GPT

GPT是“Generative Pretrained Transformer”的简称。

最早的预训练模型。有几个特点/想法:

  • 首次用到了Transformer,进行更好的encoder。ELMo更多用的是LSTM,而LSTM对长序列的建模效果不是特别好。
  • 在目标任务上进行精调。当然就可以设计或者规定几种目标任务,比如分类问题(一个句子属于哪一类)、Entailment(两个句子之间什么关系)、Similarity(两个文本相似度)、多选题等等。获得了比ELMo更好的结果。

缺点:

  • GPT本质上还是一个从左到右,前向的语言模型,只考虑了前面的信息,是单向的。这个语言模型就是我要预测下一个是什么。我在预测下一个词的时候是看不到后面的词是什么,没有捕捉后文更多的信息。当然这是语言模型固有的一个问题。
  • 因此出现了BERT。

2、BERT

BERT

(1)BERT模型

可以看到BERT和GPT的一个很大的区别是,BERT是双向的。就是我挖掉几个词,在猜这几个词的时候我不光用到前面的词,还会用到后面的信息。详细看一下BERT模型。

BERT
  • 输入:不是简单的词,把word变成word piece,把一个长的词切成几个片段,比如:friendly-> friend+ly;汉语更简单,直接用字就可以。
  • 编码:Transformer;
  • 预训练任务:除了刚刚讲的,还有完形填空+下句预测。本来文本中两个句子连在一起,把下一句随机替换掉,替换之后模型需要能判断这是原始的还是替换的。
  • 训练方法:MLM
  • 应用方式:四种任务:分类、词pair判断等

因为BERT提高了好多任务的效果,刷新了11项NLP任务的最优记录,因此影响比较大。但是BERT也存在一些缺点:

BERT存在哪些优缺点?

  • 自回归语言模型 v.s. 自编码语言模型: BERT实际上是自编码语言模型,而其使用的Masked LM正是训练这种模型的技术,但是这必然会导致预训练和Fine-tune阶段的不一致。尤其是在生成任务上,生成任务就是根据已生成的单词以及一些外部知识,生成下一个单词,这和自回归语言模型天然匹配,但是和BERT的自编码语言模型天然矛盾。所以BERT不适合做生成任务。
  • Transformer模型限制:Transformer需要把文本裁剪为固定长度,导致无法获得更长时间的依赖,输入也不灵活。
  • 无法文档级别的NLP任务,只适合于句子和段落级别的任务。

(2)BERT的改进

正是因为BERT有这些缺点,所以在BERT出现后大家基于BERT,提出的改进策略。大概总结了六个方向。

a. 使用其他预训练目标

BERT有六个预训练任务:分类问题、Entailment(两个句子之间什么关系)、Similarity、多选题、完形填空、下一句预测。

为了增强模型的效果,在预训练阶段强迫加入更难的预训练任务,让模型学到更好的信息。

  • ERNIE(百度):首先预测word piece的任务难度不是很大,比如“哈”和“滨”,预测中间的尔还是比较容易的,预训练难度不是很大。什么比较难呢?就是把整个词挖掉,预测整个词,。比如***是黑龙江的省会,来预测这个空填哈尔滨,提出了这种基于词或者说实体的预训练任务。效果显示很有效。
    后来提出了ERNIE2.0版本,提出了更多预训练任务。比如英文,来预测这个字母是否是大写字母;或者句子的reordering,就是把文章句子顺序打乱,让你判断句子是不是散乱的;或者discourse relation,让你判断句子是什么关系,是顺承关系、因果关系还是转折关系,这个信息通过关键词还是能够获得的。这些预训练任务逼迫模型学习更复杂的信息,除了简单的语法信息外,还可以学语义信息等等。
  • SpanBERT(Facebook):想法是:不是只挖掉某一个word piece,而是挖掉一段词,挖掉后用剩余片段的边界来预测段落中的每个词,这样可以逼迫模型去学习更长的信息。获得很好的效果。比如基于段抽取的任务,如抽取式问答中取得良好效果。
  • MASS(微软):基于Span的思想,是否可以不仅能预测中间的一些词是什么,也可以生成中间的词。挖掉一段文字,然后用剩余部分,用是Seq2Seq模型去预测当前被挖掉的词所在的序列是什么。好处:不仅学习了被挖掉的词的表示,同时还可以预训练Decoder部分,Decoder好才能预测更准。好处是现在的BERT可能不太好处理生成的任务,在生成任务上不太好做预训练,MASS可以预训练生成任务,比如在机器翻译中取得很好效果。

上面的模型是增加其他预训练目标,逼迫模型去做更复杂的预测,从而提高模型整体的效果。

b. 融入知识图谱

大概分为两个方向:实体的生成,实体与实体之间的关系。

  • ERNIE(清华):传统的方法是我将词的预训练表示作为输入,这个模型的想法是:假设这个词是一个实体的话,实体在知识库的表示可以直接的拼接过来,作为输入,然后再进行预测。相当于在预训练中用到了实体的信息。在知识库中实体是怎么表示的呢?就涉及到了图的embedding表示。整个模型相当于融入了一种额外的知识。

  • KnowBERT:想法和ERNIE很像。进行输入时,不光看词自身,还要看词自身的实体的信息,把他考虑进去。模型更复杂一些,一句话中有很多实体,他们之间有关系的,(红色)在他们之间做一个self-attention,然后学习一个更好的实体的本身的在文本上的更好的表示。(蓝色)是在知识库中的表示,知识库中的表示也存在一个问题,就是一个实体在知识库中多次出现,歧义词,他们的做法是求平均来表示,【但是这样不太好,实际上可以做更好的消除歧义的任务】。之后呢,把单词在文本上的表示和在知识库实体的表示加起来,成为紫色的S',把这个结果再和之前文本的表示进行attention,进行了多次的attention操作,可以考虑到实体和实体之间到底是怎样的一种关系。

  • K-BERT:刚才的模型想法是在预训练的时候把知识融入进去,K-BERT是在推理的时候融入知识。这个知识怎么融入呢?一个办法是把句子中出现的实体、它在知识图谱中与它有关联的实体、它们之间的关系全部加到文本中,构成了一个更复杂的文本。对这个文本上直接用BERT模型,当然文章中提出了一些复杂的mask方法。
    好处:不用修改预训练模型,省去了一些麻烦;能够考虑到了实体和实体与实体之间的关系这些信息。

总结来说,有两种方法:在预训练的时候把知识图谱融进去,在用它的时候把知识融进去。

c. 更精细的调参

  • RoBERTa(Facebook):对BERT更精细的调参,包括:batch的大小是否可以更大、训练时间是否可以更长;发现去除NSP任务,完全靠完形填空的任务,对整个性能有所帮助;训练数据序列更长;动态改变mask的内容。但是,训练时间很长!(钱)

d. 解决输入不一致的问题

· 单向特征表示的自回归预训练语言模型,统称为单向模型:ELMO/GPT;
· 双向特征表示的自编码预训练语言模型,统称为BERT系列模型:(BERT/MASS/ERNIE1.0/ERNIE(THU)/ERNIE2.0/SpanBERT/RoBERTa)
· 双向特征表示的自回归预训练语言模型:XLNet

XLNet

XLNet的Motivation?

  • 对于ELMO、GPT等预训练模型都是基于传统的语言模型(自回归语言模型AR,基于前文预测下一个),自回归语言模型天然适合处理生成任务,但是无法对上下文进行表征,因此人们反而转向自编码思想的研究(如BERT系列模型);

  • 自编码语言模型(AE)虽然可以实现双向上下文进行表征,但是:

    • BERT系列预训练目标的设置造成预训练过程和生成过程不一致,无法进行生成任务;
    • 预训练时的[MASK]噪声在fine-tune阶段不会出现,造成两阶段不匹配问题;
    • 采用Transformer进行编码,输入长度固定;
  • 有什么办法能构建一个模型使得同时具有自回归和自编码的优点并且没有它们缺点呢?这就有了XLNet.

  • XLNet:发现了问题,在预训练的时候和实际应用的时候,输入不一样。因为在预训练的时候要mask一些词,但是在实际用的时候我们是看到了所有的这些词,也就是mask的词都能看见,有不一致的问题。这是BERT本身存在的陷阱。
    已有模型可分为两类的预训练模型:基于自回归语言模型(上文预测下一个词是什么)但它看不到下文,典型的语言模型,GPT为代表;BERT发现这种单向的很有问题,就提出了一种双向的,也叫自编码语言模型(上下文预测中间内容),这种基于上下文的存在预训练和精调时输入不一致的问题。
    为了解决这个问题,出现了XLNet,他的想法就是,我既可以用自回归语言模型的好处,还能预测时考虑到右边的那些词。
    怎么做呢?提出了基于排列的语言模型。就是把原来句子中这些词的顺序打散,输入随机打乱,通过一个新的顺序来预测下一个是什么,这样我在预测的时候,这个词左边出现的不光有正常在左边的词,同时还有在右边的一些词。这样达到了一个预测的时候能看到未来信息的效果。
    为什么叫XLNet?基于Transformer-XL提出来的,就是基于Transformer模型,能够对更长序列进行建模。但捕获长序列信息不是这个模型的核心,核心还是基于排列的语言模型。

    效果也不错,比BERT好,但是它的参数量比BERT大的,很多学者就想如果BERT也达到一样的参数量,是否效果和XLNet差不多呢?

e. 模型压缩与加速

前面考虑的是如何使模型效果更好,这一部分呢就考虑实际使用BERT的一些情况。BERT效果很好,但是参数量巨大,在实际使用时也会遇到各种各样的困难,成本很高。如何对模型进行压缩和加速也是很热的研究方向。大致有两个思路:

  • 模型的蒸馏(本质上是用一个小模型模拟大模型的预测的结果)
    • DistilBERT:用一个小的模型,比如把层数降低,去掉某些部分等,来模型大模型的结果。好处:效率提高,速度加快;副作用:输出结果和大模型的结果相比,总是有差距,达不到大模型的结果。这就取决于实际应用,看是重视模型效果,还是重视训练效率。
    • PKD for BERT:DistilBERT模拟大模型最终输出结果,模拟大模型中间的输出结果。
    • TinyBERT(华为):模拟attention的矩阵。
    • 词表的优化,BERT很大一部分开销是存储词表的embedding,占很大空间。学习一个映射:把大的模型的中间的参数,做一个映射矩阵,把这些参数映射到小的空间上,映射好的话,就形成了student模型,达到一个比较好的效果。
  • ALBERT:Google,刷新了很多评测榜
ALBERT

两种策略:更小的词向量维度;运用了类似于循环神经网络的Transformer的结构,用一套参数,降低了模型的大小。按理来说共享参数应该会导致效果降低,但是ALBERT缺取得了不错的效果,一个原因是将NSP(认为它难度低)任务改成了SOP(句子顺序预测)。
好处:参数量下降,模型效果提高;但是训练速度没变,甚至比较低,可能因为与循环神经网络的结构有关。

f. 跨语言与跨模态

  • 跨语言:之前提到的BERT模型大多都是基于单语的,训练出来的模型都用于该语言的任务上。一个理想的状态是希望在一个语言上训练的模型,直接应用于另一个语言上,因为世界上有那么多种语言,不可能每种语言都有大量语料、去标注。

    • 传统方法
      使用静态词向量,如果这两个词是互为翻译的,就是它们的embedding比较像;现在呢,把词向量变成上下文相关的词向量,是否也能做跨语言模型。

    • 多语言BERT:M-BERT
      Google在wikipedia中找了104种语言的数据,在上面直接跑BERT。为什么会有跨语言能力?
      第一个是:不同语言之间,共享了一些word piece。比如把一些词拆成小块,这些小块在不同语言之间是可以share的,尤其是欧洲那边的语言,大家的词表都比较像,会有很多重复的word piece。
      第二个是wikipedia自身有个特性,它在表示某个页面的时候,经常混杂着其他语言,比如一个德语界面可能会出现一些英语,会加括号用德语来解释这个英语,叫做code-switching,起到跨语言的效果。
      存在问题:不适合距离远的语言,比如汉语和英语,几乎没有共享的word piece;因为语言种类多,每种语言的数据量不如单语的数据量大,准确率不如单语BERT。后面出现了一些基于M-BERT的改进。

    • XLM(Facebook):想法是,收集双语的句对,在上面直接跑BERT。在mask的时候有可能mask的是英语,也有可能mask的是汉语。以此来获得跨语言的性质。结果还不错。问题是要收集大量的双语数据,训练资源要求比较多。还有一个是因为随机mask,假设mask一个英语单词,很容易猜出来是什么,因为对应的汉语翻译不一定被mask掉。更好的改进是同时mask掉,同时进行猜两边是什么,难度更大,效果更好。

    • Unicoder(微软):提出了三种跨语言预训练任务:跨语言的词语恢复、跨语言的同义句子分类(一个语句对,把其中一个句子替换成另一个句子,看这两个句子是否是一个意思)、跨语言的遮盖语言模型。因为预训练难度变大,所以模型效果也有所提升。

    • 跨语言映射BERT:上面的想法是根据双语或多语言语料重新进行预训练,但是这样消耗资源比较大,是否有更经济的方式呢?比如直接使用已经预训练好的单语的BERT,差的是这两种语言是如何映射的。如果可以学习一个很小的词表,获得这两种语言之间的关系,用线性映射的方式,把在不同空间的语言映射到同一空间,来达到跨语言的效果。

    • 跨语言的阅读理解(车老师组):现在阅读理解的数据基本来自英语,要做一个新的语言的阅读理解数据,不太好做。如果把文章进行翻译,容易产生答案对不齐的问题。提出了Dual BERT,将目标语言翻译成源语言,在源语言已经训练好的BERT上抽取答案,然后再映射过去,形成答案。如果把文章进行翻译,容易产生答案对不齐的问题。

  • 跨模态:现在有的BERT这些模型,都是在文本上训练得到的。有很多数据是来自图像的,是否能用BERT做一个多模态的学习,完成一些任务比如看图说话,根据文字生成图片等等。

    • VideoBERT:今年很有影响力的工作。和刚刚XLM的思想基本一样。就是文本和它对应的视频/图片,拼接在一起,直接输入给BERT。输出的结果,文本这方面比较容易,就是去预测生成的是什么word piece。图像呢不太容易,图像什么作为它的预测单元?一个像素嘛?不太合适。预测图像块。图像块本身是连续的,图像抽成一些块,把这些块进行一些聚类,相当于给每个图像块一个标签,然后就和文本一样,去进行预测。效果:可以输入文字,生成对应的图像。也可输入图像,输出相应的文字。
VideoBERT

四、预训练模型的应用

  • Fine-tune

    预训练好的模型很多时候是不能直接来用的,要结合目标任务还进行fine-tune。那么fine-tune的时候需要注意些什么?

    (1)是否需要fine-tune?

    • 这篇文章通过用BERT做了很多实验,得到了一个比较general的结论。当你使用的目标任务所使用的模型非常复杂的时候,不需要进行fine-tu ne;反之则需要。现在搞NLP有个趋势,上面模型部分越来越简单,预训练越来越复杂。可以思考一下未来会怎么样。

    (2)怎么fine-tune更好?

    ​ fine-tune效果,不仅使目标模型效果好,还要尽可能保留预训练模型原始的信息。如何进行balance呢?

    为什么要尽可能保留预训练的信息?

    • 只调上面,底下模型保持fixed。

    • 每次只精调一层,固定其他层

    • 自顶向下逐层解冻:我先训练好最底层,再固定好这层训练倒数第二层等等。这篇文章还给出了其他的值得借鉴的策略:

      • 学习率预热:warm-off
      • 先让BERT在通用的数据上训练一个语言模型,然后在此基础上在目标领域未标注数据上精调语言模型。
    • 目标是提高目标任务的准确率同时尽可能保持预训练模型原有的信息。因此考虑增加一个额外的损失,衡量原来的模型和训练后的模型之间的Gap,训练时尽可能减少这个损失,这样保证参数尽量少动,同时和目标任务像。这是一种策略。

    • 增加adapter(适配器):相当于在模型中增加一个组件。适配器是我们要训练的结果。原来的BERT参数等不变,通过调整适配器,更好的适应目标任务。加入适配器有很多方式:一种是串联到模型中,去学习模型信息;一种像加入Gate一样,去调整原来信息保留多少.

  • 多任务学习

    在原始的数据上做预训练,然后应用于目标任务。目标任务有很多很多,它们之间是否可以互相帮助。期望是它们之间能够互相帮助互相提高,但实际中往往只有一两个任务效果提升,其他都有所下降。今年斯坦福的BAM这个工作:我可以用蒸馏的方式,不是多任务,用单模型输出的结果做feature,多任务学习的结果做student,用多任务模型去学习单任务模型,结论是不同的多任务之间的效果都提高了。当然这个只是目前发现的一个现象,还没有人去解释这是为什么。

    BAM模型的细节

  • 小样本学习

    Few-Shot预训练学习。在目标任务上数据很少,怎么能够做这个任务?预训练模型天然的可以计算相似的性质。做个分类还可以,但是在自然语言处理中很多都是结构化信息的问题,

  • 零样本学习

    数据再少,就是零样本学习。没有样本的情况下,直接用预训练得到的embedding和知识库中的embedding对比,计算相似度等。

五、预训练模型的分析

现在预训练模型那么好,到底起到了一个什么样的效果呢?现在很多方向是在模型中加入探针,来探索预训练模型是个什么东西,到底起到了一个什么作用。

  • 下游任务探针
下游任务探针

这篇工作是在下游做16个任务,来分析BERT的效果。将BERT的输出直接固定,上层就只做一个很简单的分类器,然后做下游任务。BERT的输出如果能够很好的直接经过一个线性变换就能完成下游任务,说明BERT已经具备了完成下游任务的能力了。
结论呢,BERT在很多任务上表现都很好,但也有一些不好,比如语法检查等。

  • 级联任务探针
级联任务探针

很多自然语言处理的任务是基于级联的方式,如词性标注、句法分析等。这个工作就是说我这个BERT有12层或24层,底层在做分词、词性标注这些任务;中间的层做相对语义一点的任务或句法的任务;更高层做处理语义的任务。
得出的结论BERT自身已经蕴涵了原来要做的这些级联的工作。还有一个结论是底层一些歧义的信息通过高层可反馈出来。

  • 上下文词向量探针
上下文词向量探针

这篇工作是分析了预训练模型生成的词向量之间有什么关系。预训练的结果,可以直接将预训练的embedding,计算任意两个词之间的相似度,如果相似的话就给一条弧。发现最终连出来的弧非常像人工定义的语法树。
得出来结论预训练embedding蕴涵了句法的信息。

  • 注意力探针
注意力探针

刚刚是通过embedding的角度,还可以从attention的角度来进行解释,比如这两个词之间attention系数大了,就认为两者之间有一条弧,可能因为BERT使用了transformer的结构,有的head包含了一些句法信息,有的甚至包含了指代信息。

六、预训练模型的挑战

预训练模型遇到了哪些挑战?预训练模型有那么那么多的好处,是不是以后NLP都不用搞了?直接跑个预训练模型就行了?肯定不是。有哪些问题BERT解决不了?

  • 预训练模型是NLP终极解决方案吗?自然语言处理经历了这么几个阶段:形式,语义,推理,语用。BERT能够很好的处理语义问题,但是对于推理任务目前做的还不是太好。现在把GLUE变成了superGLUE,增加了推理任务,强迫机器去学习。

  • 如何利用更多的预训练数据?人工标注代价较大,现在很多预训练任务是寻找自动的标注,文本已经放在这里了,通过预测一个词,当然还可以制造一些数据

  • 模型的压缩和加速?压缩后效果不好,效果好但速度不行。

  • 如何在seq2seq任务上使用BERT?

  • 如何对长文档进行表示?目前只能学习到句子或段落级别的信息

  • 如何应对对抗攻击?

    等等。

你可能感兴趣的:(预训练模型发展史)