2021李宏毅机器学习笔记--20 ELMO、BERT、GPT
摘要
机器是如何理解我们的文字的呢?或者说人类是怎么把文字输入电脑的呢?本文主要介绍三种技术ELMO、BERT、GPT。ELMO是一个RNN-based的语言模型,有些词可能有不同的意思,使用word embedding的方法,一个词只针对一种embedding,而ELMO会针对一个词不同的意思给出不同的embedding,其任务是学习句子中的下一个单词或者前一个单词是什么。BERT所做的事就是丢一个句子进去BERT,BERT会针对每个句子给出一个embedding。训练BERT有两种方法,一种是随机把一些单词变为Mask,让模型去猜测盖住的地方是什么单词,另一种是预训练任务NSP,即判断句子B是否是句子A的下文。ERNIE是BERT优化,是专门为中文设计的,中文中如果单纯的遮盖某一个字,很容易猜出来,所以ERNIE是遮盖中文中的一个词。GPT是一个硕大无朋的语言模型,GPT的主要作用就是给他一个词汇,它可以预测接下来的词汇。
一、背景介绍
最早的技术是1-of-N encoding,把每一个词汇表示成一个向量,每一个向量都只有一个地方为1,其他地方为0。但是这么做词汇之间的关联没有考虑,因为不同词之间的距离都是一样的。 所以,接下来有了word class的概念,举例说dog、cat和bird都是动物,它们应该是同类。但是动物之间也是有区别的,如dog和cat是哺乳类动物,和鸟类还是有些区别的。 后来有了更进阶的想法,称作word embedding,我们用一个向量来表示一个单词,相近的词汇距离较近,如cat和dog。 但是,有时候一个词可能有很多个不同的意思,比如下图的bank,前两个意思是银行,后两个意思是河堤。 即使一个单词有不同的意思,但使用传统的word embedding的方法,相同的单词都会对应同样的embedding。但我们希望针对不同意思的bank,可以给出不同的embedding表示。 根据上下文语境的不同,同一个单词bank我们希望能够得到不同的embedding,如果bank的意思是银行,我们期望它们之间的embedding能够相近,同时能够与河堤意思的bank相距较远。
基于这个思想,首先有了下面的ELMO。
二、ELMO
ELMO是Embeddings from Language Model的简称,它是一个RNN-based的语言模型,其任务是学习句子中的下一个单词或者前一个单词是什么。 它是一个双向的RNN网络,这样每一个单词都对应两个hidden state,进行拼接便可以得到单词的Embedding表示。当同一个单词上下文不一样,得到的embedding就不同。 当然,我们也可以搞更多层:
这么多层的RNN,内部每一层输出都是单词的一个表示,那我们取哪一层的输出来代表单词的embedding呢?ELMO的做法就是全都要: 在ELMO中,一个单词会得到多个embedding,对不同的embedding进行加权求和,可以得到最后的embedding用于下游任务。要说明一个这里的embedding个数,下图中只画了两层RNN输出的hidden state,其实输入到RNN的原始embedding也是需要的,所以你会看到说右下角的图片中,包含了三个embedding。 但不同的权重是基于下游任务学习出来的,上图中右下角给了5个不同的任务,其得到的embedding权重各不相同。
三、BERT
Bert是Bidirectional Encoder Representations from Transformers的缩写,中文意思就是来自于转换器的双向编码表示。Transformer中的Encoder就是Bert预训练的架构。李宏毅老师特别提示:如果是中文的话,可以把字作为单位,而不是词。
3.1、Training of BERT
只是Transformer中的Encoder,那Bert怎么训练呢?文献中给出了两种训练的方法,第一个称为Masked LM,做法是随机把一些单词变为Mask,让模型去猜测盖住的地方是什么单词。假设输入里面的第二个词汇是被盖住的,把其对应的embedding输入到一个多分类模型中,来预测被盖住的单词。
3.1.1、 方法一、Masked LM
由于BERT需要通过上下文信息,来预测中心词的信息,同时又不希望模型提前看见中心词的信息,因此提出了一种 Masked Language Model 的预训练方式,即随机从输入预料上 mask 掉一些单词,然后通过的上下文预测该单词,类似于一个完形填空任务。
在预训练任务中,15%的 Word Piece 会被mask(掩盖),这15%的 Word Piece(词条) 中,80%的时候会直接替换为 [Mask] ,10%的时候将其替换为其它任意单词,10%的时候会保留原始Token。
1、没有100%mask的原因 如果句子中的某个Token100%都会被mask掉,那么在fine-tuning的时候模型就会有一些没有见过的单词 2、加入10%随机token的原因 Transformer要保持对每个输入token的分布式表征,否则模型就会记住这个[mask]是token ’hairy‘ 另外编码器不知道哪些词需要预测的,哪些词是错误的,因此被迫需要学习每一个token的表示向量 3、另外,每个batchsize(批量大小)只有15%的单词被mask的原因,是因为性能开销的问题,双向编码器比单项编码器训练要更慢。
如果两个词填在同一个地方没有违和感那它就有类似的embedding。
3.1.2、 方法二、Next Sentence Prediction(NSP)
仅仅一个Masked LM 任务是不足以让 BERT 解决阅读理解等句子关系判断任务的,因此添加了额外的一个预训练任务,即 Next Sequence Prediction。
具体任务即为一个句子关系判断任务,即判断句子B是否是句子A的下文,如果是的话输出’IsNext‘,否则输出’NotNext‘。 训练数据的生成方式是从平行语料中随机抽取的连续两句话,其中50%保留抽取的两句话,它们符合IsNext关系,另外50%的第二句话是随机从预料中提取的,它们的关系是NotNext的。
先把两句话连起来,中间加一个[SEP]作为两个句子的分隔符。而在两个句子的开头,放一个[CLS]标志符,将其得到的embedding输入到二分类的模型,输出两个句子是不是接在一起的。
3.2、应用
3.2.1、classification
如果现在的任务是 classification,首先在输入句子的开头加一个代表分类的符号 [CLS],然后将该位置的 output,丢给 Linear Classifier,让其 predict 一个 class 即可。整个过程中 Linear Classifier(线性分类器) 的参数是需要从头开始学习的,而 BERT 中的参数微调(fine-tuning)就可以了。
3.2.2、Slot Filling槽填充(classification)
如果现在的任务是 Slot Filling,将句子中各个字对应位置的 output 分别送入不同的 Linear,预测出该字的标签。其实这本质上还是个分类问题,只不过是对每个字都要预测一个类别。
3.2.3、NLI(自然语言推理)
如果现在的任务是 NLI(自然语言推理)。即给定一个前提,然后给出一个假设,模型要判断出这个假设是 正确、错误还是不知道。这本质上是一个三分类的问题,和 Case 1 差不多,对 [CLS] 的 output 进行预测即可。
3.2.4、QA(问答)
如果现在的任务是 QA(问答),举例来说,如上图,将一篇文章,和一个问题(这里的例子比较简单,答案一定会出现在文章中)送入模型中,模型会输出两个数 s,e,这两个数表示,这个问题的答案,落在文章的第 s 个词到第 e 个词。具体流程我们可以看下面这幅图
首先将问题和文章通过 [SEP] 分隔,送入 BERT 之后,得到下图中黄色的输出。此时我们还要训练两个 vector,即下图中橙色和蓝色的向量。首先将橙色和所有的黄色向量进行 dot product,然后通过 softmax,看哪一个输出的值最大,例如下图中
d
2
d_2
d2? 对应的输出概率最大,那我们就认为 s=2。
同样地,我们用蓝色的向量和所有黄色向量进行 dot product,最终预测得
d
3
d_3
d3?的概率最大,因此 e=3。最终,答案就是 s=2,e=3
Bert一出来就开始在各项比赛中崭露头角,排行榜前几名就是用bert做的:
3.3、BERT优化–Enhanced Representation through Knowledge Integration(ERNIE)
ERNIE整个模型专门用于中文。 ERNIE是百度在2019年4月的时候,基于BERT模型,做的进一步的优化,在中文的NLP任务上得到了state-of-the-art的结果。它主要的改进是在mask的机制上做了改进,它的mask不是基本的word piece的mask,而是在pretrainning阶段增加了外部的知识,由三种level的mask组成,分别是basic-level masking(word piece词条)+ phrase level masking(短语WWM style) + entity level masking(实体)。在这个基础上,借助百度在中文的社区的强大能力,中文的ernie还是用了各种异质(Heterogeneous)的数据集。此外为了适应多轮的贴吧数据,所以ERNIE引入了DLM (Dialogue Language Model) task。 因为用BERT来做的时候,只猜单个字太简单,于是有了ERNIE来猜整个词的。
竖向是一个个NLP任务,然后横着的是通过BERT和对应任务进行联动训练以后,把BERT的24层每个单独抽取出来,进行加权相加(和ELMO一样的操作)得到的结果,可以看到各个NLP任务对应的BERT层有哪些最敏感,例如最上面的POS(词性分析)第11到13层的向量贡献最大。
四、GPT
4.1、GPT
GPT是Generative Pre-Training 的简称,从名字上就可以看出其是一个生成式的预训练模型,即与ELMo类似,是一个自回归语言模型。与ELMo不同的是,其采用多层Transformer Decoder作为特征抽取器,多项研究也表明,Transformer的特征抽取能力是强于LSTM的。它的思想也很简单,使用单向 Transformer 学习一个语言模型,对句子进行无监督的 Embedding,然后根据具体任务对 Transformer 的参数进行微调。
1、由于GPT仍然是一个生成式的语言模型,因此需要采用Mask Multi-Head Attention的方式来避免预测当前词的时候会看见之后的词,因此将其称为单向Transformer,这也是首次将Transformer应用于预训练模型,预测的方式就是将position-wise的前向反馈网络的输出直接送入分类器进行预测 2、此外整个GPT的训练包括预训练和微调两个部分,或者说,对于具体的下游任务,其模型结构也必须采用与预训练相同的结构,区别仅在于数据需要进行不同的处理
GPT2 与 GPT 的大致模型框架和预训练目标是一致的,而区别主要在于以下几个方面: 1、其使用了更大的模型 2、使用了数量更大、质量更高、涵盖范围更广的预训练数据 3、采用了无监督多任务联合训练的方式,即对于输入样本,给予一个该样本所属的类别作为引导字符串,这使得该模型能够同时对多项任务进行联合训练,并增强模型的泛化能力
4.2、过程
GPT的作用是输入一个句子中的上一个词,我们希望模型可以得到句子中的下一个词。如下图所示,输入“潮水”,希望可以预测出“退了”这个词。 在”退了“之后希望可以输出“就”这个词。 由于GPT-2的模型非常巨大,它在很多任务上都达到了惊人的结果,甚至可以做到zero-shot learning(简单来说就是模型的迁移能力非常好),如阅读理解任务,不需要任何阅读理解的训练集,就可以得到很好的结果。
GPT-2可以自己进行写作,写得还是不错的!
总结
本文主要介绍了三种技术可以让机器看懂人类的文字。有时一个单词可能会有多个不同的意思,我们希望模型针对每一种意思都有一个embedding,这就是ELMO。BERT所做的事就是丢一个句子进去BERT,BERT会针对每个句子给出一个embedding,BERT可以用于句子的classification,还可以Slot Filling,将句子中的各个子进行分类,也可以进行 NLI(自然语言推理),当给出一个前提,再给出一个假设,模型就可以判断这个假设是正确、错误还是不知道,BERT也可以进行问答,给一篇文章以及一个问题,模型可以给出答案所在的范围。BERT训练时所使用的方法是掩盖一些单词,但是当语言为中文时,掩盖某一个字很容易猜出来,所以针对中文有一个另外的模型就是ERNIE。GPT相较于其他的模型而言,一个最重要的特征就是他是一个硕大无朋的语言模型,它的作用是输入一个句子中的上一个词,我们希望模型可以得到句子中的下一个词。而进阶版的GPT-2更为巨大,他可以自己写作,并且它可以在不进行任何训练的情况下就可以得到很好的结果。
|