Bert简介

1.前言

Bert简介

  • 监督学习:给定训练数据 x 和 标签 y 。使得 Model 对 x 的输出越接近 y 越好
  • 自监督学习:没有标签 y ,我们将数据分成两份,使得 Model 对其中一部分的输出越接近另一部分越好

BERT 就是自监督学习,利用非 Mask 的来预测 Mask 的部分

2.Bert(Bidirectional Encoder Representations from Transformers)

源自Transformers的双向编码表示。主要包含两部分,预训练和Fine-tuning

2.1主要预训练任务

2.1.1.完形填空

Bert简介

  • 随机选择一些输入进行遮挡
  • 被遮住可以是将字换成了 MASK :一个特殊的字符,代表被盖住,不在字典里出现
  • 可以随机替换为字典中的其他单词
  • 被盖住的字输出的结果经过一个线性层,然后做 softmax 得到结果,这个结果和真实字的 one-hot 编码越接近越好

2.1.2.预测下一个句子

Bert简介

  • [CLS]放在一个序列的最前面,没有特别具体的语义。我们通过 [CLS] 对应的输出,来判断两个句子是不是连接在一起的。

2.2预训练

2.2.1.输入表示

原文说:我们的输入表示能够在一个 token 序列中明确表示单个句子 和 一对句子。一个“句子”可以是连续文本的任意跨度,而不是一个实际的语言句子。

Bert简介

上图是论文中的一个例子。例如,输入序列包含两个句子”my dog is cute”,”he likes playing”

  • 我们在序列的最前面加上一个特殊的 Token [CLS] ,其在最后一个隐藏层的隐藏状态被当做整个序列的聚合表示,从而应用于分类任务
  • 在一个句子的末尾加上一个 [SEP] 表示一个句子的结束,以区分开不同的句子

我们在进行了分词,添加了特殊 Token 之后的序列作为模型的输入。

接着对每个Token进行3个Embedding:词的Embedding,Segment的Embedding和位置的Embedding

  • 对词的 Embedding 就是将词表示成向量,使用 WordPiece embedding
  • Segment Embedding 就是给词打上标签,代表其属于哪个句子。这里使用的是学习好的 Embedding
  • 位置的 Embedding 就是对其位置进行编码

2.2.2.MLM(Mask Language Model)

BERT 使用的是 MASK 语言模型。Mask语言模型有点类似与完形填空——给定一个句子,把其中某些词遮挡起来,让模型猜测可能的词。

BERT 对输入序列随机进行 15% Mask,然后预测这些被遮住的 Token。通过调整模型的参数使得模型预测正确的概率尽可能大。

但是这有一个问题:在 Pretraining Mask LM 时会出现特殊的Token [MASK],但是在后面的fine-tuning时却不会出现,这会出现Mismatch的问题。为了减轻这种不匹配,在BERT中,如果某个Token在被选中的15%个Token里,则按照下面的方式随机的执行

  • 80%的概率替换成[MASK],比如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,就是不变

2.2.3.NSP

在有些任务中,比如问答,前后两个句子有一定的关联关系,我们希望BERT Pretraining的模型能够学习到这种关系。因此BERT还增加了一个新的任务——预测两个句子是否有关联关系。

这通过为 BERT 添加一个任务来实现:我们预训练了一个二分类的是否是下一个句子的任务。

当选择句子AB作为预训练样本时,B有 50% 的概率是A的真实的下一句,也有 50% 的概率是随机的一句。

比如下面两句是相关的

 [CLS] the man went to [MASK] store [SEP] he bought a gallon [MASK] milk [SEP]

以下两句不相关

[CLS] the man [MASK] to the store [SEP] penguin [MASK] are flight ##less birds [SEP]

2.2.4.总体架构

BERT的架构是多层的双向 Transformer encoder。这将使得我们能够获取双向的语义信息,而不是像传统方法那样,只能从左向右或者从右向左来获取单向的语义信息。
我们定义层数(Transformer blocks)为L,hidden size 为H,self-attention 的头的个数为A。一共提供了两版 BERT
Bert简介

  • BERT_%7BBASE%7D%28L%3D12%2C%20H%3D768%2C%20A%3D12%29,总参数量为 110M
  • BASE 版本的模型大小和 OpenAI GPT相同,只不过使用了双向的 self-attention
  • BERT_%7BLARGE%7D%28L%3D24%2CH%3D1024%2CA%3D16%29,总参数量为 340M

Bert简介

  • E代表 对输入进行 Embedding 的结果
  • C是 [CLS] 在最后一个隐藏层对应的隐藏状态
  • T是其它位置对应的隐藏状态

2.3.Fine-tuning

Fine-tuning是简单的,因为Transformer中的 self-attention 机制提供了 BERT 对许多下游任务进行建模的能力,无论他们包含单个文本还是文本对。我们只需要替换掉输入和输出就好了。

对于每个任务,我们只需将特定于任务的输入和输出插入到BERT中,并对所有参数进行端到端微调。

在输出端,token 表示被输入到输出层用于 token 级任务,如序列标记或问题回答,而[CLS]表示被输入到输出层用于分类,如逻辑蕴涵和情感分析

Bert简介

  • 对于相似度计算等任务,输入是两个序列,如任务 (a) 那样。我们用第一个特殊的 Token [CLS] 的最后一层输出,接上 softmax 进行分类,用分类的数据来进行 Fine-tuning
  • 对于普通的分类任务,输入是一个序列。像任务 (b) 那样。我们用第一个特殊的 Token [CLS] 的最后一层输出,接上 softmax 进行分类,用分类的数据来进行 Fine-tuning
  • 第三类是问答类问题(如(c)所示),输入是一个问题和一段很长的包含答案的文字,输出在这段文字中找到的答案。我们首相将问题和 Paragraph 表示成一个很长的序列,中间用 [SEP] 分开,这里假设答案是 Paragraph 中一段连续的文字(Span)。BERT把寻找答案的问题转化成寻找这个Span的开始下标和结束下标的问题。
    对于Paragraph的第i个Token,BERT的最后一层把它编码成T_i,然后我们用一个向量S(这是模型的参数,需要根据训练数据调整)和它相乘(内积)计算它是开始位置的得分,因为Paragraph的每一个 Token (当然 WordPiece 的中间,比如 ##ing 是不可能是开始的)都有可能是开始可能,我们用 softmax 把它变成概率,然后选择概率最大的作为答案的开始
    类似的有个向量 T ,用于计算答案结束的位置
  • 第四类任务是序列标注,比如命名实体识别,输入是一个句子(Token序列),除了 [CLS] 和 [SEP] 的每个时刻都会有输出的Tag,比如B-PER表示人名的开始。然后用输出的Tag来进行 Fine-Tuning ,如任务(d)所示

部分参考BERT模型详解 – 李理的博客 (fancyerii.github.io)

原文地址 [1810.04805] BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding (arxiv.org)

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2022年3月28日 下午12:36
下一篇 2022年3月28日 下午12:52

相关推荐