BERT
自监督学习是一种无标注的学习方式。由于其不使用标注的数据,它可以看作是一种无监督学习方法。有趣的是,自监督学习的模型大多是以芝麻街的角色命名
BERT
BERT 是一个 Transformer 的编码器,BERT 的架构与 Transformer 的编码器完全相同,里面有很多自注意力和残差连接、归一化等。
BERT 的输入是一段文字,接下来需要随即掩码一些输入文字,被掩码的部分是随机决定的。有两种方式实现掩码,第一种方法是用特殊符号替换句子里的单词,使用 “MASK” 来表示特殊符号;另一种方法是用另一个字随即替换一个字
如下图,掩码后,向 BERT 输入了一个序列,BERT 的相应输出就是另一个序列。接下来查看掩码部分的对应的输出,对这个输出的向量做线性变换(乘一个矩阵),然后做 softmax 并输出一个分布。输出是一个很长的向量,包含要处理的每个汉字,每个字对应一个分数,这个向量是 softmax 生成的分布。
BERT 的训练过程是这样的:由于 BERT 不知道掩码的实际字符,训练的目标是输出一个尽可能接近真实答案的字符,用 one-hot 编码表示该字符,并最小化输出和 one-hot 向量之间的交叉熵损失。这个问题可以看作一个分类问题,只是类的数量和汉字的数量一样多。在训练过程中,在 BERT 之后添加一个线性模型并将它们一起训练
训练 BERT 时,除了掩码之外,还有另一种方法:下一句预测。即从句子数据库中拿出两个句子,并在句子中间加入一个特殊 token [SEP] 来代表它们之间的分隔,这样 BERT 就可以知道这两个句子是不同的句子,我们还会在整个序列的最前面加入一个特殊 token [CLS],然后通过某种方式判断两个句子是否是相接的。由于该方法对 BERT 的提升微乎其微,本文不再赘述。
BERT 的使用方式
在训练时,让 BERT 学习两个任务。
• 把一些字符掩盖起来,让它做填空题,补充掩码的字符。
• 预测两个句子是否有顺序关系(两个句子是否应该接在一起),这个任务没什么用。
通过这两个任务,BERT 学会了如何填空。在训练模型填空后,也可以用于其他任务。如下图所示,这些任务不一定与填空有关,它可能是完全不同的东西. 尽管如此,BERT 仍然可以用于这些任务. 这些任务是真正使用 BERT 的任务,可称为下游任务
给 BERT 一些有标注的数据,它可以学习各种任务,将 BERT 分化并用于各种任务称为微调。在微调之前产生此 BERT 的过程称为预训练。要测试 BERT 的能力,通常会在多个任务上进行测试,不会只测试它在单个任务上的能力。可以让 BERT 分化做各种任务来查看它在每个任务上的正确率,再取平均值。对模型进行测试的不同任务的这种集合,可以将其称为任务集,任务集中最著名的基准测试称为通用语言理解评估(GLUE),这里面一共有 9 个任务,如果我们想知道 BERT 这样的模型训练的是否很好,可以针对 9 个单独的任务进行微调。因此,实际上会为 9 个单独的任务获得 9 个模型,这 9 个任务的平均准确率代表该自监督模型的性能。
BERT 究竟是如何使用的?接下来介绍下 4 个使用 BERT 的情况
情感分析
给机器一个句子,并让它判断句子是正面的还是负面的。给它一个句子,把 [CLS] 词元放在这个句子前面。[CLS]、$w_1$、$w_2$、$w_3$ 4 个输入对应 4 个输出。接着,对 [CLS] 对应的向量应用线性变换,将其乘上一个矩阵. 这里省略了 softmax,通过 softmax 来确定输出类别是正面的或负面的。值得一提的是,必须要有下游任务的标注数据。在训练时,线性变换和 BERT 模型都利用梯度下降来更新参数. 线性变换的参数是随机初始化的,而 BERT 初始的参数是预训练得出的,接着利用梯度下降来更新这些参数,最小化损失
词性标注
词性标注是指给定机器一个句子,其可以知道该句子中每个单词的词性。即使这个词是相同的,它也可能有不同的词性。向 BERT 输入一个句子,对于这句话中的每个词元都有一个对应的向量,然后把这些向量依次通过线性变换和 softmax 层,最后网络预测给定单词所属的类别。,注意要有一些带标签的数据,这仍然是一个典型的分类问题,同时,BERT 的初始参数也是预训练的权重
自然语言推理
给机器两个输入语句:前提和假设。机器所做的是判断是否可以从前提中推断出假设,即前提与假设是否矛盾。给定两个句子,这两个句子之间有一个特殊的 token [SEP],并把 [CLS] 词元放在最前面,这就是 BERT 的输入,然后 BERT 将输出另一个长度相同的序列,但只将 [CLS] 词元作为线性变换的输入,然后决定这两个句子之间的类别。它仍需要标注的数据对模型进行训练,同时,BERT 的初始参数也是预训练的权重
基于提取的回答
简单的问答系统,给机器读一篇文章,问它一个问题,它就会回答一个答案,假设这个答案必须出现在文章里面,即答案一定是文章中的一个片段,这就叫基于提取的回答。在此任务中,输入序列包含一篇文章和一个问题,它们都是序列:
$$
D = {d_1, d_2,···, d_N}
$$
$$
Q ={q_1, q_2,···, q_N}
$$
对于中文,该式每个 d 代表一个汉字,每个 q 代表一个汉字。将 D 和 Q 放入问答模型中,希望它输出两个正整数 s 和 e,根据 s 和 e 可以直接从文章中截出一段就是答案,即文章中第 s 个单词到第 e 个单词的片段就是正确答案,例如下图
与自然语言推理相似,给 BERT 看一个问题、一篇文章,问题和文章之间用 [SEP] 隔开,然后在开头放置 [CLS] 词元。在此任务中,我们唯一需要从头开始训练(随机初始化)的只有两个向量,这两个向量的长度与 BERT 的输出是相同的。
如何使用这两个向量呢,如下图(a)所示,首先计算橙色向量与文档对应的输出向量的内积,然后将它们传递给 softmax 函数,最大的输出即为答案的起始位置。同理计算蓝色向量,得到答案的结束位置。那么蓝色向量和橙色向量有什么区别呢,损失函数是由开始位置的偏差和结束位置的偏差共同决定的,$L=L_{strat}+L_{end}$,想要损失函数最小,就要同时考虑开始位置和结束位置,一个向量只负责降低开始 loss,另一个向量只负责降低结束 loss,最终模型会让两个 loss 都尽量小。它仍需要标注的数据对模型进行训练,同时,BERT 的初始参数也是预训练的权重,但蓝色和橙色向量是随机初始化的。
















