BERT学习笔记(4)——小白版ELMo and BERT

由于我没有读过原论文,该博客写的内容几乎来自于李宏毅老师的BERT课程,链接放在的最后。该博客用于梳理笔记,以便后面复习的时候使用。如果后面读了相关论文或者有了新的理解会进行更改补充。
由于是小白版本的内容,所以不会涉及到任何公式,仅用于理解该模型的作用。

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才能够实现读取到目标词语前后的信息:
ELMo_1

对于我们需要预测的 退了 而言,正向的RNN读取到 退了,这时需要预测 退了 通过RNN后会吐出一个向量,这个向量就是正向的LSTM输出的 退了 的向量。反向的LSTM读取到 退了,这时需要预测 潮水退了 通过RNN后会吐出一个向量,这个向量就是反向的LSTM输出的 退了 的向量。接着将正向与反向的 退了 的向量拼接在一起,就得到了 退了 的embedding。

但是由于ELMo有很多层双向LSTM,每一层都会输出一个拼接的 退了 的向量,所以需要考虑如何取舍这些向量。
ELMo_2
在ELMo中,对这群向量的做法是,将每一层输出的向量乘上不同的权重后再加起来作为这个词的embedding。
ELMo_3
这个权重是与下游任务放到一起训练的。右图是论文中在不同下游任务上对这个权重的大小的一个可视化。也就体现了在不同的下游任务中,不同层输出的权重是不同的。

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

2 BERT

BERT (Bidirectional Encoder Representations from Transformers)就解决了ELMo中单个模块无法通读全文的问题。

BERT是一个自监督的模型,无需任何标注数据就可以自己学习。其实质就是一个Transformer的Encoder,输入一个sequence,输出一堆embeddings。
BERT_1
在处理中文的时候,大家习惯性的操作可能是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

Masked LM
经过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
Next Sentence Prediction

2.3 BERT的下游任务

2.3.1 文本分类任务

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

其使用方式就是在文本前加入一个[CLS]标签,这个标签经过BERT后的输出放入到一个线性的分类器中,输出类别。这个线性分类器是随机初始化的,需要进行训练,而训练过程中可以对BERT的参数进行微调。
How to use BERT_1

2.3.2 token分类任务

token分类任务和之前的任务类似,只是说之前的文档分类只需要对[CLS]标签做分类,而token分类是需要对每一个token做分类。
How to use BERT_2

2.3.3 两句话分类任务

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

2.3.4 其他任务

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

3 GPT

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

BERT是Encoder,而GPT则是Decoder,其任务就是输入上文,预测下文。其Decoder就是采用的Masked Multi-Head Self-attention,输入的时候是看不到后文的。
GPT

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值