前言
如果说,让我选Transformer架构的哪个模型最深入人心,我将毫不犹豫的选择BERT!
BERT 的意义在于,从大量无标记的数据集中训练得到的深度模型,可以限制提高各项自然语言处理任务的准确率。
BERT 在当时,几乎刷新了自然语言图段、问答及命名实体识别等11项自然语言处理任务上的表现,甚至在 SQuAD 问答测试中,超过了人类表现。
SQuAD(Stanford Question Answering Dataset)是一种机器阅读理解(Machine Reading Comprehension, MRC)任务,主要目标是根据给定的文本段落回答问题。
BERT 被认为是近年来优秀预训练语言模型的集大成者,参考了 ELMo 的双向编码器思想,借鉴了 GPT 使用 Transformer 做特征提取器的思想,而且采用 word2vec 使用的 CBOW 训练方法。
BERT 影响深远,在 BERT 之前,可能很多自然语言任务还是使用小数据集在小模型上训练出一个只能做一些"小事"的模式;BERT问世之后,NLP的走向使用大数据集在一个大的深度模型上训练器解决所用通用任务的模式。
也是BERT出现之后,很多的预训练语言模型如雨后春笋般不断涌现,天下英雄如过江之鲫,在不同的领域和场景体现出了更好的性能。
BERT(Bidirectional Encoder Representations from Transformers, 来自 Transformers 的双向编码器表示)强调的是双向编码器,强调的是文本理解,但也失去了文本生成能力,所以区别于对标的 GPT 系列。
GPT系列是是用 Transformer Decoder(相比于 BERT 的 Encoder 的区别是 Masked Multi-Head Attention) 作为特征提取器,即当前的语义由前序词决定,强调因果,强调文本生成,但是语义理解欠佳。
BERT 出生在 GPT 之后,他的创新点是用 Encoder 作为特征提取器,并加入双向掩码的训练方法,使得每个词利用了所有的上下文信息,而不是像单向编码器那样,只能利用前序信息,所以语义信息提取能力更强。
1. BERT 结构
BERT 是由堆叠的 Transformer Encoder 层堆叠而成的网络,并在输入侧加入词编码和位置编码。BERT 的结构如图所示
GPT 的 Masked Multi-Head Attention 变成 Multi-Head Attention 就是 BERT。
在模型参数上,L 表示 T transformer Block 层数,H 表示特征向量的维数,A 表示 Self- Attention 的头数,BERT 的两个版本如下
其中,BERT_BASE 对标于初代 GPT,证明双向编码器比单向编码器在语义理解上更有优势,量化 BERT 与 GPT 的核心差异带来的影响。而BERT_LARGE 就是为了自己冲榜了。以下是 BERT 的表现
可以看出,
- GPT 几乎在所有任务上都比 ELMo 好,这说明 Transformer 比 LSTM 作为特征提取器更好。
- 而 BERT_BASE 又比 GPT 在所有任务上几乎都好,这说明双向编码的语义理解能力更强。
- BERT_LARGE 又比 BERT_BASE 好,说明随着 BERT 参数量的增大,模型在搜有任务上的表现都有明显提升。
2.预训练任务
BERT 采用了二段式的训练方法,第一阶段使用大量的无标签的预料预训练,第二阶段根据指定任务的少量标签进行微调训练。
2.1 MLM(Masked Language Model)
BERT 使用 Transformer 作为特征提取器的原因是,作者认为,使用 从左向右和从右向左编码的单向编码器拼接而成的双向编码器,不如直接使用深度的双向编码器强大。
BERT 借助完形填空任务和 CBOW 的思想,采用 MLM 方法训练模型。具体来说就是随机选取部分词进行掩码,让 BERT去预测这些掩码词。通过根据上下文信息预测掩码词的方式,BERT 具有了基于不同上下文提取更准确的语义信息的能力。
具体来说,在训练中,掩码词被替换为[MASK]的概率是 15%。为了缓解输入文本分布偏差,BERT 不总是总用 MASK 替换掩码词,而是按照一定比例选取替换词。选取 15% 的词作为掩码词之后,这些掩码词有三类选项。
- 80% 的训练样本中,用 [MASK] 作为替换词
- 10% 的训练样本中,不做任何处理。(缓解训练文本与预测文本的片擦好带来的性能损失)
- 10% 的训练样本中,从模型此表中随机替换。(让 BERT 学会纠错能力)
而且这些比例不是作者随意规定的,而是经过实验得出的
2.2 NSP
很多下游任务,如问答和自然语言推断,都基于两个句子做逻辑推理,而语言模型不具备直接捕捉句子间语义联系的能力。为了学会捕捉句子间的语义联系,BERT 采用 NSP 作为无监督预训练的一部分。
具体而言,BERT的输入有两个句子组成,其中 50% 概率将语义连贯的两个句子作为训练样本,另外 50% 使用完全随机的两个句子作为训练文本。
BERT 需要根据输入的两个句子,判断他们是否为真实的连续句对。
其中[SEP]是分隔符,用于区分句子,[CLS]对应的输出向量为句子整体的语义表示,用于类别预测,若结果为1,表示是连续句子,结果为0,表示非连贯。
2.3 输入表示
真实训练中,以上两种方法是混合在一起使用的,。
Self-Attention 不会考虑词的位置信息,因此 Transformer需要两套 embedding 操作,一套是 One-hot 词表映射编码(Token Embedding),另一套是位置编码(Position Embedding)。同时,由于 MLM 训练过程中,存在单句输入和双句输入的情,因此 BERT 还需要一套区分输入语句的分割编码(Segment Embedding)
BERT的样例数据的原始输入要经过 5 步才能得到最终的 BERT 输入表示
- 获得原始的输入句对"我的狗很可爱"和“他喜欢玩”
- 对输入句子使用 WordPiece 分词,变成 "我 的 狗 很 可爱"和“他 喜欢 玩”
- 将句对拼接并加上用于分类的特殊标签符和分类符,得到"[CLS] 我 的 狗 很 可爱 [SEP] 他 喜欢 玩 [SEP]"
- 计算每个词的 Position Embeddings, Segment Embeddings 和 Token Embeddings
- 将桑哥 Embedding 表示相加,得到最终的 BERT 输入表示。
Transformer 中位置编码是正余弦位置编码,而 BERT 使用的位置编码和分割编码均为预训练中学习得到的编码,所以表示位置信息的能力更强
3. 微调训练:适应下游任务
3.1 句对分类
给定两个句子,判断他们的关系,统称为句对分类。
针对句对分类任务,BERT 在预训练过程中就做好了充分准备,使用NSP训练方法获得了直接捕获句对语义关系的能力。
针对二分类任务,BERT不需要对输入数据和输出数据做任何改动,直接使用NSP训练方法一样的输入和输出结构即可。
- 具体来说,句对用 [SEP] 拼接成输入文本序列,在句首加入label [CLS],将句首标签所对应的输出值作为分类标签,计算预测分类标签与真实分类标签的交叉上,将其作为优化目标,在任务数据上进行微调训练。
针对多分类任务,需要在句首标签[CLS]的输出特征向量后拼接一个全连接层与Softmax层,保证输出维数与类别数目一致,即可通过 argmax 操作得到对应的类别结果。
3.2 单句分类
给定一个句子,判断句子类别,统称为单句分类。
针对单据分类任务,虽然BERT 没有在预训练过程中专门优化,但是NSP训练方法让BERT学会累用分类标签[CLS]捕获句对关系,也学会了提取并整合单句语义信息的能力。
对单句二分类任务,无须对BERT的输入数据和输出数据的结构进行改动,依旧用句首标签[CLS]的输出特征作为分类标签,计算分类标签与真实标签的交叉熵作为优化目标。
针对多分类任务,需要在句首的[CLS]的输出特征向量后加一个全连接层和Softmax层,保证输出维数与类别数目一致。
5.3 文本问答
给定一个问句和一个蕴含答案的句子,找出答案在后者中的位置,称为文本问答。
文本问答任务和之前的任务有较大差别,无论是在优化目标还是输入数据和输出数据的形式上。
为了标注答案的起始位置和终止位置,BERT 引入了两个辅助向量——s 和 e,其中向量 s(start) 用于判断答案的起始位置,向量 e(end) 用于判断答案的终止位置。BERT 判断句子 B 中答案位置的做法是:将句子 B 中的每一个词得到的最终特征向量经过全连接层后,分别与向量 s 和 e 做内积,对所有的内积分别进行 Softmax 操作,得到词 Tok m 作为答案起始位置和终止位置的概率。最后,取概率最大的片段为最终的答案。
文本问答任务的微调训练用到了两个技巧:先用全连接层将 BERT 提取后的深层特征向量转化为用于判断答案位置的特征向量,在微调训练中,该全连接层的变化最显著;其次,引入辅助向量 s 和 e 作为答案的起始位置和终止位置的基准向量,明确优化目标的方向和度量方法。
3.4 单句标注
给定一个句子,标注每个词的label,称为单句标注。常见任务为 CoNLL 2003,给定一个句子,标注句子的人名、地名和机构名。
单句标注任务和 BERT 预训练任务有较大的差异,但与文本问答任务较为相似。
在进行单句标注任务时,需要在每个词的最终语义特征向量之后添加全连接层,将语义特征转化为序列标注任务所需特征。与文本问答不同的是,单句标注任务需要对每个词都做标注,无须横向对比,即不需要引入辅助向量。直接对讲过全连接层后的结果做 Softmax 操作,即可得到各类标签的概率分布。
参考:
- 《预训练语言模型》邵浩 刘一烽
- https://arxiv.org/abs/1810.04805