查看全课大纲(第 54 / 69 节)
  1. 1.NLP 的研究领域、应用与学习路径
  2. 2.自然语言的基本术语
  3. 3.信息论基础:信息熵与交叉熵
  4. 4.语言的进化与语义变迁
  5. 5.主观概率、客观概率与条件概率
  6. 6.贝叶斯原理与推理
  7. 7.随机变量:二项式、期望方差与联合概率
  8. 8.常见概率分布
  9. 9.辛普森悖论与贝叶斯解题实例
  10. 10.语言模型:语言概率与词袋模型
  11. 11.n-gram 语言模型(二元 / 三元 / N-Gram)
  12. 12.语言模型评价:交叉熵、困惑度与插值
  13. 13.朴素贝叶斯文本分类:垃圾邮件
  14. 14.拼写检查
  15. 15.中文分词:构词法、最大匹配、最优路径与 Jieba
  16. 16.词表示问题与语义相似度
  17. 17.TF-IDF 权重处理
  18. 18.One-Hot 表达与词表示的局限
  19. 19.Word2Vec 核心思想
  20. 20.Word2Vec 训练过程
  21. 21.Skip-gram 模型详解
  22. 22.词性标注任务与标注方法(规则 + N-Gram)
  23. 23.EM 算法与混合模型
  24. 24.高斯混合模型 GMM
  25. 25.从混合模型到隐马尔可夫模型
  26. 26.隐马尔可夫模型(HMM)推导与维特比解码
  27. 27.线性链条件随机场 CRF
  28. 28.贝叶斯网络与图模型
  29. 29.隐马尔可夫链与 HMM 推导
  30. 30.PLSA 主题模型
  31. 31.LSI 与 SVD 向量表达
  32. 32.LDA 与狄利克雷分布
  33. 33.主题模型实验复现(困惑度 / 分类 / 相似度 / 延展)
  34. 34.上下文无关文法(CFG)与句法分析
  35. 35.概率上下文无关文法 PCFG
  36. 36.统计机器翻译:词对齐与翻译模型
  37. 37.统计机器翻译中的对齐模型与参数估计
  38. 38.从统计机器翻译到神经机器翻译
  39. 39.神经元与反向传播速览(指向深度学习课)
  40. 40.CNN 原理及其在 NLP 中的应用
  41. 41.循环神经网络的基本原理与 Elman / Jordan 网络
  42. 42.LSTM:长短期记忆网络的核心思想与分步实现
  43. 43.Encoder-Decoder 框架
  44. 44.Seq2Seq 与早期注意力机制
  45. 45.注意力机制的背景与动机
  46. 46.注意力模型实现原理与匹配函数
  47. 47.记忆网络:组成与计算
  48. 48.注意力机制的应用与历史延展
  49. 49.Transformer 结构:Encoder-Decoder 栈与 Self-Attention
  50. 50.Multi-Head Attention、FFNN 与位置编码
  51. 51.层归一化、损失函数与 Universal Transformer 延展
  52. 52.预训练范式:从 ELMo 到 BERT
  53. 53.BERT 与掩码语言模型
  54. 54.BERT 下游任务微调与 GLUE 口径
  55. 55.GPT 与自回归语言建模
  56. 56.GPT-1 到 GPT-4 的演进
  57. 57.指令微调与 RLHF
  58. 58.分词器:BPE、WordPiece 与中文词表
  59. 59.上下文窗口与长文本处理
  60. 60.能力边界、成本与适用场景
  61. 61.文本分类实战:从朴素贝叶斯到逻辑回归
  62. 62.命名实体识别实战
  63. 63.文本生成与摘要实战
  64. 64.语义检索与向量库实战
  65. 65.RAG 知识库问答
  66. 66.NLP 评估指标:BLEU / ROUGE / BERTScore 与人工评估
  67. 67.幻觉与事实性问题
  68. 68.文本与知识结合(知识图谱压缩)
  69. 69.跨媒体信息检索与未来展望

BERT 下游任务微调与 GLUE 口径

小象实战讲义 · 自然语言处理

在上一节中,我们深入剖析了 BERT 的预训练机制。然而,一个强大的预训练模型最终的价值,体现在它能否有效地适应并解决各种下游任务。本节将聚焦于 BERT 论文中提出的微调(Fine-tuning) 范式,并系统介绍其性能评估的权威基准——GLUE(General Language Understanding Evaluation) 数据集。你将掌握如何将预训练模型适配到具体任务,并理解如何客观地评估一个模型在自然语言理解上的综合能力。

💡 核心导读

  • 微调范式:理解 BERT 如何通过添加简单的任务特定输出层,并对全部参数进行端到端训练来适应不同任务,区别于 ELMo 的“特征提取”模式。
  • 任务适配架构:掌握针对单句分类、句对分类、序列标注(如问答)等不同任务,BERT 输入输出层的具体设计。
  • GLUE 基准详解:熟悉 GLUE 包含的九大任务、各自指标,以及其非加权平均的聚合口径,明确 WNLI 不计入总分的缘由。
  • 历史定位与演进:了解 BERT 在 GLUE 上的原始表现,并认识从任务特定微调到通用提示学习、参数高效微调(如 LoRA)的现代范式变迁。

BERT 微调范式详解

在 BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding(Devlin et al., NAACL 2019;预印本 arXiv:1810.04805 于 2018-10 发布)论文的 §3.2 中,作者明确提出了 BERT 的微调方式:使用预训练好的 BERT 参数进行初始化,然后针对下游任务,只需要在模型顶部添加一个简单的输出层,随后所有参数(包括 BERT 本体和新增的输出层)一起进行端到端的微调。

这与 ELMo 等模型的“特征提取”范式有本质区别。在特征提取范式中,预训练编码器的参数被冻结,其输出的词向量作为静态特征输入到另一个独立训练的下游模型中。而 BERT 的微调允许梯度从任务目标回传到 Transformer 的每一层,从而根据具体任务动态调整上下文表示。

这种范式带来了几个关键优势:

  1. 架构复用:无需为每个任务从头设计复杂的模型架构,复用强大的预训练骨干网络(注意:全参微调需要更新全部参数,并不属于后文所说的参数高效微调 PEFT)。
  2. 快速适配:由于模型已具备丰富的语言知识,微调通常只需少量轮次(2-4个epoch)即可达到优异性能。
  3. 统一框架:多种NLP任务可以被规约到相似的输入输出格式,简化了工程 pipeline。

接下来,我们看看针对不同任务类型的具体微调架构。

下游任务适配架构

根据 BERT 论文 §3.2 的描述,不同任务主要通过调整输入序列和输出层来适配。

单句与句对分类任务

对于像情感分析(SST-2)、语言可接受性判断(CoLA)这类单句分类任务,输入格式为:[CLS] 句子A [SEP]。模型取最后一个 Transformer 层输出的 [CLS] 标记对应的最终隐向量 C∈RHC \in \mathbb{R}^H(HH 为隐层大小)。然后将其通过一个全连接分类层: P=softmax(CWT)P = \text{softmax}(C W^T) 其中 W∈RK×HW \in \mathbb{R}^{K \times H} 是可学习的分类权重,KK 是类别数。损失函数为标准的交叉熵损失。

对于句对分类任务,如自然语言推理(MNLI)、句对等价判断(MRPC),输入格式为:[CLS] 句子A [SEP] 句子B [SEP]。注意,这里是将两个句子拼接成一个序列输入,而不是分别编码两个句子后再拼接它们的向量。分类方式与单句分类相同,同样使用 [CLS] 向量进行分类。

序列标注与问答任务

对于命名实体识别(NER) 这类序列标注任务,将每个 token 对应的最终隐向量输入到一个分类层,为每个 token 预测一个标签。

对于抽取式问答(如 SQuAD),模型需要从给定的段落中找出答案的起止位置。BERT 的适配方式非常简洁:新增两个可学习的向量 S,E∈RHS, E \in \mathbb{R}^H,分别用于预测答案的开始和结束位置。对于段落中的第 ii 个 token,其隐向量为 TiT_i,它是答案起点的概率为: Pistart=eS⋅Ti∑jeS⋅TjP_i^{\text{start}} = \frac{e^{S \cdot T_i}}{\sum_j e^{S \cdot T_j}} 同理可计算终点概率 PiendP_i^{\text{end}}。训练时,最大化正确答案跨度的起点和终点概率的乘积。推理时,选择概率最高的合法起止位置对。

下面把 [CLS] 这一段做实:给三句话的 [CLS] 向量(写死),只训练这个 2×2 的分类头,看损失怎么降、预测到第几步才分对。

这里刻意把 C 固定住,是为了单独观察分类头学得动学不动;真实微调时梯度还会继续回传进 BERT 本体,那部分才是“全部参数一起动”。

import numpy as np

# 三句的 [CLS] 向量(真实场景由 BERT 编码得到;这里写死,便于单独观察分类头)
C = np.array([[0.90, 0.10],
              [0.20, 0.80],
              [0.70, 0.60]])
y = np.array([0, 1, 0])          # 0 = 负向,1 = 正向

W = np.zeros((2, 2))             # 分类头权重,从零起步
b = np.zeros(2)
lr = 0.5

def softmax(z):
    z = z - z.max(axis=1, keepdims=True)   # 减最大值防溢出
    e = np.exp(z)
    return e / e.sum(axis=1, keepdims=True)

for step in range(41):
    probs = softmax(C @ W + b)
    # softmax + 交叉熵对 logits 的梯度就是 (p - onehot),这里取 batch 平均
    loss = -np.mean(np.log(probs[np.arange(3), y]))
    dlogits = probs.copy()
    dlogits[np.arange(3), y] -= 1
    dlogits /= 3
    if step in (0, 10, 20, 40):
        print(f"step {step}: loss = {loss:.4f}  预测 = {probs.argmax(axis=1)}")
    W -= lr * (C.T @ dlogits)
    b -= lr * dlogits.sum(axis=0)
step 0: loss = 0.6931  预测 = [0 0 0]
step 10: loss = 0.4272  预测 = [0 0 0]
step 20: loss = 0.3236  预测 = [0 1 0]
step 40: loss = 0.2205  预测 = [0 1 0]

三行读数说明两件事:① W、b 全零时两类概率都是 0.5,loss 恒等于 ln2≈0.6931,模型完全没有判别力;② 只更新 W、b,到第 20 步左右才把中间那条样本分对,loss 降到 0.2205。这也正是“微调需要若干轮才收敛”的最朴素版本——只不过真实场景里被更新的参数有几亿个,而不是这里的 6 个。

微调超参数实践

如 BERT 论文附录 §A.3 所述,微调超参数没有单一的“黄金值”,而是给出一组候选区间,需在开发集上进行选择:

  • Batch Size: 16 或 32
  • Learning Rate (Adam): 5e-5, 4e-5, 3e-5, 2e-5
  • 训练轮数: 2, 3, 4
  • Warmup 比例: 0.1(即前10%的训练步数学习率从0线性增长到设定值)

重要提示:对于较小的数据集(如 MRPC,约3.6k训练样本),超参数的选择非常敏感,较大的学习率容易导致训练不稳定。因此,在实际操作中,必须根据验证集性能来选择最佳组合。

GLUE 基准:任务与评估口径

为了系统评估模型在自然语言理解(NLU)上的能力,GLUE: A Multi-Task Benchmark and Analysis Platform for Natural Language Understanding(Wang et al., 2018, ACL Anthology W18-5446)基准被提出。它包含了9个不同类型的NLU任务,如下表所示(依据基准论文 §3 Table 1):

任务全称类型主要指标
CoLACorpus of Linguistic Acceptability单句可接受性Matthew 相关系数(MCC)
SST-2Stanford Sentiment Treebank单句情感二分类准确率
MRPCMicrosoft Research Paraphrase Corpus句对等价准确率 / F1
STS-BSemantic Textual Similarity Benchmark句对相似度回归Pearson / Spearman 相关
QQPQuora Question Pairs句对是否同义准确率 / F1
MNLIMulti-Genre NLI句对蕴含(三分类)matched / mismatched 准确率
QNLIQuestion NLI句对(问题-句子是否含答案)准确率
RTERecognizing Textual Entailment句对二分类蕴含准确率
WNLIWinograd NLI代指消解式二分类准确率

GLUE 聚合口径(必须澄清的常见误区):

  1. 非加权平均:GLUE 榜单的总分是各任务主要指标的非加权算术平均值,而不是把所有任务的准确率简单相加平均。因为各任务指标不同(如 CoLA 用 MCC,STS-B 用相关系数),直接比较绝对值意义不大,跨模型比较应关注分差。
  2. WNLI 不计入平均:由于 WNLI 任务的训练集和测试集标签存在已知问题,且多数类基线就能获得很高分数,将其纳入平均会导致分数失真。因此,在计算 GLUE 平均分时,通常排除 WNLI,只计算前8个任务的平均。

BERT 的原始报告成绩(摘自 BERT 论文 Table 1,此为历史数据):

  • GLUE 平均分: 80.5(BERT-Large 模型)
  • MNLI: 86.7 / 85.9(matched / mismatched 准确率,Large)
  • QQP: 72.1(F1 分数,Large)
  • STS-B: 86.5(Spearman 相关系数,Large)

这些数字代表了2019年的 state-of-the-art,但如今已被后续模型大幅超越。

历史定位与现代演进

BERT 的“预训练+微调”范式在2018-2020年间成为 NLP 领域的主流范式,极大地推动了工业界和学术界的发展。然而,技术仍在快速演进:

  1. 从任务特定微调到通用提示学习:随着 GPT-3 等超大模型的出现,“提示(Prompting)”和“上下文学习(In-Context Learning)”使得同一个模型无需更新参数就能适应多种任务,减少了对大量任务标注数据的依赖。
  2. 参数高效微调(PEFT):微调整个大模型成本高昂。像 LoRA(Low-Rank Adaptation) 这样的技术,只训练注入到模型中的少量低秩增量参数,就能达到接近全参数微调的效果,极大地降低了计算和存储开销。
  3. 基准的演进:GLUE 基准随着模型性能的饱和(人类水平或超过人类),其区分度下降。学界转向了更具挑战性的基准,如 SuperGLUE、MMLU(Massive Multitask Language Understanding) 等,以评估模型更高级的推理和知识能力。

因此,今天我们学习 BERT 微调和 GLUE,重在理解其范式思想和评估方法论,这些是理解当前大模型技术演进的基础。

📝 动手练一练

  1. 概念辨析:BERT 的“微调”范式与 ELMo 的“特征提取”范式最根本的区别是什么?这种区别带来了哪些优势和潜在挑战?
👉 点击查看参考答案

根本区别在于模型参数是否更新。

  • ELMo 特征提取:预训练好的双向 LSTM 编码器参数被冻结,其输出的上下文相关词向量作为静态特征,输入到一个独立的下游模型(如 BiLSTM-CRF)中进行训练。预训练模型本身不参与下游任务的学习。
  • BERT 微调:预训练好的 Transformer 编码器参数作为初始化,与任务特定的输出层一起,全部参数都参与下游任务的端到端训练。梯度会从任务损失反向传播回 BERT 的每一层。

优势:

  • 更高性能:微调允许模型根据具体任务优化其内部表示,通常能获得比静态特征更好的效果。
  • 架构统一简洁:无需为下游任务单独设计复杂的特征融合网络,一个简单的输出层即可。

潜在挑战:

  • 灾难性遗忘:在微调小数据任务时,可能会覆盖掉预训练中学到的通用语言知识。
  • 计算与存储成本:每个任务都需要保存一份完整的微调后模型副本,当任务很多时,存储开销大。
  • 超参数敏感:在小数据集上,微调过程对学习率等超参数非常敏感,需要仔细调优。
  1. 指标计算:假设一个模型在 GLUE 的 8 个任务(排除 WNLI)上的指标得分分别为:CoLA (MCC: 0.60), SST-2 (Acc: 0.93), MRPC (F1: 0.89), STS-B (Spearman: 0.87), QQP (Acc: 0.91), MNLI-m (Acc: 0.86), QNLI (Acc: 0.92), RTE (Acc: 0.75)。请计算该模型的 GLUE 平均分(结果保留四位小数)。
👉 点击查看参考答案

GLUE 平均分是各任务指定指标的非加权算术平均值。

计算过程: 平均分=0.60+0.93+0.89+0.87+0.91+0.86+0.92+0.758\text{平均分} = \frac{0.60 + 0.93 + 0.89 + 0.87 + 0.91 + 0.86 + 0.92 + 0.75}{8}

scores = [0.60, 0.93, 0.89, 0.87, 0.91, 0.86, 0.92, 0.75]
glue_score = sum(scores) / len(scores)
print(round(glue_score, 4))
0.8413

因此,该模型的 GLUE 平均分为 0.8413(即 84.13%)。算的时候别提前四舍五入:先把八项求和(6.73),再除以 8,最后一步才保留四位。

延伸阅读

  1. BERT 原论文:Devlin, J., Chang, M.-W., Lee, K., & Toutanova, K. (2018). BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. arXiv:1810.04805. (重点关注 §3.2 Fine-tuning BERT 和 §A.3 Fine-tuning Procedure)
  2. GLUE 基准论文:Wang, A., Singh, A., Michael, J., Hill, F., Levy, O., & Bowman, S. R. (2018). GLUE: A Multi-Task Benchmark and Analysis Platform for Natural Language Understanding. In Proceedings of the 2018 EMNLP Workshop BlackboxNLP (pp. 353–355). ACL Anthology W18-5446. (重点关注 §3 Tasks 和 Table 1)
  3. LoRA 论文:Hu, E. J., Shen, Y., Wallis, P., Allen-Zhu, Z., Li, Y., Wang, S., … & Chen, W. (2021). LoRA: Low-Rank Adaptation of Large Language Models. arXiv:2106.09685. (了解参数高效微调的现代方法)

本章小结

本节我们深入探讨了 BERT 模型应用于下游任务的核心机制——微调。我们学习了如何为不同任务(单句分类、句对分类、问答)设计适配的输入输出层,并理解了微调过程需要对全部参数进行端到端优化。同时,我们系统剖析了评估自然语言理解模型的权威基准 GLUE,明确了其任务构成、评估指标以及关键的非加权平均聚合口径,纠正了常见的认知误区。最后,我们将 BERT 微调置于历史脉络中,看到了其如何演变为今天的提示学习和参数高效微调范式。

📋 行动清单

  • 在脑海中复述 BERT 用于单句分类、句对分类和抽取式问答时,输入序列的格式和输出层的设计有何不同。
  • 准确说出 GLUE 包含哪几个任务(中英文全称),以及计算总分时为何要排除 WNLI。
  • 查阅最新的 NLP 论文或博客,了解一个当前流行的参数高效微调技术(如 LoRA、Prefix-Tuning)的基本思想,并与 BERT 的全参数微调进行对比。

—— 小象教研组