【李宏毅课程笔记】BERT and its family - ELMo, BERT, GPT, XLNet, MASS, BART, UniLM, ELECTRA, and more

Video: https://www.youtube.com/watch?v=1_gRK9EIQpc&feature=youtu.be
,https://www.youtube.com/watch?v=Bywo7m6ySlk&feature=youtu.be
Slides: http://speech.ee.ntu.edu.tw/~tlkagk/courses/DLHLP20/BERT%20train%20(v8).pdf

Overview

过去的NLP任务通常是一个任务一个模型,但如今已然迈向希望机器在general地了解人类语言之后,再去解各式各样地任务。一个常见地做法是:根据大量的没有标注的文本训练一个模型,使其可以“读懂”人类文字,通常将这一过程称为Pre-train;接下来,针对某个想要解决的特殊任务,可以搜集相对较少的任务特定的带有标注的资料对刚刚训练好的模型进行微调,从而实现让机器解各式各样的任务,该过程称为Fine-tune

以芝麻街角色命名的模型

ELMo(Embeddings from Language Model)
BERT(Bidiractional Encoder Representations from Transformers)
ERNIE(Enhanced Representation through Knowledge Integration)
Grover(Generating aRticles by Only Viewing mEtadata Records)
BERT & PALs(Projected Attention Layers)

What is pre-train model

Why Pre-train Models

GLUE Scores(反映了模型了解人类语言的能力)显示加入Pre-train Model后,在GLUE Benchmark Corpus上,机器的能力与人类已经不相上下了。

More Reference:https://arxiv.org/abs/1908.05620

之前的Pre-train Model

期望将每一个输入的token表示为一个embedding vector,用于表示该token的语义,意思相近的token拥有相近的embedding,embedding的某些维度应当可以看出与语义的关联性。

将token映射为embedding的做法包括:simply a table look-up(如Word2vec、Glove)、English word as token(如FastText,以英文字母作为输入,输出整个单词的向量)、将中文的字作为Image,通过字的偏旁部首学习字的语义……

以上模型均存在没有考虑token上下文的缺点,继而产生了Contextual Word Embedding的概念,ELMo、BERT都属于这一类。同样都是每一个token对应一个embedding,但contextual Word Embedding会在看完整个句子之后再输入句子中每个token特有的embedding。

Contextual Word Embedding

模型结构类似于Encoder,这样的模型通常都由多层构成,内部可以使用LSTM(ELMo)、Self-attention layers(BERT)、Tree-based model(编码语法信息,但这类方法尚未流行)。

Make model smaller

针对BERT发展而来的Smaller Model:Distill BERT、Tiny BERT、Mobile BERT、Q8BERT、ALBERT

How to make model smaller?:Network pruning、knowledge distillation、Parameter Quantization、Architecture Design

Excellent Reference:http://mitchgordon.me/machine/learning/2019/11/18/all-the-ways-to-compress-BERT.html

Network Architecture

大多新架构目标都是想让机器可以读更长的sequence(一篇文章甚至一整本书),例如:
Transformer-XL: Segment-Level Recurrence with State Reuse

还有一些架构期望可以减少self-attention所带来的运算量(n^2),例如:
Reformer、Longformer

How to fine-tune

在有了Pre-train Model之后,我们希望在上面叠一些Task-specific的部分,从而将这个完整的模型用于特定的NLP任务上。接下来的问题就是对Pre-Train Model进行适当修改,使其可以解决不同类型的NLP问题。

对于输入是multiple sentences的情况,如QA问题中的Query-Document,NLI问题中的Premise和Hypothesis,通常做法是在两个sentence中添加一个特殊token“”,用作两个语句之间的分割。

对于输出one class的情况,BERT中的做法是在输入中添加token“”,在pretrain时对于,需要在该位置输出与整个句子有关的embedding,继而将这个embedding输入到task specific model(可以是简单的Linear Transform,也可以是很复杂的变换模型)中进行分类。也有做法是不引入特殊token,而是将所有token的embedding作为输入进行分类。

对于输出是class for each token的情况,则将每个token对应的embedding输入Task Specific Model(可以是LSTM)中,为每一个token输出一个class。

对于输出需要copy from input的情况,如Extraction-based QA任务,输入Document和Query,输出两个非负整数s和e表示问题答案为Document中的第s个word到第e个word中的内容。BERT中的做法是分别使用两个向量表示s和e,依次与document中的每个token的embedding向量做dot product,最终经过softmax得到s和e的位置。

对于输出是General Sequence的情况,即如何将pre-train model用于Seq2seq model中,最直觉的做法是将pre-train model作为encoder,将Task Specific Model作为Decoder,这样做的缺点是Task Specific Model是没有经过Pre-Train的,因为用于Task Specific Model的带标注的数据没有很多,因此我们期望Task Specific越小越好,整个模型中的多数参数都是Pre-train过的。另一种可行做法是,在输入input sequence后,再输入一个特殊token“”,该token位置输出的embedding将被输入一个Task Specific Model中,得到output sequence的第一个词汇,接下来再将这个词汇丢到Pre-TrainModel中,循环往复,依次得到output sequence的所有词汇,直到输出“”,从而实现将Pre-train Model作为Decoder使用。

具体的Fine-tune过程有两种做法:第一种是将训练好的Pre-trained Model作为Feature Extractor,即所有参数将被固定,只对Task-specific Model进行Fine-tune;另一种做法是对Pre-trained Model和Task-specific Model同时进行Fine-tune。实验表明后者performance更佳。

然而,对Pre-trained Model和Task-specific Model同时Fine-tune可能会遇到以下问题:同一个Pre-trained Model经过不同任务下的fine-tune会变得不一样,每一个任务都需要保存一个新模型,这样的模型如今往往非常巨大,因此产生了Adaptor的概念。其主要思想在于对Pre-trained Model进行微调时,只调其中还的一部分,做法是在Pre-trained Model中加入一些layers,称为Adaptor,只有Adaptor部分会连同Task-Specific Model进行Fine-tune,从而大大减小了存储模型所需的空间。Adaptor的架构仍是一个值得研究的问题。另一种做法是考虑到Pre-trained Model中的不同层可能抽取特征的侧重有所不同,因此对不同层的输出做Weighted Sum,这里的权重则是下游特定任务所要学习的,加权求和后的结果输出到Task-Specific Model中,这样的做法称为Weighted Features

How to pre-train

Target:期望输出每个token的contextual embedding vector。

Pre-training by Translation

Context Vector(CoVe):将Pre-train Model视为Translation的Encoder,准备另一个Model作为Decoder,实现Language A到Language B的翻译。选择翻译任务用于Pre-train直观上便于获得每个token的representation,但该任务需要大量的pair data(Language A和Language B的语句对),这样的收集任务是比较困难的,因此我们期望基于唾手可得的没有标注的文字(Text without annotation)训练得到pre-train model。这样的方法之前称为Unsupervised Learning,但近年来更常被叫做Self-supervised Learning

Self-supervised Learning

:In self-supervised learning, the system learns to predict part of its input from other parts of its input.

Predict Next Token

Predict next Token任务是Self-supervised learning的经典做法之一,输入token ,经过pre-trained model得到该token的representation ,经过Linear Transform(也可以是更复杂的层)和softmax得到一个over token的probability distribution,训练目标是输出得到的probability distribution和target之间的cross entropy越小越好,这里的target就是 ,即期望token 的probability为1,而其它token的probability为0。

在设计Predict next token任务的model时,需要注意不能一次性将所有的token输入进模型,否则在预测时模型可能会直接将输入中当前token的下一token作为进行接下来的预测,这样的模型就无法学到需要的东西。

Predict next Token是早期的Unsupervised pre-train model,而Language Model(LM)要做的事情正是Predict next token,所以上述Model正是一个Language Model。早期一般采用LSTM作为模型架构进行pre-train,其中最著名的就是ELMo,类似的还有Universal Language Model FIne-tuning(ULMFiT)。如今很多模型倾向于使用Self-attention替代LSTM,例如GPT、GPT-2、Megatron、Turing NLG等等。但在使用self-attention时,需要注意控制attention的范围,因为self-attention会将整个sequence平行的读入,每一个位置都会attend到其它位置,而当前任务的需求是只需要attend到当前token位置来对下一位置的token进行预测,以此避免model在attention时看到未来token的答案。

Predict Next Token除了可以获得pre-train model继而进行fine-tune之外,因其作为一个Language Model,尤其适用于生成任务(do generation)。

Predict Next Token - Bidirectional

在predict next token任务中,包含了从到( and its left context)的信息。ELMo额外考虑了right context的信息。在ELMo中,会基于正向的LSTM由得到一个embedding去预测,基于逆向的LSTM由得到另一个embedding去预测,ELMo会将这两个embedding拼接起来作为的contextual representation,由此这个representation考虑了整个sequence蕴含的信息。

但ELMo存在的问题是,正反向编码的过程彼此独立,简单的拼接过程使得left context和right context并不存在任何交集,BERT针对这一问题进行了改善。

Masking Input

BERT会将输入中的部分token“盖住”,一种做法是将要盖住的token替换为一个特殊的token “”,另一种做法是替换为随机采样的token,此时pre-train model要做的就是根据被盖住位置输出的embedding预测被盖住的token是什么。BERT使用的Network架构为Transformer,其中的self-attention每一个位置是会attend到其它所有位置的,而不同于之前Predict next Token任务中需要加以限制,因为要预测的内容已经过mask处理,因此不必担心会看到答案。

BERT的想法和之前Word2Vec中的CBOW方法基本思想很相似,但CBOW可以看到的邻接token受限于固定的窗口长度,另外BERT采用了较复杂的模型,而CBOW只是经过简单到的Projection和Output两层操作,即简单的线性变换进行预测。

原始BERT中需要MASK的token是随机决定的,但随机决定的mask token可能无法学到特别long term的dependency,因此有人提出了新的mask方案。例如Whole Word Masking(WWM),即每次mask的是一个完整的词而非字或更小的单位级别。类似的还有短语级别的(phrase-level)和实体级别的(Entity-level,需要先做NER)的mask方案,这便是ERNIE采用的方案。还有一种MASK方案称为SpanBert,每次mask掉一定范围长度的token,不同的范围长度对应不同的mask机率。

SpanBert —— Span Boundary Objective(SBO)

该目标是根据mask span的左右相邻的两个token,给定一个要预测的mask span的相对位置,预测该位置的token(例如被mask了范围长度为4的tokens,预测这个范围内的第三个token)。设计这样的目标是期望一个span其左右两边的token embedding包含其内部整个span的信息,SBO会对coference类的任务有好处。

XLNet

XL指的是Transformer-XL,该架构可以跨segment获取信息,采用relative position embedding。XLNet强调原始BERT存在的一个问题是:假设给定句子“This is New York city”,原始BERT会将“New”和“York”两个token同时盖住,从而无法学习这两个token间的相互预测,即“New”和“York”会彼此独立的被预测出来,缺少这两个词之间的dependency(实际上如果是random sample,该问题应该没有那么严重)。从Language Model的角度来看,XLNet通过随机打乱sequence内部token的顺序解决一般LM中只获取left context信息的问题;从BERT的角度出发,XLNet并非根据整个sentence去预测被mask的内容,而是根据整个sentence随机决定的一部分以及被mask的部分的位置信息(不包含被mask的部分内容信息)去预测被MASK的内容。

BERT cannot talk?

对于传统的autoregressive model(从左到右生成句子的情况,不过近期已有一些non-autoaggressive的做法),BERT相较LM而言能力有所欠缺,即BERT缺乏generation的能力,或许不太适合作为seq2seq任务的pre-train model,对于这类任务,bert可能只能作为encoder,decoder部分并没有被pre-train到。为了基于self-supervised learning的方法实现整个seq2seq model的pretrain,首先输入一个word sequence进入encoder,decoder通过attention从encoder中获取信息,输出另一个word sequence,此时的目标是reconstruct the input,即输出的是原来的word sequence。此时就需要对输入部分进行corrupted操作,也就是一定程度的破坏。MASS(MAsked Sequence to Sequence pre-training)BART(Bidirectional and Auto-Regressive Transformers)就是针对训练可以pre-train的seq2seq model时可采用的corrupt操作展开研究。MASS的思想类似于原始BERT,random mask掉部分token,此时MASS只要求还原被mask的部分;BART除了mask之外,还尝试了delete、permutation、rotation、Text Infilling(随机插入不代表任何token的mask或以一个mask盖住多个token)等操作对input进行corrupt,实验结果表明permutation和rotation效果不佳,Text Infilling效果最佳。

UniLM可以同时作为ENcoder、Decoder和Seq2Seq,该模型同时进行Bidirectional LM(同BERT)、Left-to-Right LM(同GPT,此时内部的attention需要加以限制,以避免看到未来的token)、Seq2Seq LM(同BART和MASS,将输入分为两份部分,第一部分中的attention可以直接做self-attention,而第二个部分中的token只能看到left context)三种训练。

ELECTRA

上述pre-train的方法都是预测某些token,这样的预测需要的运算量、训练强度是很大的。ELECTRA(Efficiently Learning an Encoder that Classifies Tken Replacements Accurately)避开预测任务,只回答binary的问题。对于输入的token sequence,ELECTRA会将其中部分token置换成其它词汇,输出结果则是当前单词是否被置换。这样做的好处是:预测yes/no会比reconstruction要简单得多,同时每一个position在输出时都是需要的(而BERT只对被mask的部分进行预测)。该问题的难点在于如何进行恰当的置换,使其仅在语义上有所偏差,这里是使用了一个small BERT去预测将要替换的部分。

Sentence Level

上述pre-train都是给每个token一个embedding,接下来我们希望给整个input tokens sequence一个global embedding。可以采用Skip Thought的想法,输入一个sentence,经过encoder编码为一个embedding,decoder根据这个embedding对下一句进行预测,然而这种方法训练的运算量往往比较大。另一个进阶版本称为Quick Thought,该方法同ELECTRA一样尽量避开generation这一计算量较大的工作,将两个句子分别通过Encoder得到各自的embedding,如果两个句子是相邻的,我们就让它们的embedding距离越相近越好。

在原始BERT中,存在 token,我们正期望该位置输出的embedding代表整个input token sequence的信息,因此期望能有一个global task,由此BERT采用的是NSP(Next Sequence Prediction)任务,输入两个句子,用隔开,位置输出的embedding会经过一个Linear Classifier预测两个句子是否相接。但RoBERTa(Robustly optimized BERT approach)以及XLNET均提出NSP任务结果不尽如人意。另一种方法叫做SOP(Sentence order prediction),即输入两个相接的句子,模型会输出yes,而当将这两个句子调换顺序输入时,模型会输出No,该任务被用于ALBERT中。另一种方法structBERT,也称为Alice,其中结合使用了NSP和SOP的方法。

如何比较各种pre-train方法?

Google提出T5(Transfer Text-to-Text Transformer)对各种pre-train方案进行了比较试图得到一系列结论,其中用了一个名为C4(Colossal Clean Crawled Corpus)的语料库

More Model

Enhanced Language RepresentatioN with Informative Entities(ERNIE)希望在pre-train时加入external knowledge。即BERT + External Knowledge = ERNIE。

Audio BERT,语音版的BERT。

你可能感兴趣的:(【李宏毅课程笔记】BERT and its family - ELMo, BERT, GPT, XLNet, MASS, BART, UniLM, ELECTRA, and more)