赞
踩
由于我没有读过原论文,该博客写的内容几乎来自于李宏毅老师的BERT课程,链接放在的最后。该博客用于梳理笔记,以便后面复习的时候使用。如果后面读了相关论文或者有了新的理解会进行更改补充。
由于是小白版本的内容,所以不会涉及到任何公式,仅用于理解该模型的作用。
上文中介绍了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才能够实现读取到目标词语前后的信息:
对于我们需要预测的 退了
而言,正向的RNN读取到 退了
,这时需要预测 就
,退了
通过RNN后会吐出一个向量,这个向量就是正向的LSTM输出的 退了
的向量。反向的LSTM读取到 退了
,这时需要预测 潮水
,退了
通过RNN后会吐出一个向量,这个向量就是反向的LSTM输出的 退了
的向量。接着将正向与反向的 退了
的向量拼接在一起,就得到了 退了
的embedding。
但是由于ELMo有很多层双向LSTM,每一层都会输出一个拼接的 退了
的向量,所以需要考虑如何取舍这些向量。
在ELMo中,对这群向量的做法是,将每一层输出的向量乘上不同的权重后再加起来作为这个词的embedding。
这个权重是与下游任务放到一起训练的。右图是论文中在不同下游任务上对这个权重的大小的一个可视化。也就体现了在不同的下游任务中,不同层输出的权重是不同的。
但是ELMo有个很大的问题,就是尽管使用了双向LSTM,能够读到目标词语的上文与下文,但是针对单向LSTM是无法读取到下一部分的信息的(就是正向LSTM在预测目标词语时无法读取到后文,反向LSTM在预测目标词语时读取不到上文)。而这个问题BERT就解决了。
BERT (Bidirectional Encoder Representations from Transformers)
就解决了ELMo中单个模块无法通读全文的问题。
BERT是一个自监督的模型,无需任何标注数据就可以自己学习。其实质就是一个Transformer的Encoder,输入一个sequence,输出一堆embeddings。
在处理中文的时候,大家习惯性的操作可能是jieba分词等工具先将一句话给分词后再输入到model中,但是这样做有个问题就是中文中词语
的数量是很多的,就会导致向量空间很大。所以输入字
的话可以有效缓解这个问题。
那么再说到为何要使用Encoder,由于刚刚也提到说ELMo的单个模块无法通读全文,但是self-attention
却可以。在self-attention
中,token与token之间的位置差异就被抹除了(在不考虑positional encoding的情况下),而且对于模型而言,可以一次性的读取到一个sequence的内容。而Encoder中正好就用的是Multi-Head attention
,就解决了这个问题。
接着就是BERT是如何做预训练。由于BERT是个自监督模型,那么肯定需要针对输入的数据生成训练数据与标签。其任务与ELMo差不多,只不过ELMo是通过上文预测下一个文本,而BERT则有两种任务。
BERT预训练的第一个任务叫Masked LM
,就是输入一堆文本,将其中部分词汇给抠掉(文章中是15%),根据上下文来预测这个抠掉的词是啥。这个抠的方式有很多,比如直接替换为一个[MASK]
标签,或者换成另外一个错误的字,再或者不做任何操作。
Google并没有在每次都mask掉这些单词,而是在确定要Mask掉的单词之后,80%的时候会直接替换为[Mask],10%的时候将其替换为其它任意单词,10%的时候会保留原始Token[1]。
经过BERT后,需要预测的token会吐出一个vector,将其输入到一个线性分类器里面,预测这个位置出现的token的概率。再将这个概率与之前掩盖的时候的ground truth作交叉熵得出损失。这里需要注意两个点:
其实在这方面,BERT和CBOW
挺像的,只不过一个用的是self-attention
看的整句话,而CBOW只有一个滑动窗口。这毕竟也受限于当年的计算力不够。
BERT除了Masked LM
以外,还在预训练的时候有另外一个操作:Next Sentence Prediction
(两者是同步进行的,虽然后面论文证明了Next Sentence Prediction
是没啥效果的)。其核心就是将两句话拼接在一起,中间用一个[SEP]
标签分隔,句首再用一个[CLS]
标签做分类。由于训练语料中可以明确知道两句话是不是上下句,所以可以很容易得出Ground Truth。而BERT训练的就是判断两句话是否是连贯的,如果连贯,那么[CLS]
在经过一个线性二分类器后,输出YES
,否则输出NO
。
这类任务主要就是给输入的文本一整个标签,比如情感分析是给整个输入一个积极、消极、中性等标签。
其使用方式就是在文本前加入一个[CLS]
标签,这个标签经过BERT后的输出放入到一个线性的分类器中,输出类别。这个线性分类器是随机初始化的,需要进行训练,而训练过程中可以对BERT的参数进行微调。
token分类任务和之前的任务类似,只是说之前的文档分类只需要对[CLS]
标签做分类,而token分类是需要对每一个token做分类。
这个任务主要就是将两句话放在一起,对两句话做一个分类任务。就比如NLI任务,给定前提,给定假设,判断假设是否正确。其和第一个任务类似,只不过是两句话而已。
由于其他任务不是我的研究方向,所以这里不多赘述,如果有兴趣可以看下面的链接。
GPT (Generative Pre-Training)
这里顺带提一句,为什么说顺带,主要是因为这东西毕竟太庞大了,也不是我们这种穷人用得起的,大概了解下就好了……
BERT是Encoder,而GPT则是Decoder,其任务就是输入上文,预测下文。其Decoder就是采用的Masked Multi-Head Self-attention
,输入的时候是看不到后文的。
[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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。