💡动手学深度学习·NLP篇 · 第15章

15.8 来自 Transformers 的双向编码器表示(BERT)

本节将结合理论背景、模型架构、PyTorch 实现、工程解读等角度,全面拆解 BERT 的核心思想与设计理念。


一、背景:从上下文无关到上下文相关

早期的词向量模型(如 Word2Vec、GloVe)为每个词分配一个固定的稠密向量,不论其上下文环境。例如:

  • “crane” 在“起重机司机来了”和“crane 飞过天空”中使用同一个向量表示。

这种 上下文无关性 导致模型难以理解多义词和语境依赖,因此引发了一系列上下文相关表示方法的诞生。

🧠 理论理解:
传统词嵌入模型(如 Word2Vec/GloVe)将每个词映射为固定向量,忽略上下文含义,导致“多义词”被混淆处理(如“bank”既可表示银行也可表示河岸)。
上下文相关表示(如 ELMo)则允许根据上下文变化动态生成词向量。

🏢 企业实战理解:
在金融 NLP 系统中(如蚂蚁金服的票据识别),同一个“bill”可以表示账单或法案。静态词向量误判率高,而使用 ELMo 或 BERT 可以显著提升上下文语义判别准确性。

✅ 面试题 1:BERT 与传统词向量模型(Word2Vec、GloVe)有何根本性区别?

答:

传统词向量如 Word2Vec 和 GloVe 是上下文无关的,它们为每个词生成一个静态向量,语义不随上下文变化。

BERT 引入了上下文相关表示机制,每个 token 的向量由其左右上下文共同决定(通过双向 Transformer 编码),支持多义词 disambiguation,是一种动态表示。

🧠 场景题 1:评论情感分析模型鲁棒性问题

📌 背景:你负责字节跳动某短视频的评论情感分析系统,发现模型在面对多义词时预测不准确,如“好野”被误判为“夸赞”,但上下文其实表达“太离谱了”。

❓ 面试官提问:

你会如何提升情感识别对上下文的理解能力?是否可以用 BERT 优化当前模型?

✅ 回答思路:

  • 当前模型使用静态词向量,无法处理语境中的多义词

  • 引入 BERT,使用双向上下文编码,词义将随语境动态调整

  • 微调方案:以评论文本为输入,使用 [CLS] 位置的向量接全连接分类器进行情感预测

  • 可引入领域数据继续做 MLM 预训练,提升语义拟合度

🔧 工程延伸(加分点):

  • 利用 user profile / 弹幕上下文作为 Segment B,形成跨句建模

  • 对噪声评论进行对比学习(如 SimCSE),增强语义区分能力


二、上下文相关词表示的演进

双向的意思:

模型 架构 特点 缺点
ELMo 双向LSTM 上下文相关 架构特定
GPT Transformer 解码器 与任务无关 单向编码(左→右)
BERT Transformer 编码器 双向上下文、任务无关 预训练成本高

BERT(Bidirectional Encoder Representations from Transformers)是 Google 于 2018 年提出的一种统一、强大、迁移性强的深度表示模型。

🧠 理论理解:
传统模型如 ELMo 需要为不同任务(情感分析、NER、问答)定制不同架构。GPT 和 BERT 打破这种限制,用统一的模型进行预训练,通过微调即可适应各种任务。

🏢 企业实战理解:
在字节跳动 NLP 中台项目中,统一使用 BERT 对多个任务(短视频推荐标签分类、评论理解、客服回复意图识别)做微调,无需设计专用网络,极大提升了模型复用与研发效率。

✅ 面试题 2:BERT 与 GPT、ELMo 的核心差异是什么?

答:

模型 编码方式 是否双向 是否任务无关 是否微调
ELMo BiLSTM ❌(任务特定结构) ❌(冻结)
GPT Transformer Decoder ❌(单向) ✅(全模型微调)
BERT Transformer Encoder ✅(全模型微调)

简要概括:

  • GPT:左→右单向语言模型

  • ELMo:双向 LSTM + 任务定制

  • BERT:双向编码 + 通用任务结构 + 全模型微调

🧠 场景题 2:对话系统中问句匹配不准确

📌 背景:在阿里小蜜问答系统中,用户提问“我怎么退货”,匹配到了“如何申请换货”的答案,导致用户体验差。

❓ 面试官提问:

如何利用 BERT 构建更精准的问句语义匹配系统?

✅ 回答思路:

  • 使用 BERT 输入问句对(Query + 候选问题),句对形式 [CLS] Q1 [SEP] Q2 [SEP]

  • 以 [CLS] 的输出作为句对表示,接 softmax 分类为“匹配 / 不匹配”

  • 可训练专用语料集微调 BERT,使其学习问句重构语义

🔧 工程延伸:

  • 引入 hard negative 策略进行对比学习提升判别边界

  • 结合 FAQ 候选池做向量索引优化,用 Faiss 快速检索 top-k 再做 BERT rerank

Bert分为两部分:
1.预训练和微调


三、BERT 的三大技术突破

🔸 1. 双向编码器(Bidirectional)

BERT 使用双向 self-attention,对每个 token 同时考虑其左侧与右侧上下文。

🔸 2. 掩码语言建模(Masked LM)

随机遮盖 15% 的词汇,并用上下文去预测它,打破了传统语言模型必须按序生成的问题。

🔸 3. 下一句预测(NSP)

判断两个句子是否在原文中相邻,引入句间逻辑建模。

🧠 理论理解:
BERT = 双向 Transformer 编码器 + 掩码语言建模 + 下一句预测
相比 GPT(单向)、ELMo(任务特定),BERT 结构通用、上下文建模能力强,成为 NLP 表示学习的核心基石。

🏢 企业实战理解:
腾讯 AI Lab 使用 BERT 微调后的模型,用于智能客服、舆情监测、对话生成等多个任务,实现模型统一化部署与跨任务迁移,显著缩短上线周期。

✅ 面试题 3:为什么 BERT 使用的是掩码语言模型(Masked LM)而不是传统语言模型?

答:

传统语言模型(如 GPT)只能左到右生成,右侧信息对当前词的预测不可用。

BERT 通过掩码语言模型(MLM)训练,让模型可以利用双向上下文,获得更丰富的语义表示。它打破了自回归结构限制,使得所有 token 都能从完整上下文中建模。

🧠 场景题 3:命名实体识别模型泛化能力弱

📌 背景:你在百度地图数据系统中开发 NER 模型。用户输入“我在沙河高教园地铁站附近”时,模型无法识别“沙河高教园”是地名。

❓ 面试官提问:

如何通过 BERT 改进该场景的实体识别性能?

✅ 回答思路:

  • 当前模型可能基于 BiLSTM-CRF + 静态词向量,无法感知上下文细节

  • 使用 BERT 将每个 token 表示为上下文相关向量

  • 将每个 token 的输出连接 softmax 分类层预测标签(B/I/O)

  • 可结合 CRF 层进一步建模标签依赖

🔧 工程延伸:

  • 引入“拼音、字形、词边界”作为额外 embedding(适合中文)

  • 对地名进行外部词典增强,用于训练阶段辅助监督或构造 weak label


四、BERT 输入设计与嵌入结构

BERT 支持两种输入格式:

  • 单句输入[CLS] 句子 [SEP]

  • 句对输入[CLS] 句子A [SEP] 句子B [SEP]

每个位置的最终输入嵌入由三部分组成:

InputEmbedding = TokenEmbedding + SegmentEmbedding + PositionEmbedding
  • TokenEmbedding:词嵌入

  • SegmentEmbedding:区分 A/B 句子

  • PositionEmbedding:位置编码(可学习)

🧠 理论理解:
BERT 输入包括 TokenEmbedding(词向量)、SegmentEmbedding(句子区分)与 PositionEmbedding(可学习位置编码),解决了 Transformer 缺乏顺序感的问题。

🏢 企业实战理解:
在百度搜索语义匹配系统中,Query 与候选文档构成句对输入,通过 SegmentEmbedding 区分 query/document,提高句对级别语义建模能力。

✅ 面试题 4:BERT 的预训练为什么还要加“下一句预测”(NSP)任务?

答:

NSP 设计用于建模句子对之间的逻辑关系,例如自然语言推理、问答系统中的问题与答案是否匹配。

该任务帮助模型理解跨句子的依赖关系和上下文流转,在句对分类任务(如 NLI、对话匹配)中显著提升效果。

🧠 场景题 4:电商搜索中的 query 混淆问题

📌 背景:在京东搜索系统中,用户搜索“苹果13”,系统误将其匹配为“水果苹果 13件装”,结果页面不相关。

❓ 面试官提问:

如何用 BERT 判断 query 与商品标题的真实语义相关性?

✅ 回答思路:

  • [CLS] Query [SEP] Title [SEP] 输入 BERT,判定语义相似度(回归/分类)

  • 加入商品属性/品类字段作为额外 token 提供上下文增强

  • 微调时加入 query 改写 / 错配样本增强鲁棒性

🔧 工程延伸:

  • 可训练二值分类器(是否点击/是否购买)与商品历史行为联合优化

  • 融合多模态信息,如商品图像、销量等作为多任务并联输入


五、BERT 模型架构简析

BERT 基于 多层 Transformer 编码器堆叠结构

class BERTEncoder(nn.Module):
    ...
    self.token_embedding = nn.Embedding(vocab_size, num_hiddens)
    self.segment_embedding = nn.Embedding(2, num_hiddens)
    self.pos_embedding = nn.Parameter(torch.randn(1, max_len, num_hiddens))
    ...

🧠 理论理解:
通过随机遮盖15%的 token 并预测其真实值,模型学会理解任意位置词汇的语义,而非依赖固定上下文方向。

🏢 企业实战理解:
在网易云音乐评论情感分析中,MLM 训练使模型能理解模糊语义片段,如“emmm…”、“有点意思”,提升对非结构化短语的感知能力。

✅ 面试题 5:BERT 的输入是如何构造的?嵌入结构有哪些组成?

答:

BERT 输入格式为:

[CLS] 句子A [SEP] 句子B [SEP]

嵌入结构包含三部分:

  1. Token Embedding:词嵌入

  2. Segment Embedding:区分句子 A/B(0/1)

  3. Position Embedding:可学习的位置编码

最终输入为三者之和,确保模型感知词语、位置与句子层次结构。


六、预训练任务详解

1️⃣ 掩码语言模型(Masked LM)
  • 随机遮盖输入的15% token

    • 80% 替换成 <mask>

    • 10% 替换为随机 token

    • 10% 保持原词

  • 模型目标是通过上下文预测被遮盖的词

class MaskLM(nn.Module):
    ...
    def forward(self, X, pred_positions):
        ...
        mlm_Y_hat = self.mlp(masked_X)
        return mlm_Y_hat

🧠 理论理解:
NSP 任务训练模型判断句子间是否相邻,增强了 BERT 在问答系统、自然语言推理等任务中的跨句建模能力。

🏢 企业实战理解:
美团智能客服系统中,使用 NSP 优化“问题 → 答案”对的匹配质量,避免语义不连贯或逻辑冲突的自动回复出现。

✅ 面试题 6:BERT 如何进行迁移到下游任务?是冻结还是微调?

答:

BERT 在迁移阶段通常采用 “全模型微调”策略,即:

  • 保留预训练参数初始化

  • 添加少量输出层(如分类器、CRF等)

  • 在下游任务数据上对全模型进行微调(包括 Transformer 层)

相比 ELMo 的“冻结语义层 + 外部模型训练”,BERT 微调效果更强,训练流程更统一。


2️⃣ 下一句预测(Next Sentence Prediction)
  • 一半正样本:B 是 A 的下一句

  • 一半负样本:B 是随机句子

  • 输入使用 [CLS] token 的表示进行二分类

class NextSentencePred(nn.Module):
    ...
    def forward(self, X):
        return self.output(X[:, 0, :])

🧠 理论理解:
BERT 是由编码器(TransformerEncoder)+ 掩码语言模型预测层(MLM)+ 下一句预测层(NSP)组成的端到端模型。训练中两个任务的损失线性组合,模型参数整体参与优化。

🏢 企业实战理解:
在阿里小蜜问答系统中,BERT 作为统一语义编码 backbone,替代传统规则系统,在意图分类和问答匹配两任务中只需添加少量微调层即可达到效果 SOTA。


七、BERT 预训练模型整合

class BERTModel(nn.Module):
    def __init__(...):
        self.encoder = BERTEncoder(...)
        self.mlm = MaskLM(...)
        self.nsp = NextSentencePred()

    def forward(...):
        encoded_X = self.encoder(...)
        mlm_Y_hat = self.mlm(encoded_X, pred_positions)
        nsp_Y_hat = self.nsp(self.hidden(encoded_X[:, 0, :]))
        return encoded_X, mlm_Y_hat, nsp_Y_hat

最终损失函数为:

loss = MLM_Loss + NSP_Loss

🧠 理论理解:
BERT 的提出标志着“预训练 → 微调”范式的正式确立。它打破了任务隔离、结构定制的壁垒,让 NLP 系统的构建走向统一建模。

🏢 企业实战理解:
BERT 类模型已成为当前大模型体系的“语义底座”,无论是 ChatGPT 背后的 T5/BLOOM,还是国内的讯飞星火、阿里通义千问等,几乎都源自 BERT 的设计哲学。

✅ 面试题 7:BERT 输入中 token 被 mask 的时候为啥不是总用 [MASK]?

答:

为了缓解预训练与微调的不一致,BERT 使用如下策略对被选中预测的 token:

  • 80% 替换为 [MASK]

  • 10% 替换为随机 token

  • 10% 保持不变

这样可以防止模型“过拟合”于 [MASK] 的上下文,从而增强鲁棒性与泛化能力。


八、BERT 在 NLP 中的价值与应用

  • 通用性强:同一个预训练模型适配多任务(问答/NER/文本分类等)

  • 效果强大:在 11 项 NLP 任务中刷新 SOTA

  • 迁移灵活:通过少量微调即可达到良好效果

BERT = NLP 世界的 “ImageNet” + “ResNet”

✅ 面试题 8:BERT 能否作为生成式语言模型使用?为什么?

答:

BERT 本身不能直接用于生成任务(如文本生成、对话生成),因为其设计是双向非自回归的,所有位置同时可见,不适合按序生成。

若要用于生成场景,需要:

  • 结构改造(如 Encoder-Decoder)

  • 使用 BERT 初始化 encoder,结合 decoder(如 T5、BART)


九、小结

  • 传统词向量上下文无关,BERT 实现双向上下文感知

  • BERT 输入由 token + segment + position 构成

  • 预训练目标包括 MLM 与 NSP

  • BERT 开创了通用预训练 + 微调的 NLP 新范式

  • PyTorch 实现中采用模块化编码器 + 任务头组合结构

✅ 面试题 9:如何衡量 BERT 的表示能力是否优于其他模型?

答:

可以通过以下方式评估:

  1. 多任务迁移性能:在 SQuAD、MNLI、CoLA、NER 等任务的表现

  2. 相似度测试:词对/句对 embedding 的相似度是否符合语义

  3. 聚类可视化:t-SNE 结果能否展现清晰语义分布

  4. 下游任务微调效率:是否能用较小数据微调得到好结果


🔄 十、思考题

  1. 为什么 BERT 使用的是“掩码语言建模”,而不是传统的自回归语言模型?

  2. BERT 为什么要使用“下一句预测”?这对哪些任务有帮助?

  3. 可学习的位置嵌入与原始 Transformer 使用的正弦位置编码有何优劣?

  4. 你能设计一个不依赖 NSP 的预训练任务来替代 NSP 吗?

✅ 面试题 10:你能否手写一个 BERT 的前向流程结构?

答:

Input:
  [CLS] + TokenA + [SEP] + TokenB + [SEP]
↓
Input Embedding:
  TokenEmbedding + SegmentEmbedding + PositionEmbedding
↓
Transformer Encoder(多层 self-attention + FFN)
↓
输出:
  - 每个 Token 的上下文表示(for MLM)
  - [CLS] 表示(for NSP / classification)
↓
Output Heads:
  - MLM Head(预测被mask词)
  - NSP Head(预测句子对是否连续)

🧠 场景题 5:推荐系统中用户行为序列建模

📌 背景:在快手推荐系统中,你被要求建模用户的点击序列以预测下一个可能感兴趣的视频。

❓ 面试官提问:

BERT 是 NLP 的模型,为什么可以用于序列建模?你会怎么改造?

✅ 回答思路:

  • BERT 本质是序列建模器,结构是 Transformer Encoder,可用于非语言场景

  • 可将用户行为序列(video ID、行为类型)作为 token,做 masked prediction(如 Bert4Rec)

  • 训练目标:遮盖某个位置预测行为 item,实现推荐候选 ranking

🔧 工程延伸:

  • 与知识图谱 embedding 联合输入(token + KG vector)

  • 加入 user profile 向量做 segment embedding 引导个性化表示


📚 参考资料


更多推荐