BERT理解

BERT 模型是 Google 在 2018 年提出的一种 NLP 模型,成为最近几年 NLP 领域最具有突破性的一项技术,其中有五个关键词,分别是 Pre-training、Deep、Bidirectional、Transformers、和 Language Understanding,在 11 个 NLP 领域的任务上都刷新了以往的记录,例如GLUE,SquAD1.1,MultiNLI 等。

前言

Google 在论文《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》中提出的 BERT 模型,可以作为公认的里程碑式的模型,但是它最大的优点不是创新,而是集大成者,并且这个集大成者有了各项突破:
• BERT 的意义在于:从大量无标记数据集中训练得到的深度模型,可以显著提高各项自然语言处理任务的准确率。
• 参考了 ELMO 模型的双向编码思想、借鉴了 GPT 用 Transformer 作为特征提取器的思路、采用了 word2vec 所使用的 CBOW 方法
具体结构如下:

在这里插入图片描述
从上图可以发现,BERT 的模型结构采用 Transformer Encoder 模块的堆叠。并在模型参数选择上,论文给出了两套大小不一致的模型。
在这里插入图片描述
其中 L 代表 Transformer Block 的层数,H 代表特征向量的维数,A 表示 Self-Attention 的头数。BERT 参数量级的计算公式:
在这里插入图片描述

模型结构部分

采用Transformer 的 Encoder 结构,但是模型结构比 Transformer 要深。Transformer Encoder 包含 6 个 Encoder block,BERT-base 模型包含 12 个 Encoder block,BERT-large 包含 24 个 Encoder block。

其中左图是模型预训练结构图,右侧是对于具体任务的微调过程图。

模型输入部分

首先,BERT 的输入可以包含一个句子对 (句子 A 和句子 B),也可以是单个句子。同时 BERT 增加了一些有特殊作用的标志位:
• [CLS] :放在第一个句子的首位,经过 BERT 得到表征向量 C ,用于后续分类任务。
• [SEP] :用于分开两个输入句子,例如输入句子 A 和 B,要在句子 A,B 中间增加 [SEP] 标志。
• [MASK] :用于遮盖句子中的一些单词,将单词用 [MASK] 遮盖之后,再利用 BERT 输出的 [MASK] 向量预测单词。
• WordPiece 方法:将单词拆成子词单元 (SubWord),例如:有的词拆出词根。
具体举例如下:
给定两个句子 “my dog is cute” 和 “he likes palying” 作为输入样本。BERT 会转为 “[CLS] my dog is cute [SEP] he likes play ##ing [SEP]”。其中由于BERT 里面用了 WordPiece 方法,会将单词拆成子词单元 (SubWord),所以有的词会拆出词根,例如 “palying” 会变成 “paly” + “##ing”。

并且,与 Transformer 不同,BERT 的输入 Embedding 由三个部分相加得到:Token Embedding,Segment Embedding,Position Embedding。
在这里插入图片描述
 Token Embedding:单词的 Embedding,例如 [CLS] dog 等,通过训练学习得到。
 Segment Embedding:用于区分每一个单词属于句子 A 还是句子 B,如果只输入一个句子就只使用 EA,通过训练学习得到。
 Position Embedding:编码单词出现的位置,与 Transformer 使用固定的公式计算不同,BERT 的 Position Embedding 也是通过学习得到的,在 BERT 中,假设句子最长为 512。

预训练

作者认为,存在通用的语言模型,所以先用文章预训练通用模型,然后再根据具体应用,用 supervised 训练数据,精加工(fine tuning)模型,使之适用于具体应用。并且为了区别于针对语言生成的 Language Model,作者给通用的语言模型,取了一个名字–语言表征模型 Language Representation Model。
BERT 输入句子中单词的 Embedding 之后,通过预训练方式训练模型,预训练有两个任务。
 第一个是 Masked LM,在句子中随机用 [MASK] 替换一部分单词,然后将句子传入 BERT 中编码每一个单词的信息,最终用 [MASK] 的编码信息 T[MASK] 预测该位置的正确单词。
 第二个是下一句预测NSP,将句子 A 和 B 输入 BERT,预测 B 是否 A 的下一句,使用 [CLS] 的编码信息 C 进行预测。

Masked LM

BERT 的作者认为在预测单词时,要同时利用单词 left (上文) 和 right (下文) 信息才能最好地预测。将 ELMo 这种分别进行 left-to-right 和 right-to-left 的模型称为 shallow bidirectional model (浅层双向模型),BERT 希望在 Transformer Encoder 结构上训练出一种深度双向模型 deep bidirectional model,因此提出了 Mask LM 这种方法进行训练。
下图展示了bert、GPT、ELMo三者的区别:
在这里插入图片描述
 ELMo 使用自左向右编码和自右向左编码的两个 LSTM 网络,分别以 P(wi|w1,⋯,wi−1) 和 P(wi|wi+1,⋯,wn)为目标函数独立训练,将训练得到的特征向量以拼接的形式实现双向编码,本质上还是单向编码,只不过是两个方向上的单向编码的拼接而成的双向编码。
 GPT 使用 Transformer Decoder 作为 Transformer Block,以 P(wi|w1,⋯,wi−1) 为目标函数进行训练,用 Transformer Block 取代 LSTM 作为特征提取器,实现了单向编码,具有良好的文本生成能力,是一个标准的预训练语言模型,然后使用 Fine-Tuning 模式解决下游任务。但然而当前词的语义只能由其前序词决定,并且在语义理解上不足。
 BERT 使用 Transformer encoder作为特征提取器,虽然没有文本生成能力,但拥有更强的语义理解能力。也是一个标准的预训练语言模型,它以 P(wi|w1,⋯,wi−1,wi+1,⋯,wn) 为目标函数进行训练,BERT 使用的编码器属于双向编码器。BERT 和 ELMo 的区别在于使用 Transformer Block 作为特征提取器,加强了语义特征提取的能力;BERT 和 GPT 的区别在于使用 Transformer Encoder 作为 Transformer Block,并且将 GPT 的单向编码改成双向编码,也就是说 BERT 舍弃了文本生成能力,换来了更强的语义理解能力。
并且在实际预测单词 “自然” 的时候,将“自然”进行Mask处理,防止模型提前得知 “自然” 的信息。具体操作如下:
在这里插入图片描述
BERT 在训练时只预测 [Mask] 位置的单词,这样就可以同时利用上下文信息。但是在后续使用的时候,句子中并不会出现 [Mask] 的单词,这样会影响模型的性能。因此在训练时采用如下策略,随机选择句子中 15% 的单词进行 Mask,在选择为 Mask 的单词中,有 80% 真的使用 [Mask] 进行替换,10% 不进行替换,剩下 10% 使用一个随机单词替换。例如句子 “my dog is hairy”,选择了单词 “hairy” 进行 Mask,则:
 80% 的概率,将句子 “my dog is hairy” 转换为句子 “my dog is [Mask]”。
 10% 的概率,保持句子为 “my dog is hairy” 不变。
 10% 的概率,将单词 “hairy” 替换成另一个随机词,例如 “apple”。将句子 “my dog is hairy” 转换为句子 “my dog is apple”。

NSP

BERT 的第二个预训练任务是 Next Sentence Prediction (NSP),即下一句预测,给定两个句子 A 和 B,要预测句子 B 是否是句子 A 的下一个句子。由于很多下游任务,例如问答系统 (QA),自然语言推断 (NLI) 都需要模型能够理解两个句子之间的关系,但是通过训练语言模型达不到这个目的。所以,BERT 使用这一预训练任务的主要原因是:让模型能够更好地理解句子间的关系。
其中BERT 在进行训练的时候,有 50% 的概率会选择相连的两个句子 A 、B,有 50% 的概率会选择不相连得到两个句子 A 、B,然后通过 [CLS] 标志位的输出预测句子 A 的下一句是不是句子 B。
• 输入 = [CLS] 我 喜欢 玩 [Mask] 联盟 [SEP] 我 最 擅长 的 [Mask] 是 亚索 [SEP]
类别 = B 是 A 的下一句
• 输入 = [CLS] 我 喜欢 玩 [Mask] 联盟 [SEP] 今天 天气 很 [Mask] [SEP]
类别 = B 不是 A 的下一句

后续微调

具体如下图:
在这里插入图片描述
a) 一对句子的分类任务:例如自然语言推断 (MNLI),句子语义等价判断 (QQP) 等。如上图 (a) 所示,需要将两个句子传入 BERT,然后使用 [CLS] 的输出值 C 进行句子对分类。
b) 单个句子分类任务:例如句子情感分析 (SST-2),判断句子语法是否可以接受 (CoLA) 等。如上图 (b) 所示,只需要输入一个句子,无需使用 [SEP] 标志,然后也是用 [CLS] 的输出值 C 进行分类。
c) 问答任务:如 SQuAD v1.1 数据集,样本是语句对 (Question, Paragraph),Question 表示问题,Paragraph 是一段来自 Wikipedia 的文本,Paragraph 包含了问题的答案。而训练的目标是在 Paragraph 找出答案的起始位置 (Start,End)。如上图 © 所示,将 Question 和 Paragraph 传入 BERT,然后 BERT 根据 Paragraph 所有单词的输出预测 Start 和 End 的位置。
d) 单个句子标注任务:例如命名实体识别 (NER),输入单个句子,然后根据 BERT 对于每个单词的输出 T 预测这个单词的类别,是属于 Person,Organization,Location,Miscellaneous 还是 Other (非命名实体)。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值