一文读懂BERT模型


学习资料

二、BERT论文

论文题目:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
论文地址:https://arxiv.org/pdf/1810.04805.pdf
论文会议:NAACL 2019

BERT的目的是预训练Transformer模型的Encoder网络,从而大幅提高准确率。经过BERT预训练后的Encoder网络相当于有了一组比较好的初始化参数,已经能体现出单词之间的相关性了。

BERT有两个基本的想法:

  1. 随机遮挡一个单词,让encoder网络根据上下文来predict masked word
  2. 把两个句子放在一起,让encoder网络判断这两句话是不是原文里相邻的两句话 predict next sentence

BERT利用这两个任务来预训练Transformer模型中的Encoder网络

任务1:Predict Masked Words(MLM Masked language model)

  • 回顾下Transformer的Encoder部分结构

the, cat…等词会转换成onehot向量,然后输入(应该是分别输入吧)到embedding层,得到x1,x2,…, x6,它们是6个词向量,所以经过Encoder网络后,得到6个词向量u1, u2, … u6

Bert是怎么做的呢?

我们首先来看第一个task1 (MLM):

task MLM的输入和输出:

input:the [MASK] sat on the mat
target:cat

随机选一个词,替换成 [MASK] 符号,你可以把 [MASK] 理解成一个特殊的词,它会被Embedding层编码成词向量$x_M$。注意之前提到过,Transformer的Encoder网络不是一对一映射,而是多对一,所以$u_M$向量依赖于所有的输入 x1, xM,… x6。虽然$u_M$在[MASK]对应过来的位置上,但是$u_M$知道整句话的信息,$u_M$包含上下文信息,所以可以用 $u_M$来预测被遮挡的单词

把$u_M$作为一个特征向量输入softmax分类器,分类器的输出是一个概率分布p(字典里的每个单词都会有个概率值),通过概率值就可以判断被遮挡的单词是什么。

这个例子里我遮住了cat这个单词,训练的时候,我希望分类器的输出p向量能够尽量接近cat的onehot向量(标签y)。把cat的onehot向量记住e,e是Ground Truth,我们希望p能尽量接近e。把e和p的交叉熵作为损失函数,用反向传播,梯度下降更新模型的参数。

关键点:BERT会随机遮挡单词,把遮住的单词作为标签。BERT预训练不需要人工标注的数据集,可以用任何书籍或者维基百科作为训练数据,可以自动生成标签,这样以来,BERT的训练数据要多少有多少!足以训练出一个非常大的模型(因为你可以设模型有1亿个参数,但你数据集可以有10亿,这样就足够把这个大网络训练好了)。BERT论文里面是用了English Wikipedia(2.5 billion words)作为训练集

任务2:Predict the Next Sentence(NSP)

第一句是“微积分是数学的分支”,第二句是“它是由牛顿和莱布尼茨发明的”

现在让你做一个判断,这两句话是否是原文中相邻的两个句子。那我觉得很有可能是因为“微积分”和“牛顿、莱布尼茨”的相关性非常大。神经网络可以从海量的训练数据中学出这种相关性,所以神经网络有能力作出正确的判断。

现在假如第二个句子,变成了”panda is native to south central china”,那你觉得这两句话是否是原文中相邻的两个句子呢?我觉得应该不是,一个讲的是微积分,一个讲的是熊猫,这两句之间相关性很小。

那这个task(NSP)的输入是什么样的呢?

可以把两句话拼接起来,两句话之间用[SEP]符号分开,在最前面放一个[CLS]占一个位置,它对应的位置向量c是用来作为特征向量,输入到一个binary classifier的

[CLS]:a token for classification

[SEP]: is for separating sentences

生成训练数据的时候,有50%训练集是原文里真实相邻的两句话(标签是True),另外50%训练集的第二句话是从原文中随机抽取的句子(标签是False)

[CLS]可以看做一个特殊的单词,这个位置上的输出记为向量c,同样的[SEP]可以看做一个特殊的单词,这个位置上的输出记作向量s

这里需要强调一点:

向量c虽然在[CLS]对应的位置上,但是向量c并不是只依赖于[CLS],向量c包含了两句话的全部信息,所以靠向量c就可以判断出两句话是不是真的在原文中相邻。

把向量c作为特征向量,输入到一个Binary Classifier,分类器的输出是一个[0,1]之间的值,1代表两句话在原文中真实相邻,0代表两句话在原文中不相关。可以用cross entropy来算损失函数,然后反向传播,训练网络。

Q:那这样做预训练有什么用呢?

A:相邻两句话通常有关联,这样做二分类可以强化这种关联。让Embedding和词向量包含这种关联,比如微积分和牛顿的词向量就应该有某种关联。

Encoder网络中有self-attention层,self attention的作用就是找相关性,这种分类任务可以训练self attention找到正确的相关性

Bert合并了Task1和Task2

Bert将上面两个任务合并在了一起,用来预训练Transformer的Encoder网络

具体地,把两句话拼接起来(50%可能是原文真实相邻的句子),然后随机遮挡15%的单词

Bert 训练样本1

下面这条数据里碰巧有两个被遮挡的单词,这样一共有3个任务。第一个任务是判断两句话是否相邻,另外两个任务是预测被遮挡的单词。他们的标签分别是True, branch, was

Bert 训练样本2

这条数据里碰巧只有一个被遮挡的单词,我知道第二句话是随机抽样得到的,所以标签是false,我也知道被遮挡的单词是south,所以标签是south

训练时,假如遇到第一条训练样本,那就会有三个损失加起来作为目标函数

BERT的训练时间

Bert想法简单而且非常有效,但是计算代价非常大,BERT论文里面有两种模型:BERT Base,BERT Large

BERT Base小模型有1.1亿个参数,其实它一点都不小。如果买亚马逊的服务器来跑,差不多要花一万美元,而且这只是跑一遍的时间,还不算调参数。所以只有大公司才能玩得起BERT,好在他们训练出来的模型参数都是公开的,你想用Transformer的话,只用去下载BERT预训练出来的模型和参数就行了。

Summary

核心:BERT的目的是预训练Transformer模型的Encoder网络,从而大幅提高准确率。经过BERT预训练后的Encoder网络相当于有了一组比较好的初始化参数,已经能体现出单词之间的相关性了。

  • MLM任务是一个多分类任务,标签可以自动生成 (Randomly mask words, with some tricks)
  • NSP任务是一个二分类任务,标签可以自动生成 (50% of the next sentences are real. The other 50% are fake)

Q:为什么用这两个任务做预训练有用呢?

A:其实BERT预训练相当于提前让Embedding层学到单词之间的相似性,提前帮助Encoder网络训练self attention,找到正确的相关性。BERT预训练的结果是得到一组较好的初始化参数!


  • Transformer的Encoder网络不是一对一映射,而是多对一,所以$u_M$向量依赖于所有的输入 x1, xM,… x6。虽然$u_M$在[MASK]对应过来的位置上,但是$u_M$知道整句话的信息,$u_M$包含上下文信息。把$u_M$作为一个特征向量输入softmax分类器

  • 向量c虽然在[CLS]对应的位置上,但是向量c并不是只依赖于[CLS],向量c包含了两句话的全部信息,所以靠向量c就可以判断出两句话是不是真的在原文中相邻。

  • BERT的好处是不需要人工标注数据,你想要多少训练数据就能有多少。要知道人工标注数据是非常昂贵的!得花几十万才能标注一个比较大的数据集 。BERT两种任务的标签都可以自动生成,这是一个非常好的性质

  • 可以用书、网页的论文等任何数据来做BERT预训练,反正标签都是自动生成的

  • BERT论文里面是用了English Wikipedia(2.5 billion words)作为训练集

  • 只有大公司才能玩得起BERT,好在他们训练出来的模型参数都是公开的,你想用Transformer的话,只用去下载BERT预训练出来的模型和参数就行了。 (怪不得学长他们用预训练模型时,GPU显存要占30G左右,因为他们下载的是预训练好的BERT模型,模型很大,里面可能有1亿个参数!)谷歌用几千台GPU预训练好的Bert(训练了10天),里面的特征已经比较好了(或者说里面的权重w已经比较合理了),我们只要下载下来微调参数就行了

三、BERT相关问题

问题1:BERT的MASK机制为什么要10%的词

对于MLM任务,我们会在数据中随机选择 15% 的标记,其中80%被换位[mask],10%不变、10%随机替换其他单词,这里为什么要保持10%不变?

原因:因为训练的时候是有[MASK]的,但是测试阶段是没有[MASK]的,为了一定程度保持训练和测试阶段的一致性,所以作者选择10%的词不变。

问题2:对同一个单词,BERT提取出来的Embedding向量是否相同?

BERT解决了Word2Vec不同“一词多意”的问题

BERT能够考虑每个单词的上下文信息,所以同一个单词在不同的语境下,得到Embedding表征向量是不同的。

比如一个句子”I book room and read book”输入到BERT模型中,第一个book的embedding和第二个book的embedding向量就是不同的
Hugging Face:https://huggingface.co/cointegrated/LaBSE-en-ru

Q:在具体下游任务时,我们应该对于”book”这个单词我们该用哪个Embedding向量呢?

A:其实你用的时候是把你训练集中的英语句子输入到BERT里面的,然后接一个下游任务的模型,这样的话,你”book”在句子的什么位置,自然会用这个位置对应的BERT输出的Embedding向量。

问题3:为什么Bert的NSP任务用的是[CLS]位置的output去做分类?

Self-Attention向量中,自己和自己的相似性肯定是最大的,这样如果你用一个有实际意义的词如”world”的output去做分类,他虽然也包含了整个句子的完整信息,但是他自己那部分占大头,为了更加公平,我们用[CLS]这个没有任何实际意义的词,作为占位符,就算[CLS]的output中自己的值占大头也无所谓。[CLS]与文本中已有的其它词相比,这个无明显语义信息的符号会更“公平”地融合文本中各个词的语义信息,从而更好的表示整句话的语义。

简单来说就是:self-attention中自己和自己占大头,用[CLS]更公平合理些。


Author: SHWEI
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source SHWEI !
评论
 Previous
【CVPR 2021联邦学习论文解读】Model-Contrastive Federated Learning (MOON) 联邦学习撞上对比学习 【CVPR 2021联邦学习论文解读】Model-Contrastive Federated Learning (MOON) 联邦学习撞上对比学习
写在前面最近阅读了一篇CVPR上关于联邦学习的文章(将对比学习的思想融入到联邦学习中),作者是新加坡国立大学的Qinbin Li(博士生,导师 何炳胜),Bingsheng He(何炳胜教授,导师 宋晓东)以及加州大学伯克利分校的Dawn
2021-10-18
Next 
联邦学习中常见的Clients数据Non-IID非独立同分布总结 联邦学习中常见的Clients数据Non-IID非独立同分布总结
写在前面在介绍联邦学习客户端之间数据Non-IID分布前,我们需要先了解Dataset Shift的概念。 联邦学习中客户端之间Non-IID分布和我们在做机器学习任务时可能遇到的训练集与测试集分布不一致其实是一个道理(因为你可以把训练集
2021-08-12
  TOC