Bert原理介绍

一.Bert基本原理介绍

背景
  基于语言模型的预训练(pre-training)已经被证明可以有效提升各种 NLP 任务的表现。通常有两种策略可以运用到预训练模型得到的结果上:基于特征(feature-based)和微调(fine-tuning),基于特征的策略使用任务特定的架构,将预训练的表示作为额外的特征,其代表为 ELMo;基于微调的策略使用最少的任务特定参数,通过简单的微调预训练参数来训练下游任务,其代表 OpenAI GPT。

  之前的研究的局限性在于,其在预训练时使用的目标函数均基于单向语言模型,没有同时考虑到双向的上下文信息。BERT 模型旨在解决这一局限性,通过提出一种新的预训练目标:masked language model(MLM)。简单来说,MLM 随机地从输入中遮蔽一些词语,然后训练目标是基于被遮蔽词语的双侧上下文来预测该词语在词典中的 id。此外,BERT 模型还引入了一个 next sentence prediction 任务,来预训练文本对的联合表示。

  下图给出了 BERT、ELMo 和 OpenAI GPT 三者之间的结构比较。只有 BERT 真正同时使用了左右两侧上下文的信息。
在这里插入图片描述

1.1 Bert基本介绍

接下来我们将从what,how,wher等三个方面来介绍bert
Bert是什么呢?(what)
BERT是Pre-training of Deep Bidredirectional Encoder Representations from Transfomers的缩写,其中每一个单词都表示了BERT的特征:
Pre-training说明BERT是一个预训练模型,通过前期的大量语料的无监督训练,为下游任务学习大量的先验的语言、句法、词义等信息。

Bidirectional 说明BERT采用的是双向语言模型的方式,能够更好的融合前后文的知识。

Transformers说明BERT采用Transformers作为特征抽取器。

Deep说明模型很深,base版本有12层,large版本有24层。

总的来说,BERT是一个用Transformers作为特征抽取器的深度双向预训练语言理解模型

BERT的实现原理(how)
在 BERT 中,总共包括两个步骤:预训练和微调。在预训练中,模型基于无标签数据,在不同的预训练任务上进行训练。在微调中,模型首先基于预训练得到的参数初始化,然后使用来自下游具体任务的标签数据对所有参数进行微调。每个下游任务都拥有独立的微调模型,即便其使用相同的预训练参数初始化。BERT 的特征在于对于不同的任务,其模型结构统一,预训练架构与最终的下游架构仅存在细微差别。下图以智能问答为例,给出了 BERT 的整体架构
在这里插入图片描述
模型结构
BERT 模型的结构是一个多层双向 Transformer encoder,基于原始论文(Attention is all you need)实现。Transformer encoder 的特点是其关注了双侧的上下文,而 Transformer decoder 则仅使用了左侧的上下文(通过 masked 方法)。在本研究中,定义 Transformer 堆叠层数为 [公式],隐藏向量维数为 [公式],自我注意力头部数量为 [公式],全连接网络隐藏层维数为 [公式]。本研究包括了两种大小的 BERT 模型:

[公式]: [公式], 总参数量为 110M
[公式]: [公式], 总参数量为 340M
其中 BERT base 选择了与 OpenAI GPT 同样的大小,方便两者之间的比较。

输入/输出表示
为了让 BERT 能够处理一系列的下游任务,模型的输入表示需要能够在一个序列中明确地表示单个句子以及句子对(如问题-答案)。注意在本研究中,一个”句子“并不一定是实际的句子,可以是任意范围内的连续文本;一个”序列“表示 BERT 中的输入 token 序列(即词语序列),可以是单个句子,也可以是两个句子打包在一起。

本研究中使用了 WordPiece 嵌入(大小为 30000 的词典)来生成词嵌入向量。每个序列的第一个 token 为一个特殊的分类标志 [公式],该 token 的最终隐藏状态用来聚合序列,执行分类任务。句子对被打包到单个序列中,通过两种方式进行区分:第一种是两个句子间插入一个特殊标志 [公式],第二种是对于每个 token,添加一个学习到的嵌入向量来表示其属于句子 A 还是 B。如图 1 所示,输入嵌入向量标记为 [公式],特殊标志 [公式] 的最终隐藏向量标记为 [公式],第 [公式] 个输入 token 的最终隐藏向量标记为 [公式].

对于一个给定的 token,其输入表示由三部分相加得到,如下图所示。第一个是词嵌入(基于 WordPiece 生成),第二个是 segment 嵌入(表示该 token 所属的句子),第三个是位置嵌入(表明该 token 在序列中的位置信息)。

在这里插入图片描述
预训练 BERT
我们使用两个无监督任务来预训练 BERT,如图 1 左侧所示。

任务一:Masked LM
对于标准的条件语言模型,其只能进行单向训练,否则词语会”看到它们自己“,引起模型训练的混乱。为了同时利用双侧上下文的信息,原文提出了一种方案:将输入序列的部分 token 随机遮挡起来,然后预测这些被遮挡起来的 token。该方法被称为 ”masked LM“ (MLM),其思想来源于著名的 Cloze task。在该任务中,被遮挡的 token 的最终隐藏向量会被转换为一个词典长度的 softmax 向量输出,用于预测词语 id。在原文的试验中,随机遮挡了每个序列中 15% 的 WordPiece 向量。

MLM 任务可以允许模型利用双侧上下文的信息进行预训练,但是其存在着一个问题:预训练和微调存在着不匹配,因为 [公式] token 并不会出现在微调训练中。为了减轻这一影响,我们并不总是用 [公式] token 来替换被遮挡的词语。如之前所述,训练数据生成器随机选择 15% 的 token 位置用于预测,如果第 [公式] 个位置的 token 被选中,则其会按照如下策略进行替换:

80% 的可能使用 [公式] token
10% 的可能使用随机 token
10% 的可能保持 token 不变
之后,输出 [公式] 会被用于预测原始的 token,使用交叉熵损失函数。

任务二:Next Sentence Prediction (NSP)
很多重要的下游任务,如智能问答(QA)和自然语言推理(NLI),都是基于理解两个句子之间的联系,而标准的语言模型并不能直接捕捉这一联系。BERT 提出了一种二元 next sentence prediction 任务进行预训练,能够在任意单语言语料库上实现。具体来说,当选择每个训练样本的句子对 A 和 B 时,B 有 50% 的概率是 A 的真实的后一句(标签为 [公式]);有 50% 的概率是语料库中的随机一句(标签为 [公式])。如图 1 所示,[公式] 用来预测是否为下一个句子。虽然这种方法很简单,但是在 QA 和 NLI 上均取得了不错的效果。

预训练数据
预训练语料库采用了 BooksCorpus (800M 词语)以及 English Wikipedia(2500M 词语)。需要注意的是作者使用了文档层面的语料库而非打乱的句子层面的语料库,因为预训练需要提取序列之间的关系。

微调 BERT
得益于 Transformer 的自我注意力机制,BERT 的微调过程比较直接。对于每个任务,只需要将任务对应的输入及输出拖入 BERT结构,然后端对端微调所有参数即可。举例来说,对于输入,预训练中的句子对 A 和 B 对应于:

文本复述任务(paraphrasing)中的句子对
文本蕴涵(entailment)任务中的 hypothesis-premise 对
智能问答任务中的 question-passage 对
文本分类或序列标注任务中的 text-∅ 对(即单个句子)
而对于输出,token 的表示被注入到一个输出层中,用于 token-level 的任务,如序列标注或智能问答。而 [公式] 表示则被注入到输出层中,用于分类任务,如文本蕴涵、情感分析等。下图给出了不同下游任务下 BERT 微调结构的不同,其中 a 和 b 对应序列层面的任务,c 和 d 对应词语层面的任务。

在这里插入图片描述
与预训练相比,微调部分的算力要求相对较低,如果你有一块 TPU,最多一个小时就可以复现原文中的所有结果。

BERT到底学到了什么
(1) 在BERT在预训练过程中,学习到了丰富的语言学方面的信息。

短语句法的信息在低层网络结构中学习到;BERT的中层网络就学习到了丰富的语言学特征;BERT的高层网络则学习到了丰富的语义信息特征。

上述观点来自如下的论文,该团队用一系列的探针实验,佐证了上述的观点,对我们进一步了解BERT和更有效的使用BERT有一定的指导意义。

Ganesh Jawahar Benoˆt Sagot Djam´e Seddah (2019). What does BERT learn about the structure of language?.

(2) BERT其实并没有学习到深层的语义信息,只是学习到了一些浅层语义和语言概率的线索?

最近有一篇论文"Probing Neural Network Comprehension of Natural Language Arguments",讨论BERT在Argument Reasoning Comprehension Task(ARCT)任务中是不是其实只是学习到了数据集中一些虚假的统计线索,并没有真正理解语言中的推理和常识。

事情大概是这样子,论文作者为了杀杀BERT的威风,挑了自然语言处理中比较难的任务ARCT,并且在测试数据中做了一些“手脚”,想试一试BERT的身手。所谓的ARCT,是一个推理理解的任务。如下图所示,展示了一个ARCT数据集中的例子。ARCT数据中有一个结论Claim,一个原因Reason,一个论据Warrant,还有一个错误论据Alternative。
在这里插入图片描述
如上图所示,是ARCT任务的通用模型结构,就是同时输入,Claim,Reason和两个Warrant,预测哪个Warrant是正确的。

论文作者首先在ARCT原始数据集上用BERT进行ARCT任务的预测,发现BERT的效果确实很好,达到71.6±0.04,跟没有接受过训练的人员成绩接近。

然后,研究人员研究测试数据集发现数据集里面其实隐藏了一些统计线索。简单的说就是,数据集里正确的Warrant里包含某些词的概率比错误的Warrant要高。例如,只要看到Warrant中包含not就预测其为正确的Warrant就能够达到60的正确率。

同时,研究人员还做了只把warrant和claim、warrant和reason作为输入来训练模型的实验。实验发现,BERT的效果也能达到70+。这就好像老师题目都还没有说完,学生就把答案写出来,这显然不太合理的,要么是学生作弊,要么是学生提前把答案背下来了。

最后,研究人员来了一招狠的,就是将数据集中的数据进行反转和一些词概率上的平均处理,如下所示实验结果令人惊讶,BERT最好的效果只有53%,只比瞎猜好一点点。

所以,BERT的预训练过程到底学到了什么呢?

要准确回答这个问题并不容易。但通过上述两篇论文在两个维度上对BERT的解析,我们心里应该能够给BERT一个清晰的定位。BERT是一个强大的预训练,因其超大的参数量和较强的特征提取能力,能够从海量的语料中学习到一些语言学和一定程度的语义信息。但是,笔者认为,跟此前的所有NLP模型一样,它还远没有学习到语言中蕴含的大量的常识和推理。例如,利用BERT或许能够从"天下雨了",推断出“要带伞”。但是更深层次的,“要带伞是因为怕淋湿,淋湿了会感冒”这些BERT是很难学到的。

NLP的难处就在于,语言是高度精炼和情境化的。一句简单的话,可能需要丰富的知识才能理解。现在来看,预训练模型是一条有希望但漫长的道路。

总结
BERT是目前最火爆的NLP预训练模型,其基于MLM和双向语言模型和以Transformer作为特征抽取器,是其成功最主要的两个原因。我们先想想,BERT还有哪些地方可以改进的,下周我们介绍XLnet的时候,就可以更好的理解了。

猜你喜欢

转载自blog.csdn.net/qq_42707967/article/details/113862250