1、简介

Bert是一种预训练transformer的方法。Bidirectional Encoder Representations from Transformers(BERT)

BERT在18年提出, 19年发表, bert的目的是预训练transformer的encoder网络,从而大幅度提高准确率。bert的基本想法有两个, 一个是随机遮挡一个或多个单词, 让encoder网络根据上下文来预测被遮挡的单词。第二个想法是把两个句子放在一起, 让encoder网络判断两句话是不是原文中相邻的两句话。bert用这两个任务来预训练transformer模型中的encoder网络。

2、Predict Masked Word

首先回顾一下transformer中的encoder网络, 输入是一句话, 被分成很多个单词。embedding层把每一个单词映射到一个词向量。encoder网络是由多个block堆叠起来的, 每个block有两层, Self-Attention层和全连接层。

image-20231207112835792

the cat sat on the mat. 输入有6个单词, embedding层把这两个单词映射成6个词向量, x1到x6。

encoder网络的输入是6个词向量x1到x6, 输出6个向量u1到u6。

image-20231207113044786

Bert的第一个任务是预测被遮挡的单词。随机遮挡一个或多个单词, 然后问神经网络被遮挡的单词是什么。

举例如下, 预测被遮挡单词, 具体这么做。把输入的第二个单词替换成mask符号, mask符号会被embedding层编码成词向量xm。把mask位置的输出记作词向量um。上节课讲过, transformer的encoder网络并不是1对1映射, 而是多对1映射。

image-20231207113459450

Um向量不仅仅依赖于Xm向量, 而是依赖于所有的x向量。Um在mask位置上, 但Um知道整个句子的信息, Um包含上下文信息, 所以可用Um来预测被遮挡的单词。

把Um作为特征向量输入到一个softmax分类器中。

image-20231207113732553

分类器的输出是概率分布p, 字典里每个单词都有一个概率值。通过概率值可以预测被遮挡的单词是什么。这个例子中遮挡的是cat这个单词。训练的时候希望分类器的输出p向量接近单词cat的one hot向量。

将cat的one hot向量记作e, e是groundtruth, 上面得到的向量p是分类器输出的概率分布, 希望预测接近ground truth, 也就是让p接近e。

把e和p的crossEntropy作为损失函数, 用反向传播算出损失函数关于模型参数的梯度。

image-20231207114122778

总结上述过程: bert会随机遮挡单词, 把遮住的单词作为标签, bert预训练不需要人工标注的数据。可以用任何书籍或维基百科作为训练数据,可以自动生成标签。这样一来训练数据要多少有多少, 可以训练出一个非常大的模型。

3、Predict the Next Sentences

给定第一个句子”calculus is a branch of math”

判断下一个句子是否是:”it was developed by newton and leibniz”

现在判断这两句话是否是原文中相邻的两句话。

假设第一个句子不变, 下一句换成这个句子: “panda is native to south central china”

可以这样准备训练数据, 把两句话拼接起来。两句话之间用[SEP]符号分开。在最前面放一个[CLS]符号占一个位置, [CLS]符号的意思是classification分类。

image-20231207115307320

生成训练数据的时候, 50%是原文中真实相邻的两句话, 另外50%的第二句话是从训练数据中随机抽取的句子。

image-20231207115533594

一条训练数据包含两句话, 两句话被分割成很多符号。最前面一个CLS符号占一个位置, 这个位置上的向量输出记作向量C。单词C并不只依赖于CLS, 向量C包包含了两句话的全部信息, 所以靠C就可以判断两句话是否是真实的相邻。

image-20231207115853171

将C作为特征向量输入到二分类器中。

image-20231207115928026

分类器的输出介于0到1之间的值, 1代表true, 分类器任务两句话是从原文中拿出来的。0代表false, 分类器认为两句话不相邻。可以用crossEntropy作为损失函数来衡量预测f与真实标签之间的区别。

有了损失函数就可以计算梯度, 然后用梯度下降来更新参数。

image-20231207141005003

这么做预训练有什么用呢?相邻两句话通常是有关联的。这样做二分类可以强化这种关联。让embedding的词向量包含这种关联。比如微积分和牛顿的词向量应该有某种关联, encoder网络有Self-Attention层,Self-Attention层的作用就是找到相关性。这种分类任务可以训练Self-Attention找到正确的相关性。

4、将两个任务结合

一个任务是预测遮挡单词, 一个任务是判断两句话是否真实相邻, bert把两个任务结合起来。

把两句话拼接起来, 然后随机遮挡15%的单词。这条被训练的句子里面碰巧有两个被遮挡的单词。

image-20231207141715193

一共有三个任务, 第一个任务是判断两句话是否真实相邻, 训练的时候标签为true。另外两个任务是预测被遮挡的两个单词, 标签是真实的单词。

而下面的句子中碰巧有一个被遮挡的单词,所以一共有两个任务。第二句话是随机抽到的, 所以标签为false。

image-20231207141943689

假设有两个单词被遮挡, 那么就有三个任务, 需要定义三个损失函数。目标函数是三个损失函数之和。

bert的好处是不需要人工标注数据, bert的两种标签都是自动生成的。

bert的计算量非常大。

image-20231207142310801