查看全课大纲(第 55 / 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.跨媒体信息检索与未来展望

GPT 与自回归语言建模

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

在上一节,我们学习了BERT及其双向掩码预训练范式,它擅长理解与判别任务。本节我们将转向另一条技术路线:自回归语言模型。以OpenAI的GPT系列为代表,这条路线专注于从左到右的文本生成,并最终通过规模化与上下文学习,催生了今天的大语言模型浪潮。本节将系统梳理GPT-1、GPT-2、GPT-3的核心设计理念与演进逻辑,帮助你理解自回归模型如何从“续写文本”走向“通用任务求解器”。

💡 核心导读

  • 自回归语言建模:核心是使用因果掩码(causal mask),让模型只能基于左侧历史文本来预测下一个词,天然适合生成任务。
  • GPT-1的范式:确立“无监督预训练 + 有监督微调”的两阶段框架,并通过任务格式改写统一了多种下游任务。
  • GPT-2的突破:主张“不微调”,探索通过提示(prompt)让模型在零样本(zero-shot)设置下理解并执行任务。
  • GPT-3的规模化:引入上下文学习(in-context learning),仅通过前向推理和少量示例(few-shot)即可完成复杂任务,参数规模达到1750亿。

自回归语言建模:核心机制

自回归语言模型(Autoregressive Language Model)是生成式预训练的基础。其核心思想非常直观:给定一个文本序列 x=(x1,x2,...,xn)x = (x_1, x_2, ..., x_n),模型的目标是学习整个序列的联合概率分布 p(x)p(x)。通过概率的链式法则,这个联合分布可以被分解为一系列条件概率的乘积:

p(x)=∏i=1np(xi∣x1,x2,...,xi−1;Θ)p(x) = \prod_{i=1}^{n} p(x_i | x_1, x_2, ..., x_{i-1}; \Theta)

其中 Θ\Theta 是模型参数。模型在每一步都基于前面所有 token 来预测下一个 token xix_i。训练时的目标函数是标准的极大似然估计(Maximum Likelihood Estimation, MLE),即最大化整个训练语料上这个联合概率的对数似然。

与BERT的关键差异在于注意力方向:

  • GPT(自回归):使用因果掩码(causal mask)。在Transformer解码器中,位置 ii 只能关注不超过 ii 的历史位置与当前位置(j≤ij \le i),不能关注 j>ij>i 的未来位置。这使得模型天生适合生成任务,因为生成过程本身就是从左到右的。
  • BERT(双向):使用掩码语言模型(Masked Language Model, MLM)目标,在训练时可以同时利用被掩码词左右两侧的上下文。这使得BERT天生更适合理解与判别类任务。

与ELMo的差异:

  • ELMo:使用双向LSTM分别获取前向和后向的上下文特征,然后将两个方向的向量拼接起来作为词的表示。这些表示通常是冻结的,作为特征输入到下游任务特定的模型中。
  • GPT:使用纯Transformer解码器堆叠而成。在预训练后,其整套参数会在下游任务上进行微调(fine-tuning),实现端到端的优化。

下面用 numpy 把因果掩码这件事做实:给一个 4 个 token 的示意例子,把”未来位置”的注意力分数压到负无穷,再看 softmax 之后权重长什么样。

import numpy as np

# 4 个 token 的原始注意力分数(手工设定,仅示意)
T = 4
scores = np.array([
    [0.5, 1.2, 0.8, 0.3],
    [1.0, 0.4, 1.5, 0.9],
    [0.2, 1.1, 0.7, 1.3],
    [1.4, 0.6, 1.2, 0.5],
])

# 因果掩码:上三角(不含对角线)置 1,表示"不许看未来"
mask = np.triu(np.ones((T, T)), k=1)
scores_masked = scores - 1e9 * mask

# 逐行 softmax
e = np.exp(scores_masked - scores_masked.max(axis=1, keepdims=True))
attn = e / e.sum(axis=1, keepdims=True)

print("因果掩码(1 = 被屏蔽的未来位置):")
print(mask.astype(int))
print("\n掩码后的注意力权重:")
print(attn.round(4))
print("\n每行权重之和:", attn.sum(axis=1).round(4))
因果掩码(1 = 被屏蔽的未来位置):
[[0 1 1 1]
 [0 0 1 1]
 [0 0 0 1]
 [0 0 0 0]]

掩码后的注意力权重:
[[1.     0.     0.     0.    ]
 [0.6457 0.3543 0.     0.    ]
 [0.1958 0.4815 0.3228 0.    ]
 [0.3739 0.168  0.3061 0.152 ]]

每行权重之和: [1. 1. 1. 1.]

第 1 行只能看自己,所以权重全压在第一位;第 4 行能看前四个(含自身),权重才分散开。这就是”每个位置只能看到自身及左侧历史”在数值上的样子——不是靠说明文字保证的,是掩码硬压出来的。

GPT-1:无监督预训练与有监督微调

论文:Improving Language Understanding by Generative Pre-Training (Radford et al., 2018,OpenAI技术报告) 官方资源:PDF | 博客

GPT-1首次清晰地将“在大规模无标注文本上预训练”和“在特定任务标注数据上微调”两个阶段结合起来,形成了现代预训练模型的经典范式。

模型架构与预训练

  • 架构:12层的Transformer解码器(decoder-only)。隐层维度为768,配备12个注意力头,总参数量约为1.17亿(117M)。
  • 预训练语料:BooksCorpus数据集,包含约7000本书籍的文本。
  • 目标函数:标准的自回归语言建模目标,即上文所述的极大似然。

有监督微调与任务适配

微调阶段的关键创新在于不针对不同任务设计复杂的模型结构,而是通过引入特殊的标记(token)将各种任务统一转化为“序列到序列”或“序列到标签”的格式,然后仅添加一个线性输出层。

具体任务格式如下:

  1. 单句分类(如情感分析): 输入序列构成为:[START] 文本 [EXTRACT] 模型处理该序列后,取最后一个token(即[EXTRACT]位置)对应的隐层向量,送入线性分类器得到结果。
  2. 句对任务(如自然语言推理、语义相似度): 输入序列构成为:[START] 前提 [DELIM] 假设 [EXTRACT] 同样取最后一个token的隐向量进行分类。
  3. 多项选择问答: 将每个候选答案分别与问题和上下文拼接成独立的输入序列,每个序列通过模型得到一个分数,最后对所有分数进行softmax归一化,选出概率最高的答案。

辅助语言模型损失

在微调时,论文发现同时优化下游任务目标 LtaskL_{\text{task}} 和原始的语言模型目标 LLML_{\text{LM}} 是有益的。总损失函数为:

L=Ltask+λ⋅LLML = L_{\text{task}} + \lambda \cdot L_{\text{LM}}

其中 λ\lambda 通常设为0.5。这个辅助LM损失的作用是:

  • 稳定训练:防止模型在微调初期因任务目标而“遗忘”预训练中获得的大量通用语言知识。
  • 提升泛化:帮助模型在任务数据上保持语言建模的流畅性,从而获得更好的泛化性能。

注意:这不同于多任务联合训练,因为这里的 LLML_{\text{LM}} 计算的是下游任务输入序列本身的似然,而非额外的无监督数据。

论文报告值:GPT-1在12个自然语言理解任务中的9个上取得了当时的最优结果(state-of-the-art)。

GPT-2:语言模型即多任务学习者

论文:Language Models are Unsupervised Multitask Learners (Radford et al., 2019,OpenAI技术报告) 官方资源:PDF | 博客

GPT-2的核心主张更为激进:一个在足够多样和庞大的数据上训练的语言模型,无需任何参数更新(即不微调),就能通过理解任务描述(提示)来执行多种任务。

规模化与架构调整

  • 参数规模:推出了多个规模的模型,最大的GPT-2模型拥有15.42亿参数(1.542B),48层,隐层维度1600。
  • 词表:使用字节对编码(Byte Pair Encoding, BPE),词表大小扩展到50,257个token。
  • 上下文长度:支持1024个token。

零样本任务执行

GPT-2论文探索了零样本(zero-shot) 设置下的下游任务性能。其核心思想是:将任务指令和输入直接作为自然语言提示(prompt)交给模型,让模型“续写”出答案。

  • 翻译:提示为 translate English to French: [英文文本]
  • 摘要:提示为 summarize: [长文本]
  • 问答:提示为 question: [问题] answer:

模型在训练时见过海量的、包含各种任务描述和执行的互联网文本,因此学会了将提示中的指令与后续的生成内容关联起来。论文报告值显示,GPT-2在LAMBADA(预测句子最后一个词)等零样本任务上显著超越了此前的最佳结果。

能力与责任的讨论

GPT-2论文明确指出了模型能力的双重性:既可用于创造性、辅助性的正当用途,也可能被滥用生成误导性信息。为此,OpenAI采取了分阶段发布的策略,先发布较小模型,随后再逐步发布更大模型,以便社区有时间研究其影响和制定应对措施。

GPT-3:上下文学习的涌现

论文:Language Models are Few-Shot Learners (Brown et al., 2020,arXiv:2005.14165)

GPT-3将规模推向了新的高度(1750亿参数),但其更核心的贡献是系统化地提出并验证了上下文学习(In-Context Learning, ICL)。

上下文学习 vs. 微调

这是两条根本不同的适应下游任务的路径:

  • 微调(Fine-tuning):需要计算梯度,更新模型的参数。需要任务特定的标注数据。
  • 上下文学习:不更新任何模型参数。仅通过改变输入给模型的提示(prompt),在其中提供任务描述和/或少量示例,模型通过前向推理就能完成任务。根据提示中示例的数量,分为:
    • 零样本(Zero-shot):只给任务指令。
    • 单样本(One-shot):给一个任务示例。
    • 少样本(Few-shot):给几个任务示例。

GPT-3的关键设计

  • 参数规模:1750亿(175B)参数,是GPT-2最大模型的约100倍。
  • 核心能力:当模型规模足够大时,上下文学习的能力会涌现(emerge) 出来。即,在较小模型上表现平平的少样本学习,在超大模型上性能会急剧提升,甚至接近或超过专门在该任务上微调的模型性能。
  • 论文报告值:GPT-3在大量NLP任务上的少样本学习性能,接近或超过了之前的微调基线模型。

重要区分:Few-shot learning在传统机器学习中可能指利用少量数据更新模型参数,但在GPT-3的语境中,特指不更新参数的上下文学习,切勿混淆。

今天怎么做

自回归Decoder架构已成为当前大语言模型(LLM)的主流主干。GPT-3之后的发展主要沿着两条主线:

  1. 对齐(Alignment):如何让模型更安全、更符合人类意图。这催生了从InstructGPT到GPT-4的“预训练 + 对齐”技术路线。
  2. 开源与高效化:出现了如LLaMA系列等开源模型,并在模型架构(如RoPE位置编码)、训练(如RLHF)和部署(如量化、蒸馏)方面持续创新。

本节作为历史与原理定位,不展开具体新模型细节。后续课程将深入探讨对齐技术及检索增强生成(RAG)等实战应用。

延伸阅读

  1. Radford, A., Narasimhan, K., Salimans, T., & Sutskever, I. (2018). Improving Language Understanding by Generative Pre-Training. OpenAI Technical Report.
  2. Radford, A., Wu, J., Child, R., Luan, D., Amodei, D., & Sutskever, I. (2019). Language Models are Unsupervised Multitask Learners. OpenAI Technical Report.
  3. Brown, T. B., Mann, B., Ryder, N., Subbiah, M., Kaplan, J., Dhariwal, P., … & Amodei, D. (2020). Language Models are Few-Shot Learners. In Advances in Neural Information Processing Systems (NeurIPS). arXiv:2005.14165.

📝 动手练一练

  1. 概念辨析:请简述自回归语言模型(如GPT)与掩码语言模型(如BERT)在注意力机制上的根本区别,并说明这种区别如何影响了它们各自最适合的任务类型。
👉 点击查看参考答案

根本区别:

  • 自回归模型(GPT):使用因果掩码(causal mask)。在计算某个位置的注意力时,它只能访问该位置的左侧历史与当前位置(j≤ij \le i),不能访问右侧(j>ij>i)的未来信息。这模拟了文本生成的顺序过程。
  • 掩码语言模型(BERT):使用双向注意力。在训练时,为了预测被掩码的词,模型可以同时利用该词左侧和右侧的所有上下文信息。

对任务适合性的影响:

  • GPT(因果/单向):因其顺序生成特性,天生适合文本生成类任务,如对话、续写、翻译(生成目标语言序列)等。
  • BERT(双向):因其能同时理解整个上下文,天生适合理解与判别类任务,如文本分类、情感分析、命名实体识别、自然语言推理等。
  1. 流程理解:假设你用GPT-1的框架处理一个情感分析任务(判断句子“The movie is fantastic!”的正负向)。请描述从输入到输出的完整数据处理流程,包括特殊标记的添加和最终预测向量的获取位置。
👉 点击查看参考答案
  1. 输入格式化:在原始句子前后添加任务特定的特殊标记。根据GPT-1论文,对于单句分类任务,格式为 [START] 文本 [EXTRACT]。因此,输入序列变为:[START] The movie is fantastic! [EXTRACT]。
  2. 模型前向传播:将该序列输入预训练好的GPT-1模型(12层Transformer Decoder)。模型会为序列中的每个token(包括特殊标记)计算一个对应的隐层向量。
  3. 获取表示:取最后一个token,即 [EXTRACT] 对应的隐层向量,作为整个句子的聚合表示。这是因为 [EXTRACT] 被设计为“提取”前面文本信息的标记。
  4. 分类预测:将上一步得到的隐向量送入一个新增的线性分类层(在微调阶段训练)。该分类层输出一个分数(或logits),通过softmax即可得到正向/负向的情感概率。

注意:在微调训练时,总损失是分类损失和该输入序列本身的语言模型损失(λ=0.5\lambda=0.5)的加权和。

本章小结

本节我们追溯了以GPT系列为代表的自回归语言模型发展史。从GPT-1确立“预训练-微调”范式,到GPT-2探索零样本的任务理解,再到GPT-3凭借超大参数规模和上下文学习实现少样本任务求解,这条技术路线清晰地展示了语言模型如何通过规模化逐步获得通用任务能力。理解自回归与双向掩码的根本区别,是把握当今大模型技术版图的基础。

📋 行动清单

  • 厘清自回归语言模型(因果掩码)与掩码语言模型(双向掩码)在注意力机制上的核心差异。
  • 复述GPT-1如何通过添加特殊标记([START], [DELIM], [EXTRACT])将不同下游任务统一为序列格式。
  • 区分“微调”、“零样本”、“上下文学习(少样本)”这三种让预训练模型适应下游任务的方式,明确它们是否更新模型参数。

—— 小象教研组