BERT结构及原理

BERT 结构

BERT主要用了Transformer的Encoder,而没有用Decoder,因为BERT是一个预训练模型,只要学到其中的语义关系即可,不需要去解码完成具体的任务。整体框架如下:
请添加图片描述

多个Transformer的Encoder堆叠起来,就组装成了BERT。在论文中,
作者分别用了 12 层和 24 层 Transformer Encoder 组装了两套 BERT 模型。两套模型的参数综述分别为110M和340M

BERT 输入输出特征

input 组成:

  • Token embedding 字向量:BERT模型通过查询字向量表将文本中的每个字转换为一维向量,作为模型输入;
  • Segment embedding 文本向量:该向量的取值在模型训练过程中自动学习,用于刻画文本的全局语义信息,并与单字/词的语义信息相融合;
  • Position embedding 位置向量:由于出现在文本不同位置的字/词所携带的语义信息存在差异(比如:“我爱你”和“你爱我”),因此,BERT模型对不同位置的字/词分别附加一个不同的向量以作区分。

这些向量既可以随机初始化,也可以利用 Word2Vector 等算法进行预训练以作为初始值。

请添加图片描述
output 组成:输入各字对应的融合全文语义信息后的向量表示

BERT 预训练任务

任务一、Masked LM 掩码语言模型
1. BERT 为什么需要预训练任务 Masked LM ?

深度双向语言模型会出现自己预测自己,即【see themselves】的问题,所以要 masked LM。

【see themselves】解释:

双向语言模型在预测当前词的时候,会用到其上下文信息(类似word2vec里的CBOW模型),而 transformer 自带了全局的 self-attention,会将上下文的词编码到当前模型里,所以在预测其他词的时候,该词的信息已经包含在了前一层的网络参数里,导致间接地【自己预测自己】,也就是【indirectly see themselves】
请添加图片描述

不严谨地解释下:(左图)在预测 T1 的时候,transformer 模块(红框所示)已经将 T2 的信息编码进去了,所以(右图)在预测 T2 的时候,transformer 模块里,已经包含了 T2 的信息。

那遇到这个问题怎么办?

那我就『假装』不知道未来的词是什么。 怎么假装呢? 随机mask掉15%左右的词,美名其曰 『完形填空』 ,这样还不够,还要再辅以句子预测的任务,加强模型的能力。

2. masked LM 怎么做?

BERT 在训练时只预测 [Mask] 位置的单词。对每一个句子中的词(token):

  • 85%的概率,保留原词不变
  • 15% 的概率,使用以下方式替换
    • 80% 真的使用 [Mask] 进行替换;
    • 10% 不进行替换;
    • 10% 使用一个随机单词替换。
任务二、Next Sentence Prediction 下一句预测
1. 为什么要进行下一句预测?
2. 下一句预测怎么做?

方法:

  • 训练一个下一句预测的二分类任务

做法:

  • 选择句子A和B作为预训练样本:B有50%的可能是A的下一句,也有50%的可能是来自语料库的随机句子,预测B是不是A的下一句。

BERT fine-turning 微调

1. 为什么 BERT 需要 fine-turning?

动机:获得输入适应于当前任务的固定维度池化表征

2. 如何进行 fine-turing?

fine-turning 就是载入预训练好的 BERT 模型。在自己的语料上再训练一段时间。前面预训练部大公司已经帮我们做好了,实际我们直接下载BERT模型,在BERT后接一些简单的模型,如:CRF、LSTM,来完成自己的任务。

BERT 损失函数

  • Bert 损失函数组成:
    • 第一部分是来自 Mask-LM 的单词级别分类任务;
    • 另一部分是句子级别的分类任务;
  • 优点:通过这两个任务的联合学习,可以使得 BERT 学习到的表征既有 token 级别信息,同时也包含了句子级别的语义信息。
  • 损失函数
    L ( θ , θ 1 , θ 2 ) = L 1 ( θ , θ 1 ) + L 2 ( θ , θ 2 ) L(θ, θ_1, θ_2) = L_1(θ, θ_1) + L_2(θ, θ_2) L(θ,θ1,θ2)=L1(θ,θ1)+L2(θ,θ2)

其中:

  • θ是 Encoder 部分的参数;
  • θ 1 θ_1 θ1是Mask-LM任务在 Encoder 上所接的输出层中的参数;
  • θ 2 θ_2 θ2是句子预测任务中在 Encoder 接上的分类器参数;

在Mask LM的损失函数中,如果被 mask 的词集合为 M,因为它是一个词典大小 |V| 上的多分类问题,所用的损失函数叫做负对数似然函数(且是最小化,等价于最大化对数似然函数),那么具体说来有:
请添加图片描述

在 Next Sentence Prediction 任务中,是一个二分类问题,所以也采用负对数似然函数
请添加图片描述

那么两个任务联合学习的损失函数为:
请添加图片描述

BERT优缺点

  • 优点:能够获取上下文相关的双向特征表示;
  • 缺点:
  1. BERT的预训练任务MLM使得能够借助上下文对序列进行编码,但同时也使得其预训练过程与中的数据与微调的数据不匹配,难以适应生成式任务
  2. 另外,BERT没有考虑预测[MASK]之间的相关性,是对语言模型联合概率的有偏估计
  3. 由于最大输入长度的限制,适合句子和段落级别的任务,不适用于文档级别的任务(如长文本分类);
  4. 适合处理自然语义理解类任务(NLU),而不适合自然语言生成类任务(NLG)

对2的理解:原有基于WordPiece的分词方式会把一个完整的词切分成若干个子词,在生成训练样本时,这些被分开的子词会随机被mask。在全词mask中,如果一个完整的词的部分WordPiece子词被mask,则同属该词的其他部分也会被mask,即全词mask。

面试问题

1. BERT 是怎么用 Transformer 的?

BERT 只使用了 Transformer 的Encoder 模块,原论文中,作者分别用了 12 层和 24 层 Transformer Encoder 组装了两套 BERT 模型。

2. 为什么 BERT 比 ELMo 效果好?

主要有以下几点原因:

  • LSTM 抽取特征的能力远弱于 Transformer
  • 拼接方式双向融合的特征融合能力偏弱(没有具体实验验证,只是推测)
  • 其实还有一点,BERT 的训练数据以及模型参数均多余 ELMo,这也是比较重要的一点
3. ELMo和BERT的区别是什么?

ELMo 模型是通过语言模型任务得到句子中单词的 embedding 表示,以此作为补充的新特征给下游任务使用。因为 ELMO 给下游提供的是每个单词的特征形式,所以这一类预训练的方法被称为“Feature-based Pre-Training”。而 BERT 模型是“基于 Fine-tuning 的模式”,这种做法和图像领域基于 Fine-tuning 的方式基本一致,下游任务需要将模型改造成 BERT 模型,才可利用 BERT 模型预训练好的参数。

4. BERT有什么局限性?

从 XLNet 论文中,提到了 BERT 的两个缺点,分别如下:

缺点一:
BERT 在第一个预训练阶段,假设句子中多个单词被 Mask 掉,这些被 Mask 掉的单词之间没有任何关系,是条件独立的,然而有时候这些单词之间是有关系的,比如”New York is a city”,假设我们 Mask 住”New”和”York”两个词,那么给定”is a city”的条件下”New”和”York”并不独立,因为”New York”是一个实体,看到”New”则后面出现”York”的概率要比看到”Old”后面出现”York”概率要大得多。

但是需要注意的是,这个问题并不是什么大问题,甚至可以说对最后的结果并没有多大的影响,因为本身 BERT 预训练的语料就是海量的(动辄几十个 G),所以如果训练数据足够大,其实不靠当前这个例子,靠其它例子,也能弥补被 Mask 单词直接的相互关系问题,因为总有其它例子能够学会这些单词的相互依赖关系。

缺点二:
另外还有一个缺点,是 BERT 在分词后做[MASK]会产生的一个问题,为了解决 OOV 的问题,我们通常会把一个词切分成更细粒度的 WordPiece。BERT 在 Pretraining 的时候是随机 Mask 这些 WordPiece 的,这就可能出现只 Mask 一个词的一部分的情况,例如:

probability 这个词被切分成”pro”、”#babi”和”#lity”3 个 WordPiece。有可能出现的一种随机 Mask 是把”#babi” Mask 住,但是”pro”和”#lity”没有被 Mask。这样的预测任务就变得容易了,因为在”pro”和”#lity”之间基本上只能是”#babi”了。这样它只需要记住一些词(WordPiece 的序列)就可以完成这个任务,而不是根据上下文的语义关系来预测出来的。类似的中文的词”模型”也可能被 Mask 部分(其实用”琵琶”的例子可能更好,因为这两个字只能一起出现而不能单独出现),这也会让预测变得容易。

为了解决这个问题,很自然的想法就是词作为一个整体要么都 Mask 要么都不 Mask,这就是所谓的 Whole Word Masking。这是一个很简单的想法,对于 BERT 的代码修改也非常少,只是修改一些 Mask 的那段代码。

5. BERT的[Mask]相对于 CBOW 有什么异同点?

相同点:同样都是根据上下文预测 input word。

不同点:

  1. BERT会随机对15%的词进行操作,80%Mask,10%不替换,10%用随机词替换。
  2. CBOW每个单词都会成为input word,而BERT只对随机15%的词进行预测。
  3. CBOW模型训练之后,每个单词的word embedding是唯一的,因此不能很好的处理一词多义的问题。而BERT模型得到dwordembedding融合了上下文信息,就算是同一个单词,在不同的上下文语境中,得到的word embedding是不一样的。
6. 词袋模型到 word2vec 改进了什么?word2vec 到 BERT 又改进了什么?
  • 词袋模型到 word2vec 改进了什么?

词袋模型(Bag-of-words model)是将一段文本(比如一个句子或是一个文档)用一个“装着这些词的袋子”来表示,这种表示方式不考虑文法以及词的顺序。「而在用词袋模型时,文档的向量表示直接将各词的词频向量表示加和」。通过上述描述,可以得出词袋模型的两个缺点:

  1. 词向量化后,词与词之间是有权重大小关系的,不一定词出现的越多,权重越大。
  2. 词与词之间是没有顺序关系的。

word2vec 是考虑词语位置关系的一种模型。通过大量语料的训练,将每一个词语映射成一个低维稠密向量,通过求余弦的方式,可以判断两个词语之间的关系,word2vec 其底层主要采用基于 CBOW 和 Skip-Gram 算法的神经网络模型。

因此,从词袋模型到word2vec改进主要集中于以下两点:

  1. 考虑了词与词之间的顺序,引入了上下文的信息
  2. 得到了词更加准确的表示,其表达的信息更为丰富
  • word2vec 到 BERT 又改进了什么?

word2vec 到 BERT 的改进之处其实没有很明确的答案,如同上面的问题所述,BERT 的思想其实很大程度上来源于 CBOW 模型,如果从准确率上说改进的话,BERT 利用更深的模型,以及海量的语料,得到的 embedding 表示,来做下游任务时的准确率是要比 word2vec 高不少的。实际上,这也离不开模型的“加码”以及数据的“巨大加码”。再从方法的意义角度来说,BERT 的重要意义在于给大量的 NLP 任务提供了一个泛化能力很强的预训练模型,而仅仅使用 word2vec 产生的词向量表示,不仅能够完成的任务比 BERT 少了很多,而且很多时候直接利用 word2vec 产生的词向量表示给下游任务提供信息,下游任务的表现不一定会很好,甚至会比较差。

参考资料:【NLP】从语言模型看Bert的善变与GPT的坚守

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值