BERT预训练过程


BERT(Bidirectional Encoder Representations from Transformers)的预训练过程是其能够在众多自然语言处理任务中取得优异性能的关键。主要包括以下两个阶段:

1. 无监督预训练阶段

  • 数据准备

    • BERT使用大规模的文本语料进行预训练。这些语料来源广泛,例如维基百科、书籍、新闻文章等。在将文本输入模型之前,会对文本进行预处理,包括分词(将文本分割成单词或子词单元)。例如,对于英文文本,会使用WordPiece等分词方法,像“playing”可能会被分为“play”和“##ing”。
    • 同时,会构建输入格式,通常是将两个句子拼接在一起,中间用特殊标记[SEP]分隔,整个序列开头有一个特殊标记[CLS],用于表示序列的分类任务相关信息。
  • 预训练任务

    • Masked Language Model (MLM)
      • 这是BERT预训练的核心任务之一。在输入文本中,会随机地将一些单词(token)替换为特殊的[MASK]标记。例如,对于句子“The dog is running in the park”,可能会将“running”替换为[MASK],变成“The dog is [MASK] in the park”。
      • 模型的任务就是预测这些被掩盖的单词。在训练过程中,模型会根据句子的其余部分以及位置和句子段信息,通过多头注意力机制(Multi - Head Attention)和前馈神经网络(Feed - Forward Network)等组件,输出每个被掩盖位置上单词的概率分布。然后,根据真实的单词标签计算损失函数(通常是交叉熵损失),并通过反向传播来更新模型的参数。
      • 例如,对于上述被掩盖的句子,模型会输出一个关于词汇表中所有单词在“[MASK]”位置出现概率的向量,如“running”可能被预测为概率最高的单词,这就促使模型学习到单词之间的语义和语法关系。
    • Next Sentence Prediction (NSP)
      • 这个任务用于学习句子之间的关系。对于输入的两个句子(句子A和句子B),模型需要判断句子B是否是句子A的下一句。
      • 在训练数据中,一半的情况下句子B是句子A的下一句(正例),另一半情况句子B是从语料库中随机选取的(负例)。例如,句子A是“I like reading books”,句子B是“Books can expand our knowledge”(正例);而如果句子B是“The sky is blue”(负例)。
      • 模型会根据[CLS]标记对应的输出向量,通过一个简单的分类器(通常是一个全连接层)来预测两个句子是否是相邻的关系,同样通过交叉熵损失来进行训练。这个任务有助于BERT在处理需要理解句子对关系的任务时,如问答系统、文本蕴含等任务,表现得更好。

2. 微调阶段(Fine - Tuning)

  • 任务适配

    • 在预训练完成后,BERT模型可以针对各种具体的自然语言处理任务进行微调。例如,对于情感分析任务,会在BERT模型的最后一层输出上添加一个特定的分类层。如果是一个二分类的情感分析任务(如正面或负面情感),这个分类层可能是一个简单的全连接层,将BERT的输出向量映射到两个类别上。
    • 对于命名实体识别(NER)任务,会在BERT的输出上添加一个序列标注层,用于预测每个单词(token)所属的实体类别,如人名、地名、组织名等。
  • 微调训练

    • 在微调过程中,使用特定任务的标记数据。以情感分析为例,标记数据包含带有正面或负面情感标签的句子。利用这些数据,模型会在预训练模型的基础上,进一步调整参数,以适应具体任务的要求。
    • 微调时通常会使用较小的学习率,因为预训练模型已经学习到了大量的通用语言知识,只需要对其进行微调以适应特定任务的细节。在这个阶段,损失函数也是根据具体任务来定义的,如在分类任务中仍然使用交叉熵损失,在序列标注任务中使用适合序列标注的损失函数(如CRF - based损失函数)。通过微调,BERT能够在各种自然语言处理任务中取得很好的性能。