如何讲解BERT

自从Google发出BERT paper 并且开源BERT 代码后, hugging face 接着发出pytorch 版本。
对于pytorch 比较熟悉,并且bert的预训练词向量太强大,于是做项目总是用BERT。

但是面试时,却讲不好 BERT的细节。本文就是作为自己的一个练习,如果讲解BERT, BERT 里面的关键点如何跟面试官讲。

  1. 预训练词向量模型
  2. 基于transformer的双向编码器
  3. 构建模型时对文本的处理: positional embedding + segment embedding + token embedding
  4. BERT的预训练任务(MLMs, NSP)

第一点: BERT 预训练词向量模型

首先,BERT是一个预训练模型,预训练的词向量可用于下游微调任务。
对于预训练词向量,现在有很多这样的模型(后BERT 时代,基于BERT 进行改进的,XLNet, MASS, UNILM, GPT/GPT-2等),在BERT 之前的也有(如 大型的Elmo, 还有最早的word2vec 和 GolVe).

为何BERT 出现改变NLP?

"BERT代表Transformers的双向编码器。它被设计为通过对左右的上下文的联合来预训练未标记文本得到深层的双向表示。因此,只需一个额外的输出层,就可以对预训练的BERT模型进行微调,从而为各种NLP任务创建SOTA结果。"

  1. BERT是基于Transformer架构的。

  2. BERT是在大量未标记文本的预训练,包括整个Wikipedia(有25亿个词!)和图书语料库(有8亿个单词)。

    这个预训练步骤是BERT成功背后的一半。这是因为当我们在大型文本语料库上训练模型时,我们的模型开始获得对语言工作原理的更深入和深入的了解。这种知识几乎可用于所有NLP任务。

  3. BERT是"深度双向"模型。双向意味着BERT在训练阶段从目标词的左右两侧上下文来学习信息。
    模型的双向性对于真正理解语言的意义很重要

  4. BERT最令人印象深刻的方面。我们可以通过仅添加几个其他输出层来微调它,以创建用于各种NLP任务的最新模型。

Word2vec和Glove

通过在大型未标记文本数据上进行预训练模型来学习语言表示的要求始于诸如Word2Vec和GloVe之类的词嵌入。这些嵌入改变了我们执行NLP任务的方式。现在,我们有了嵌入,可以捕获单词之间的上下文关系.
word2vec是一个非常浅层的词嵌入(输入是One-Hot Vector,Hidden Layer没有激活函数,也就是线性的单元。Output Layer维度跟Input Layer的维度一样,用的是Softmax回归。 这个模型是如何定义数据的输入和输出呢?一般分为CBOW(Continuous Bag-of-Words 与Skip-Gram两种模型。CBOW模型的训练输入是某一个特征词的上下文相关的词对应的词向量,而输出就是这特定的一个词的词向量。 Skip-Gram模型和CBOW的思路是反着来的,即输入是特定的一个词的词向量,而输出是特定词对应的上下文词向量。CBOW对小型数据库比较合适,而Skip-Gram在大型语料中表现更好)

这些嵌入的一个限制是使用非常浅的语言模型。这意味着他们能够获取的信息的数量是有限的,这促使他们使用更深入、更复杂的语言模型(LSTMs和GRUs层)。

另一个关键的限制是,这些模型没有考虑单词的上下文。让我们以“apple”为例。同一个单词在不同的上下文中有不同的意思。然而,像Word2Vec这样的嵌入在多个不同的上下文中为“apple”提供相同的词嵌入。这是导致模型不准确的一个因素。

所有单词在word2ve词嵌入中,只有一个向量表示,所以无法解决一词多意的问题。 要解决一词多意,就要结合上下文,所以出现了Elmo,结合上下文的预训练模型。

ELMo 和 ULMFiT

Elmo是NLP社区对一词多义问题的回应。相同的词在不同的语境中有不同的含义。 从训练浅层前馈什么网络(word2vec),逐步过渡到使用复杂双向LSTM体系结构的层来训练词嵌入。这意味着同一个单词可以根据它所在的上下文有多个Elmo嵌入。
ULMFiT 则更进一步。这个框架可以训练语言模型,这些模型可以进微调,从而在各种文档分类任务中,即使 使用更少的数据(少于100个示例)也可以提供更出色的结果。可以肯定的说ULMFiT破解了NLP 迁移学习的密码。
NLP迁移学习的黄金法则: 预训练+微调。
ULMFIT之后的大多数NLP的突破调整了上述等式的组成部分,并获得了最先进的基准。

在这里插入图片描述

OpenAI 的GPT

OpenAI的GPT扩展了ULMFiT和ELMo引入的预训练和微调方法。GPT本质上用基于转换的体系结构取代了基于lstm的语言建模体系结构。
GPT 的模型可以微调到文档分类以外的多个NLP任务, 如常识推理,语义相似性和阅读理解。

GPT 还强调了Transformer框架的重要性,它具有简单的体系结构并且比基于LSTM 的模型训练的更快。还能通过使用注意力机制来学习数据中的复杂模式。

OpenAI的GPT通过实现多个最先进的技术,验证了Transformer架构的健壮性和有用性。

这就是Transformer如何启发了BERT以及接下来在NLP领域的所有突破。

第二点: BERT构架在Transformer之上

在浅层词嵌入(word2vec 和glove)之后, 深度语言模型ElMo ULMFit 通过深度神经网络挖掘上下文关系得到含有上下文的词嵌入预训练模型。再往后就是OpenAI 基于Elmo的拓展,将Transformer 替代LSTM 证明了transformer的争议性。得到预训练词向量,只要经过目标任务的微调即可。

从此语言模型的任务就变成了一个2步过程:
1. 在大型无标签文本语料库(无监督或半监督)上训练语言模型
2. 将这个大型模型微调到特定的NLP任务,以利用跟这个大型知识库训练模型(监督)

目前BERT 2个版本 BERT base: 12层transformer, 12个attention heads, 和1.1亿个参数。 BERT large: 24层transformer,16个attention heads 和3.4亿的参数。

为了和GPT比较, BERT base与 GPT模型大小一样。 所有的这些transformer层都是只有Transformer的编码器。

Transformer 里面的几个关键点: self-attention 机制 如何进行特征提取?

请参考我另外一个Transformer提取的文章。

第三点: BERT对文本编码处理(token embedding + positional embedding + segment embedding)

在这里插入图片描述
BERT 添加了一组特定的规则来表示模型的输入文本,其中许多创造性的设计选择,目的是使模型更好。
每个输入的嵌入式3个嵌入的组合:

  1. 位置嵌入(positional embedding):BERT 学习并使用位置嵌入来表示句子中单词的位置。这些是为了克服Transformer的限制而添加的。 Transformer与RNN 不同,它不能捕获“序列”或者“顺序”信息。
  2. 段嵌入(segment embedding): BERT 还可以将句子对 作为任务的输入(可用于问答),这就是为什么它学习第一和第二句话的独特嵌入,以帮助模型区分它们。(第一句话0, 第二句话标记为1)
  3. 目标词嵌入(token embedding):这些是从wordpiece 词汇表中对特定词汇学习到的嵌入。

对于给定的目标词,其输入表示是通过对相应的目标词、段和位置的嵌入进行求和来构造的。
这种综合的嵌入模型,使得BERT更加强大,不需要对模型的体系结构有任何更改就可以用它进行多任务训练。

第四点: BERT 的预训练任务(masked LM 和 Next sentence prediction)

BERT 接受两个NLP 任务:

  • Masked Language model (遮蔽语言建模)
  • next sentence prediciton (下一句预测)

1. Masked Language Model (遮蔽的语言建模)–双向性

BERT 被设计为一个深度双向模型,网络有效地从第一层本身到最后一层来捕获目标词的左右上下文信息。

传统上,我们要么训练语言模型预测句子中的下一个单词(GPT中使用的从右到左的上下文),要么训练语言模型预测从左到右的上下文,这使得我们的模型容易由于信息丢失而产生错误。
Elmo 试图通过从左到右 和 从右到左的上下文中训练两个LSTM 语言模型并对其进行浅层级连接来解决此问题。即使它在现有技术上有很大改进,但是还是不够。

(我们相信深层双向模型比从左到右或从右到左模型的浅层级链接更严格更强大- BERT)

这个就是BERT 在GPT 和Elmo 之间的改进

  • Elmo:从左到右多层LSTM + 从右到左多层LSTM + 最后浅层连接得到词向量表示 (不算是完全意义上的双向,因为只在最后做了一个连接)
  • GPT:从左向右 单向Transformer 得到词向量表示(单向的transformer)
  • BERT: 双向 Transformer 得到词向量表示 (真正的双向的 transformer)
    在这里插入图片描述

BERT是双向的,GPT是单向的(信息仅从左向右流动),而ELMO是浅双向的

关于屏蔽语言模型:
假如我们有一句话,“我喜欢阅读关于分析数据科学的博客”,我们想要训练一个双向的语言模型,与其试图预测序列中的下一个单词,还不如构建一个模型,从序列本身预测缺失的单词。

我们把 “分析”换成 “[MASK]”,这是表示被屏蔽的单词, 以这种方式进行训练,使得它能够预测 “分析” 这个词语,所以句子变为 “我喜欢阅读关于[MASK]数据科学的博客”。
这是遮蔽语言模型的关键所在,BERT 还有一些细节:

  • 为了防止模型过于关注一个特定的位置或被掩盖的标记,研究人员随机掩盖了15%的单词
  • 掩码字并不是总是被[MASK]替换,因为[MASK] 在调优期间不会出现
  • 因此,BERT 里面采用以下方法;
    80%的情况,单词被替换成[MASK]
    10%的情况,这些单词被随机替换
    剩下10%单词保持不变。

BERT 的 MASK缺点:

  1. BERT是对word piece进行mask的,这样如果一个词是 'prediction’对应的word piece是‘pre#’ ‘#dic#’ ‘#tion’ ,如果中间的被[MASK],那么根据前后很容易 预测出 中的单词, 所以基于word piece的mask 使得预测任务变得简单。 这个在后bert时代模型里面有改进(XLNet 等 whole word mask机制)
  2. 同一个句子里面有15%被mask,这样预测的时候 相当于默认 这么被mask的词之间是相互独立的,因为在预测 maskA的时候, maskB是不知道的,但是实际上并不是独立的,比如 前面mask一个单词‘娱乐’, 后面mask一个单词‘唱歌’并不独立,但是如果mask 之后,则认为2者互相独立。(这个好像影响不大)

2. Next sentence prediction (下一句预测)

掩蔽语言模型(MLMs)学习理解单词之间的关系。此外,BERT还接受了下一个句子预测任务的训练,这些任务需要理解句子之间的关系。

句子之间关系的 任务 比如:问答系统。

任务很简单。给定两个句子——A和B, B是语料库中A后面的下一个句子,还是一个随机的句子?

由于它是一个二分类任务,因此可以通过将任何语料库分成句子对来轻松生成数据。就像mlm一样,作者在这里也添加了一些注意事项。让我们举个例子:

假设我们有一个包含100,000个句子的文本数据集。因此,将有50,000个训练例子或句子对作为训练数据。

  • 对于50%的对来说,第二个句子实际上是第一个句子的下一个句子
  • 对于剩下的50%,第二句是语料库中的一个随机句子
  • 第一种情况的标签是“IsNext”,而第二种情况的标签是“NotNext”

这就是为什么BERT能够成为一个真正的任务不可知的模型。它结合了掩蔽语言模型(MLM)和下一个句子预测(NSP)的预训练任务。

发布了28 篇原创文章 · 获赞 5 · 访问量 4330

猜你喜欢

转载自blog.csdn.net/m0_37531129/article/details/103434346
今日推荐