天天看点

BERT学习笔记(4)——小白版ELMo and BERT1 ELMo2 BERT3 GPT4 参考

由于我没有读过原论文,该博客写的内容几乎来自于李宏毅老师的BERT课程,链接放在的最后。该博客用于梳理笔记,以便后面复习的时候使用。如果后面读了相关论文或者有了新的理解会进行更改补充。

由于是小白版本的内容,所以不会涉及到任何公式,仅用于理解该模型的作用。

目录

  • 1 ELMo
  • 2 BERT
    • 2.1 Why Encoder?
    • 2.2 BERT如何做pre-train
      • 2.2.1 Masked LM
      • 2.2.2 Next Sentence Prediction
    • 2.3 BERT的下游任务
      • 2.3.1 文本分类任务
      • 2.3.2 token分类任务
      • 2.3.3 两句话分类任务
      • 2.3.4 其他任务
  • 3 GPT
  • 4 参考

1 ELMo

上文中介绍了

contextualized word embedding

,简单来说就是同样的词在不同的语境中可能会有不同的含义。之前的pre-train model并没有考虑这种情况,而是一个词一个embedding,就导致了在不同的语境环境中表现能力有所欠缺。而

contextualized word embedding

就可以很好地避免这个问题,给每个token在不同语境中一个embedding,从而使得表达相同意思的时候有相近的embedding。链接如下:BERT学习笔记(3)——self-supervised learning and pre-train model。

ELMo(Embeddings from Language Model)就是

contextualized word embedding

的pre-train model。ELMo是一个

RNN based model

(实际上是使用的LSTM,但是LSTM是RNN的变体嘛),其思想就是将一个词语前后的上下文信息编码到该词语的词向量中。其编码的方式就是使用上下文预测下一个出现的词语。由于单个LSTM只能读取目标词语前面或者后面的信息,所以需要双向的LSTM才能够实现读取到目标词语前后的信息:

BERT学习笔记(4)——小白版ELMo and BERT1 ELMo2 BERT3 GPT4 参考

对于我们需要预测的

退了

而言,正向的RNN读取到

退了

,这时需要预测

退了

通过RNN后会吐出一个向量,这个向量就是正向的LSTM输出的

退了

的向量。反向的LSTM读取到

退了

,这时需要预测

潮水

退了

通过RNN后会吐出一个向量,这个向量就是反向的LSTM输出的

退了

的向量。接着将正向与反向的

退了

的向量拼接在一起,就得到了

退了

的embedding。

但是由于ELMo有很多层双向LSTM,每一层都会输出一个拼接的

退了

的向量,所以需要考虑如何取舍这些向量。

BERT学习笔记(4)——小白版ELMo and BERT1 ELMo2 BERT3 GPT4 参考

在ELMo中,对这群向量的做法是,将每一层输出的向量乘上不同的权重后再加起来作为这个词的embedding。

BERT学习笔记(4)——小白版ELMo and BERT1 ELMo2 BERT3 GPT4 参考

这个权重是与下游任务放到一起训练的。右图是论文中在不同下游任务上对这个权重的大小的一个可视化。也就体现了在不同的下游任务中,不同层输出的权重是不同的。

但是ELMo有个很大的问题,就是尽管使用了双向LSTM,能够读到目标词语的上文与下文,但是针对单向LSTM是无法读取到下一部分的信息的(就是正向LSTM在预测目标词语时无法读取到后文,反向LSTM在预测目标词语时读取不到上文)。而这个问题BERT就解决了。

2 BERT

BERT (Bidirectional Encoder Representations from Transformers)

就解决了ELMo中单个模块无法通读全文的问题。

BERT是一个自监督的模型,无需任何标注数据就可以自己学习。其实质就是一个Transformer的Encoder,输入一个sequence,输出一堆embeddings。

BERT学习笔记(4)——小白版ELMo and BERT1 ELMo2 BERT3 GPT4 参考

在处理中文的时候,大家习惯性的操作可能是jieba分词等工具先将一句话给分词后再输入到model中,但是这样做有个问题就是中文中

词语

的数量是很多的,就会导致向量空间很大。所以输入

的话可以有效缓解这个问题。

2.1 Why Encoder?

那么再说到为何要使用Encoder,由于刚刚也提到说ELMo的单个模块无法通读全文,但是

self-attention

却可以。在

self-attention

中,token与token之间的位置差异就被抹除了(在不考虑positional encoding的情况下),而且对于模型而言,可以一次性的读取到一个sequence的内容。而Encoder中正好就用的是

Multi-Head attention

,就解决了这个问题。

2.2 BERT如何做pre-train

接着就是BERT是如何做预训练。由于BERT是个自监督模型,那么肯定需要针对输入的数据生成训练数据与标签。其任务与ELMo差不多,只不过ELMo是通过上文预测下一个文本,而BERT则有两种任务。

2.2.1 Masked LM

BERT预训练的第一个任务叫

Masked LM

,就是输入一堆文本,将其中部分词汇给抠掉(文章中是15%),根据上下文来预测这个抠掉的词是啥。这个抠的方式有很多,比如直接替换为一个

[MASK]

标签,或者换成另外一个错误的字,再或者不做任何操作。

Google并没有在每次都mask掉这些单词,而是在确定要Mask掉的单词之后,80%的时候会直接替换为[Mask],10%的时候将其替换为其它任意单词,10%的时候会保留原始Token[1]。

  • 80%:my dog is hairy -> my dog is [mask]
  • 10%:my dog is hairy -> my dog is apple
  • 10%:my dog is hairy -> my dog is hairy
BERT学习笔记(4)——小白版ELMo and BERT1 ELMo2 BERT3 GPT4 参考

经过BERT后,需要预测的token会吐出一个vector,将其输入到一个线性分类器里面,预测这个位置出现的token的概率。再将这个概率与之前掩盖的时候的ground truth作交叉熵得出损失。这里需要注意两个点:

  1. 由于分类器是线性的,所以需要BERT吐出很好的representation;
  2. 为何是个多分类器?这是因为输出的结果是整个词表中出现的词的概率,经过softmax后提取出其中概率值最大的那个数,所以是个多分类任务。

其实在这方面,BERT和

CBOW

挺像的,只不过一个用的是

self-attention

看的整句话,而CBOW只有一个滑动窗口。这毕竟也受限于当年的计算力不够。

2.2.2 Next Sentence Prediction

BERT除了

Masked LM

以外,还在预训练的时候有另外一个操作:

Next Sentence Prediction

(两者是同步进行的,虽然后面论文证明了

Next Sentence Prediction

是没啥效果的)。其核心就是将两句话拼接在一起,中间用一个

[SEP]

标签分隔,句首再用一个

[CLS]

标签做分类。由于训练语料中可以明确知道两句话是不是上下句,所以可以很容易得出Ground Truth。而BERT训练的就是判断两句话是否是连贯的,如果连贯,那么

[CLS]

在经过一个线性二分类器后,输出

YES

,否则输出

NO

BERT学习笔记(4)——小白版ELMo and BERT1 ELMo2 BERT3 GPT4 参考

2.3 BERT的下游任务

2.3.1 文本分类任务

这类任务主要就是给输入的文本一整个标签,比如情感分析是给整个输入一个积极、消极、中性等标签。

其使用方式就是在文本前加入一个

[CLS]

标签,这个标签经过BERT后的输出放入到一个线性的分类器中,输出类别。这个线性分类器是随机初始化的,需要进行训练,而训练过程中可以对BERT的参数进行微调。

BERT学习笔记(4)——小白版ELMo and BERT1 ELMo2 BERT3 GPT4 参考

2.3.2 token分类任务

token分类任务和之前的任务类似,只是说之前的文档分类只需要对

[CLS]

标签做分类,而token分类是需要对每一个token做分类。

BERT学习笔记(4)——小白版ELMo and BERT1 ELMo2 BERT3 GPT4 参考

2.3.3 两句话分类任务

这个任务主要就是将两句话放在一起,对两句话做一个分类任务。就比如NLI任务,给定前提,给定假设,判断假设是否正确。其和第一个任务类似,只不过是两句话而已。

BERT学习笔记(4)——小白版ELMo and BERT1 ELMo2 BERT3 GPT4 参考

2.3.4 其他任务

由于其他任务不是我的研究方向,所以这里不多赘述,如果有兴趣可以看下面的链接。

3 GPT

GPT (Generative Pre-Training)

这里顺带提一句,为什么说顺带,主要是因为这东西毕竟太庞大了,也不是我们这种穷人用得起的,大概了解下就好了……

BERT是Encoder,而GPT则是Decoder,其任务就是输入上文,预测下文。其Decoder就是采用的

Masked Multi-Head Self-attention

,输入的时候是看不到后文的。

BERT学习笔记(4)——小白版ELMo and BERT1 ELMo2 BERT3 GPT4 参考

4 参考

[1] 大师兄. 词向量之BERT[EB/OL]. (2021-04-09)[2021-09-01]. https://zhuanlan.zhihu.com/p/48612853

[2] 越前小龙马. 李宏毅-BERT and its family - ELMo, BERT, GPT, XLNet, MASS, BART, UniLM, and more[EB/OL]. (2020-05-07)[2021-09-01]. https://www.bilibili.com/video/BV1eV411d7Kp?p=1

[3] zxx88880. 台大教授 李宏毅 bert[EB/OL]. (2019-07-05)[2021-09-01]. https://www.bilibili.com/video/BV1C4411A78Z?from=search&seid=12011319225852042827

[4] 爱学习的凉饭爷. 李宏毅机器学习2021课程 《自监督学习》合集 从芝麻街开始的故事[EB/OL]. (2021-04-17)[2021-09-01]. https://www.bilibili.com/video/BV1Gf4y1p7Yo?p=1

继续阅读