10. BERT预训练模型

一、Bert 模型

  BERT(Bidirectional Encoder Representations from Transformers)是由 Google 于 2018 年提出的一种语言预训练模型。其核心创新在于采用 Transformer 的 编码器(Encoder) 结构,通过双向自注意力机制,在建模每个 token 表示时同时整合左右两个方向的上下文信息,从而获得更准确、更丰富的语义表示。在得到每个 token 的表示后,BERT可通过添加简单的任务特定层,适配不同类型的下游任务。

BERT模型

  BERT 的设计更侧重于自然语言理解类任务,广泛应用于文本分类、序列标注、句子匹配等场景。模型发布后,在多个语言理解基准测试中取得了前所未有的领先成绩,推动 NLP 研究全面转向“预训练 + 微调”的通用建模范式。

  BERT 基于 标准的 Transformer 编码器 构建,其提供了两种模型规模,分别是 BERT-base 和 BERT-large。

模型版本 层数(Layers) 模型维度(d_model) 注意力头数(Heads) 参数量
BERT-base 12 768 12 1.1 亿
BERT-large 24 1024 16 3.4 亿

  BERT 模型各部分的结构细节如下:

【1】、输入表示层

  BERT 的每个输入 token 表示由三部分嵌入相加组成:

  • Token Embedding:词本身的语义表示。
  • Position Embedding:表示 token 在序列中的位置,为可学习向量。
  • Segment Embedding:用于区分句子对任务中的两个句子,分别用一个可学习的向量表示。

输入表示层

  此外,BERT 输入中通常包含两个特殊符号:

  • [CLS]:句首标志,其输出向量常用于下游的文本分类任务。
  • [SEP]:句间分隔符,出现在每个句子末尾。

【2】、编码器

  编码器结构同原始 Transformer 相同

【3】、输出层

  根据下游任务的类型,BERT 可以接入不同的任务输出头:

  • Token-Level 任务(如命名实体识别):使用每个位置的输出表示。
  • Sequence-Level 任务(如文本分类、句子对分类):使用特殊 token [CLS] 的输出表示,输入时被加在序列开头,专门用于汇总整个序列的语义信息。

二、预训练

  BERT 的预训练阶段包含两个核心任务:掩码语言模型(Masked Language Modeling, MLM)和 下一句预测(Next Sentence Prediction, NSP),分别用于学习词级语义和句间逻辑关系。

【1】、掩码语言模型(MLM)

  为实现双向语言建模,BERT 不采用传统的从左到右或从右到左预测方式,而是引入了掩码语言模型。在训练中,BERT 会随机遮盖输入序列中约 15% 的 token,并训练模型根据上下文预测被遮盖的词。遮盖策略如下:

  • 80% 的被遮盖 token 替换为 [MASK]。
  • 10% 替换为 随机词。
  • 10% 保持 原词不变。

  这种机制让模型在预训练时既能看到左侧上下文,也能看到右侧上下文,真正实现深度双向建模。

掩码语言模型

【2】、下一句预测(NSP)

  为了提升模型理解句间关系的能力,BERT 引入了“下一句预测”任务。训练时模型接收两个句子,判断第二句是否是第一句的真实后续句,其中:

  • 50% 的训练样本是上下文中真实相邻的句子(正例)。
  • 50% 是从语料中随机采样的非相邻句子(反例)。

  在预训练时,BERT 同时优化 MLM 和 NSP 两个目标,具体操作如下图所示:

下一句预测

三、微调

  在预训练完成后,BERT 可通过少量微调适配多种下游任务,如文本分类、句子匹配、问答系统、序列标注等。微调时,模型主体结构保持不变,仅在顶部添加一个任务特定的输出层,并使用下游任务数据对整个模型进行训练。BERT 的输入格式在微调阶段基本保持与预训练一致,仍以 token 序列为输入,使用 [CLS] 和 [SEP] 等特殊符号。不同任务的差异主要体现在输出层设计,以及从模型输出中提取哪些表示进行预测。

  下面分别介绍 BERT 在四类典型任务中的微调方式:

【1】、句子对分类任务

  • 输入格式:[CLS] 句子1 [SEP] 句子2 [SEP]
  • 输出方式:使用 [CLS] 的输出向量接入线性层进行分类,用于判断两个句子之间是否存在重复、蕴含、矛盾等关系。

句子对分类任务

  • MNLI:Multi-Genre Natural Language Inference,多类别句子蕴含判断
  • QQP: Quora Question Pairs,问句语义重复判断
  • QNLI: Question Natural Language Inference ,判断句子是否为问题的答案
  • STX-B: Semantic Textual Similarity Benchmark,语义相似度回归
  • MRPC: Microsoft Research Paraphrase Corpus,句子复述判断
  • RTE: Recognizing Textual Entailment,二分类蕴含判断
  • SWAG: Situations With Adversarial Generations,多项选择填句任务

【2】、单句分类任务

  • 输入格式:[CLS] 句子 [SEP]
  • 输出方式:同样使用 [CLS] 的输出向量,经过线性层用于情感极性判断、语法可接受性判断等。

单句分类任务

  • SST-2: Stanford Sentiment Treebank (binary),情感极性判断(二分类)
  • CoLA: Corpus of Linguistic Acceptability,语法可接受性判断(二分类)

【3】、问答任务

  • 输入格式:[CLS] 问题 [SEP] 段落 [SEP]
  • 输出方式: 模型不会使用 [CLS] 向量,而是对每个 token 分别预测其作为答案起始位置和结束位置的概率。最终根据得分确定答案在段落中的位置范围,从中直接抽取连续的答案文本。

问答任务

  • SQuAD v1.1:Stanford Question Answering Dataset 抽取式问答(起止定位)

【4】、序列标注任务

  • 输入格式:[CLS] 句子 [SEP]
  • 输出方式:对每个 token 的输出向量单独进行分类,例如判断是否为人名(B-PER)、地名(B-LOC)等。

序列标注任务

  • NER:Named Entity Recognition,命名实体识别
posted @ 2026-10-14 21:50  星光映梦  阅读(3)  评论(0)    收藏  举报