Lecture 1 · 导论:什么是基础模型,为什么值得关注 · Introduction: What Are Foundation Models and Why Do They Matter?

Advances in Foundation Models · Lecture 01。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

对应 Maps to:Stanford CS324 Winter 2023 Advances in Foundation Models,1/9 Lecture: Introduction(Percy Liang);Syllabus 第一个主题 “What are foundation models (FMs) and why are they interesting?” 的全部阅读:Karpathy Neural Networks: Zero to Hero(背景)、CS324 Winter 2022 课程笔记 Introduction 与 Large Language Model Capabilities、Hazy Research 博客 How Foundation Models Changed Our Work(2022.11)、Brown et al. Language Models are Few-Shot Learners(GPT-3,2020)、Bommasani et al. On the Opportunities and Risks of Foundation Models(2021)。 依据说明:课程网站没有提供这次讲座的 slides 或录像。本讲依据上面这些阅读材料来写——Winter 2023 的阅读清单把 Winter 2022 的笔记直接列为”Course Notes”,所以本讲的语言模型、能力、风险部分主要沿着那两份笔记展开;“基础模型”的概念、涌现与同质化、生态图依据 Bommasani 等人的报告;最后一节”2023 年之后”是我补充的。 配套代码 Code:code/lecture01/(标准库 + PyTorch;3 个脚本 + 4 个共享模块;最慢的 02_pretrain_and_prompt.py 约 70 秒,其余几秒) 预计阅读时间:3 小时(含运行代码)


0. 本讲导航 · How to read this lecture

0.1 学习目标 Learning goals

学完这一讲,你应该能够:

  1. 用自己的话说清楚什么是基础模型(foundation model):它和”一个很大的语言模型”有什么不同,为什么叫 foundation;说出 Bommasani 等人用来概括它的两个词——涌现(emergence)和同质化(homogenization),以及机器学习 → 深度学习 → 基础模型三个阶段分别”统一”了什么。
  2. 把语言模型写成一个数学对象:序列上的概率分布 p(x1:L)p(x_{1:L});用链式法则把它分解成”下一个 token”的条件概率;解释结束符为什么必不可少、温度怎样改变生成,以及为什么”每一步都选最可能的词”不等于”得到最可能的句子”。
  3. 解释熵、交叉熵、bit/字符、困惑度之间的关系,知道”训练语言模型 = 最小化交叉熵”在信息论里是什么意思。
  4. 说出 n-gram → 神经语言模型这条路的核心矛盾(统计效率 vs 计算效率、数据稀疏、长程依赖),并能用配套代码里的数字说明它。
  5. 描述基础模型的配方:自监督预训练 + 适配;区分几种适配方式(提示 / zero-shot / few-shot、探针、微调);理解为什么”预训练表示能带来标签给不了的知识”。
  6. 概括 GPT-3 的能力与局限,解释什么是上下文学习(in-context learning),以及为什么”一个模型会不会某件事”的结论会随提示而变。
  7. 列出基础模型的主要风险(可靠性、偏见、有害内容、虚假信息、安全、隐私与法律、成本与环境、访问),并解释同质化为什么会放大它们。
  8. 了解 CS324 Winter 2023 的结构和本讲义 20 讲的路线图。

0.2 先修与本讲范围 Prerequisites & scope

默认你已经会 Assumed本讲只给直觉,后面几讲再展开 Previewed only
概率:条件概率、链式法则、期望Transformer 的内部结构(第 3 讲;本讲把 tiny_gpt.py 当黑盒)
神经网络的基本概念:参数、损失、梯度下降(不熟悉的话,Karpathy 的 Zero to Hero 前两集足够)Scaling laws 与”涌现”的严格讨论(第 4、5 讲)
Python 基础;PyTorch 不会也没关系,代码里有解释微调、LoRA、RLHF(第 6、7 讲)
GPU、分布式训练(第 8–10 讲)
每一种风险的深入讨论(第 16–19 讲)

本讲是总论:回答”基础模型是什么、为什么重要、这门课要讲什么”。技术细节都只给到”能读懂后面各讲”的程度。

0.3 本讲地图 Map

§1  什么是基础模型:一个问题;定义与命名;涌现与同质化;生态
§2  语言模型——基础模型的原型:序列上的分布;链式法则与温度;            ← 代码 01
    熵与交叉熵;从 n-gram 到神经网络;从语言模型到预训练
§3  配方:自监督预训练 + 适配;规模;一个迷你实验;适配的几种方式          ← 代码 02、03
§4  能力:GPT-3 能做什么;上下文学习;一个模型、很多任务;评测为什么难      ← 代码 02
§5  风险:可靠性、偏见、有害内容、虚假信息、安全、隐私与法律、成本与访问;  ← 代码 01、02、03
    同质化的代价
§6  2023 年之后
§7  CS324 的结构与本讲义地图
§8–12  小结、常见误区、练习、延伸阅读、下一讲预告

0.4 记号 Notation(全课统一)

符号含义例子
V\mathcal{V}词表(vocabulary),所有可能的 token代码里是 44 个字符;GPT-3 约 5 万个 BPE token
x1:L=(x1,…,xL)x_{1:L} = (x_1, \dots, x_L)一个长度为 LL 的 token 序列“the mouse ate the cheese”,L=5L = 5
p(x1:L)p(x_{1:L})语言模型给整个序列的概率
p(xi∣x1:i−1)p(x_i \mid x_{1:i-1})给定前面的 token,下一个 token 的条件概率
θ\theta模型参数;pθp_\theta 表示由参数 θ\theta 决定的模型
TT温度(temperature)T=0T = 0 贪心,T=1T = 1 原样采样
H(p)H(p),H(p,q)H(p, q)熵;交叉熵(用模型 qq 编码来自 pp 的数据)单位:bit(以 2 为底)
bpcbits per character,每个字符的平均交叉熵代码里的主要指标
困惑度 perplexity2bpc2^{\text{bpc}}(或 enatse^{\text{nats}}):模型”平均在几个选项之间犹豫”
prompt / completion提示 / 续写prompt “the mouse ate”,completion “the cheese”
kk-shot提示里放 kk 个示例zero-shot(k=0k = 0)、few-shot
NN,DD,CC参数量、训练 token 数、训练算力(FLOPs)第 4 讲

本讲义里,“token”指模型处理的最小单位(字、词片段、字符或字节,取决于分词器);代码为了简单用字符当 token。“基础模型”和”foundation model”、“FM”混用。

0.5 关于这门课 · Which CS324?

Stanford 的 CS324 开过两个版本,内容不一样:

  • Winter 2022:Large Language Models(Percy Liang、Tatsu Hashimoto、Christopher Ré)。有一套完整的公开课程笔记,从语言模型的能力、危害、数据、安全、法律、环境讲到架构、训练、并行、适配。
  • Winter 2023:Advances in Foundation Models(同样三位教师)。前 4 周是教师讲座,之后每次课一位客座讲者(FlashAttention、PaLM、机制可解释性、投毒攻击、压缩……),课程项目占 75%。它的阅读清单直接复用了 2022 年的课程笔记。

本讲义以 Winter 2023 为主线(主题与客座报告),用 Winter 2022 的笔记补足技术细节。SYLLABUS.md 有逐场对应表。

0.6 关于数字 · About the numbers

讲义里所有实验数字都来自配套代码的实际输出(固定随机种子、PyTorch 单线程,同一台机器上重复运行逐字相同;只有计时每次不同)。数据是一个合成的”迷你互联网”(fm_world.py),我们知道里面的全部”真相”——谁住在哪里、哪道加法题出现过、每个职业后面用 he / she 的比例——所以能精确检查模型学到了什么。代码里的模型只有约 11 万个参数(大约是 GPT-3 的一百六十万分之一),它只用来演示机制;哪些结论能推广到真实的大模型、哪些不能,正文会逐一说明。有几处结果和我写代码前的预想不一样,讲义按实际结果来写,这些情况列在代码 README 的”关于实验结果”里。

GPT-3 等真实模型的数字引自原始论文和 CS324 课程笔记,会注明出处。


1. 什么是基础模型 · What is a foundation model?

1.1 从一个问题开始

先看一个 2020 年的结果。GPT-3 是一个只用一个目标训练出来的模型:给定前面的文字,预测下一个 token。训练时没有人告诉它什么是”翻译”。可是在德语 → 英语翻译(WMT’16)上,只要在提示里放几个”德语句子 = 英语句子”的例子,它的 BLEU 分数就达到 40.6——而当时专门为这个任务、用几百万对平行语料有监督训练的最好系统是 40.2(数字引自 CS324 课程笔记 Capabilities)。

同一个模型,换一个提示,还能回答常识问题、补全代码、做简单的算术、写新闻(人类读者分辨它写的新闻和真人写的,准确率只有 52% 左右,接近瞎猜)。

这件事为什么令人吃惊?回想一下 2018 年以前做 NLP 的方式:一个任务,一个数据集,一个模型。要做情感分析,就收集几万条带标签的评论,训练一个情感分类器;要做翻译,就收集平行语料,训练一个翻译模型。每个模型只会它被训练的那一件事。GPT-3 打破了这个模式:一个模型、没有为任何下游任务专门训练,却能”凑合着”做几十种任务,有几种还做得很好。

CS324 Winter 2023 开课的时间是 2023 年 1 月 9 日——ChatGPT 发布(2022 年 11 月 30 日)之后第 6 周。那几个月,基础模型从一个研究话题变成了几乎所有人都在用的东西。斯坦福 Hazy Research 实验室(Christopher Ré 的组)在 2022 年 11 月的博客 How Foundation Models Changed Our Work 里描述了这种变化对一个研究组意味着什么:

  • 他们多年研究的数据整理任务(实体匹配、错误检测、数据填补——判断两条记录是不是同一个商品、表格里哪个值是错的),用一个基础模型加上几个示例的提示,就达到了当时的最好水平,不需要为任务训练任何模型(Narayan et al., Can Foundation Models Wrangle Your Data?, 2022)。
  • 基础模型本身成了值得优化的系统:他们做的 FlashAttention(第 8 讲)让 Transformer 训练快了几倍,很快被广泛采用;还有让模型处理更长序列的结构、在慢速网络上去中心化训练(第 9 讲)。
  • 研究的重心从”为每个任务设计模型”转向了”怎样给基础模型编程(提示、示例、数据)”、“怎样评估它”、“怎样构建它”。

这门课要回答的就是:一个”预测下一个词”的模型,为什么会变成这样?它是怎样被做出来的?它为什么能工作、又在哪里不能工作?它对社会意味着什么?

1.2 定义与命名

“基础模型”这个词来自斯坦福 CRFM(Center for Research on Foundation Models)2021 年 8 月发布的一份 100 多位作者的报告 On the Opportunities and Risks of Foundation Models(Bommasani et al.)。它的定义大意是:

基础模型是在广泛的数据上(通常用大规模自监督)训练、可以被适配(例如微调)到大量下游任务的任何模型。

拆开看,这个定义有三个要素:

要素含义为什么重要
广泛的数据(broad data)不是为某个任务收集的数据集,而是尽可能多、尽可能杂的数据:网页、书、代码、图片和说明文字……数据有多广,模型能覆盖的任务就有多广(§3、第 2 讲)
大规模自监督(self-supervision at scale)训练信号来自数据本身(例如”下一个词是什么”),不需要人工标注不需要标注,数据量的上限就只是”能找到多少数据”(§3.1)
可以适配到大量下游任务(adapted to a wide range of downstream tasks)训练完不是终点,而是起点:通过提示、微调等方式变成具体任务的模型一次训练、处处使用——这既是经济价值的来源,也是风险的来源(§1.3、§5)

为什么叫 “foundation”(地基)? 报告解释了这个命名的用意:

  • 强调它的角色而不是它的技术。BERT、GPT-3、CLIP、DALL·E、Codex 用的架构和训练目标各不相同,有的处理语言、有的处理图像、有的处理代码;把它们放在一起的,是它们在 AI 系统里扮演的角色——被大量下游系统建立在上面。“大语言模型”(LLM)这个词太窄(不包括图像),“预训练模型”(pretrained model)又只描述了训练过程,没有说出”成为很多东西的基础”这层意思。
  • 强调它不完整。地基本身不是房子:基础模型需要适配才能变成可用的系统,而且适配后的系统可能继承地基的缺陷(§5.8)。
  • 强调它的重要性来自它的位置。地基出了问题,上面所有的楼都会出问题。

这个名字在当时也有争议。有人认为”foundation”暗示这些模型已经足够可靠、可以当作地基,而事实并非如此;也有人认为这只是给”大模型”换了一个更好听的名字。这些争论本身就说明了一点:基础模型不只是一个技术对象,也是一个**社会技术(sociotechnical)**对象——怎样称呼它、谁有权训练它、谁来为它的错误负责,都是问题的一部分(§1.4、第 18–19 讲)。

1.3 两个关键词:涌现与同质化

报告用两个词概括基础模型的意义:涌现(emergence)和同质化(homogenization)。理解它们最好的方式,是把基础模型放回机器学习的历史里:

阶段同质化:统一了什么涌现:什么东西不再需要人写,而是”自己长出来”例子
机器学习(1990 年代起)学习算法:同一个算法(例如逻辑回归)可以用在各种任务上怎样完成任务:不再由人写规则,而是从样本里学出来垃圾邮件过滤、逻辑回归、SVM
深度学习(2010 年代起)模型架构:同一类网络(CNN、后来的 Transformer)可以用在各种任务上特征:不再由人设计特征,而是从原始数据里学出表示AlexNet、ResNet、seq2seq
基础模型(2018 年起)模型本身:同一个预训练模型,适配到各种任务上功能:一些从没被直接训练过的能力,例如 in-context learningBERT、GPT-3、CLIP

每往下一个阶段,人需要手工指定的东西就少一层,模型自己学出来的东西就多一层;同时,不同任务之间共享的东西也多一层。

涌现在这里的意思是:系统的行为是隐式地从训练中产生的,而不是被显式地设计出来的。GPT-3 的 in-context learning 就是最好的例子——没有人为”从提示里的例子学习新任务”写过一行代码,也没有一个训练目标直接奖励它;它是”在海量文本上预测下一个词”的副产品。涌现让人兴奋(免费得到了新能力),也让人不安(我们不知道还有什么能力会冒出来,包括我们不想要的)。第 4、5 讲会讨论”涌现”的更严格的含义,以及一种观点:有些”突然出现的能力”其实是评价指标造成的错觉。

同质化的意思是:越来越多的系统建立在同一批模型上。报告写作时(2021 年),几乎所有最先进的 NLP 系统都是从少数几个基础模型(BERT、RoBERTa、BART、T5……)适配来的。这是一把双刃剑:

  • 杠杆:对基础模型的任何改进,会立刻惠及所有下游应用。
  • 单点故障:基础模型的任何缺陷——偏见、漏洞、错误的知识——也会被所有下游应用继承(代码 03 演示 3 给出了一个最小的例子,§5.8)。

同质化还在跨模态地发生:同一种架构(Transformer)、同一种思路(大规模自监督)被用在文本、图像、语音、代码、蛋白质、机器人控制上(第 14、15 讲)。

1.4 基础模型的生态

一个基础模型从数据到用户,中间经过很多人的手。报告画了一张生态图,可以简化成这样:

数据的创造者          数据的整理者          模型的训练者          适配者              部署者 / 用户
(写网页、拍照片、   →  (爬取、过滤、去重、  →  (预训练基础模型)  →  (提示、微调、   →  (把系统放进产品里,
  写代码的人)           文档化)                                     对齐)             影响真实的人)
   │                     │                      │                     │                  │
   第 2 讲:数据          第 2、17 讲:数据        第 3–4、8–10 讲:      第 5–7 讲:        第 16–19 讲:
   第 19 讲:版权          质量、投毒              架构、规模、系统         上下文学习、       隐私、安全、伦理、
                                                                    适配、对齐          环境、法律

这张图有两个用处。第一,它是这门课的地图:几乎每一讲都在研究其中的一个环节。第二,它提醒我们:一个下游应用里出现的问题(比如对某个群体的偏见),根源可能在上游任何一个环节——数据创造时就有的社会偏见、过滤时被删掉的方言、训练时的目标、适配时的标注员……责任分散在整条链上,这让基础模型的治理特别困难(第 18、19 讲)。


2. 语言模型:基础模型的原型 · Language models

基础模型不只有语言模型,但语言模型是最早、最典型、也是这门课讨论最多的一类。而且”语言模型”这个概念比它看起来更一般:一个 token 序列可以是文字,也可以是代码、蛋白质的氨基酸、图像切成的小块、机器人的动作。所以先把它彻底弄清楚。

2.1 定义:序列上的概率分布

语言模型(language model, LM)是 token 序列上的一个概率分布。 给定词表 V\mathcal{V},它给每一个有限长度的序列 x1,…,xLx_1, \dots, x_L(每个 xi∈Vx_i \in \mathcal{V})分配一个概率 p(x1,…,xL)p(x_1, \dots, x_L),所有序列的概率加起来等于 1。

CS324 课程笔记用了一个只有 5 个词的例子:V={ate,ball,cheese,mouse,the}\mathcal{V} = \{\text{ate}, \text{ball}, \text{cheese}, \text{mouse}, \text{the}\}。代码 01 演示 1 手写了这样一个小模型,它给出:

句子概率
the mouse ate the cheese0.0329
the cheese ate the mouse0.00098
mouse the the cheese ate8.75 × 10⁻⁸

直觉:一个”好”的语言模型,要让通顺、合理的句子概率高,让不通顺、不合理的句子概率低。这件事听起来平淡,但仔细想想它要求什么:

  • 给”mouse the the cheese ate”低概率,需要语法知识:“the the”几乎不可能出现。
  • 给”the cheese ate the mouse”比”the mouse ate the cheese”低 34 倍的概率,需要世界知识:老鼠吃奶酪,奶酪不吃老鼠。

把这个要求推到极限:如果一个模型能对所有文本给出准确的概率,它就必须”知道”文本里涉及的一切——语法、事实、常识、推理、写作风格。这就是”语言建模”作为一个训练目标如此强大的原因:目标本身很简单,但把它做好需要几乎所有能力。第 11 讲会从”压缩”的角度把这个直觉讲得更严格。

2.2 链式法则、结束符与生成

直接给每个句子指定一个概率显然不可行(句子有无穷多个)。几乎所有现代语言模型都用概率的链式法则把整句的概率分解成一连串”下一个 token”的条件概率:

p(x1:L)=p(x1) p(x2∣x1) p(x3∣x1:2)⋯p(xL∣x1:L−1)=∏i=1Lp(xi∣x1:i−1).p(x_{1:L}) = p(x_1)\, p(x_2 \mid x_1)\, p(x_3 \mid x_{1:2}) \cdots p(x_L \mid x_{1:L-1}) = \prod_{i=1}^{L} p(x_i \mid x_{1:i-1}).

链式法则对任何分布都成立,不是近似。把它写成这样的模型叫自回归语言模型(autoregressive LM):只要能高效地算出”给定前文,下一个 token 的分布”,就定义了整个序列上的分布。GPT 系列、LLaMA、Claude 等都是自回归模型;它们的神经网络做的唯一一件事,就是根据前文输出一个 ∣V∣|\mathcal{V}| 维的概率向量。

结束符为什么必不可少? 代码 01 的手写模型在每个句子末尾乘上了 p(</s>∣xL)p(\text{</s>} \mid x_L)——“在这里结束”的概率。没有它会怎样?那么 ∑x1p(x1)=1\sum_{x_1} p(x_1) = 1 已经用完了全部概率,长度为 1 的句子就占满了整个分布,“the mouse”无处安放。有了结束符,模型在每一步都要在”继续写”和”停下”之间分配概率,长度不同的句子才能放进同一个分布里比较。代码 01 演示 1 (b) 逐个枚举了 5L5^L 个句子来验证这一点:长度恰为 LL 的总概率越来越小,累计概率一步步逼近 1(L=1L = 1 时 0.135,L=5L = 5 时 0.809,L=10L = 10 时 0.962)。真实的 LLM 用一个特殊 token(例如 <|endoftext|>)扮演同样的角色;我们代码里的”迷你互联网”用换行符 \n。

生成:自回归模型天然地支持”一个 token 一个 token 地往下写”:

for i = 1, 2, ...:
    根据前文 x_{1:i-1},算出下一个 token 的分布 p(· | x_{1:i-1})
    从这个分布里抽一个 x_i(或者选概率最大的)
    如果 x_i 是结束符,停下

给定一段开头(提示,prompt),模型接着写出来的部分叫续写(completion)。这就是条件生成(conditional generation)——今天几乎所有基础模型的使用方式都是它:你写一个提示,模型给出续写。

2.3 温度,以及”贪心不等于最可能”

从分布里抽 token 时,通常会用一个温度(temperature) TT 调整分布的形状:

pT(x)∝p(x)1/T.p_T(x) \propto p(x)^{1/T}.
  • T=1T = 1:原样采样。
  • T<1T < 1:分布变”尖”,高概率的更高,低概率的更低;T→0T \to 0 时所有概率集中到最大的那一项——这就是贪心解码(greedy decoding)。
  • T>1T > 1:分布变”平”;T→∞T \to \infty 时变成均匀分布。

课程笔记的例子:p(cheese)=0.4p(\text{cheese}) = 0.4,p(mouse)=0.6p(\text{mouse}) = 0.6。T=0.5T = 0.5 时变成 0.31 / 0.69,T=0.2T = 0.2 时变成 0.12 / 0.88(代码 01 演示 2 (a))。温度只改变”形状”,不改变排序。

这里有一个容易被忽略的细节。实际生成时,我们是每一步分别对”下一个 token 的分布”调温度。这和”对整个句子的分布调温度”不是一回事(只有 T=1T = 1 时相同)。代码 01 演示 2 (b) 用一个两步的小模型说明了差别:先生成 A 或 B(p(A)=0.6p(A) = 0.6),A 后面 x、y 各一半,B 后面 x 占 0.9。整句的分布是 Ax 0.30、Ay 0.30、Bx 0.36、By 0.04——最可能的整句是 Bx。但在 T=0.1T = 0.1 时:

AxAyBxBy
对整句调温度0.1220.1220.7560.000
每一步分别调温度0.4910.4910.0170.000

每步调温度时,A 在第一步就以 0.6 > 0.4 占了上风,之后再也到不了 Bx。推论:贪心解码不等于”找到最可能的句子”。局部最优的每一步,合起来不一定是全局最优。beam search 等方法就是为了缓解这个问题(第 5 讲还会讨论解码对推理的影响)。

贪心解码还有一个更直观的问题。代码 01 演示 1 (c) 让手写模型从”the mouse ate”贪心地往下写,得到”the mouse ate the mouse ate the mouse ate……”——每一步都”最合理”,合起来却是一个永远不结束的循环。真实的 LLM 在贪心解码时也常常陷入重复,这是采样、top-p、重复惩罚这些解码技巧存在的原因之一。

2.4 信息论视角:熵、交叉熵与困惑度

语言模型最早不是作为”AI”被研究的,而是作为信息论的工具。1948 年,Claude Shannon 创立了信息论;他关心的一个问题是:英语的熵是多少?——也就是说,平均每个字母携带多少信息、最少需要多少 bit 来编码。

熵(entropy):一个分布 pp 的熵是

H(p)=∑xp(x)log⁡21p(x).H(p) = \sum_x p(x) \log_2 \frac{1}{p(x)}.

直觉:log⁡21p(x)\log_2 \frac{1}{p(x)} 是”用最优的编码方式,编码 xx 需要的 bit 数”——越常见的东西,编码越短;熵就是平均编码长度。熵低意味着数据有结构、可预测、能被压缩得很短。

交叉熵(cross-entropy):我们不知道真实分布 pp(英语的”真实分布”是什么?),只有一个模型 qq。用 qq 设计的编码去编码来自 pp 的数据,平均要

H(p,q)=∑xp(x)log⁡21q(x)H(p, q) = \sum_x p(x) \log_2 \frac{1}{q(x)}

个 bit。关键性质是 H(p,q)≥H(p)H(p, q) \ge H(p),等号当且仅当 q=pq = p。也就是说:模型越好,交叉熵越低,越接近真实的熵——任何模型的交叉熵都是真实熵的一个上界。而交叉熵可以只用来自 pp 的样本(真实的文本)来估计:在一段文本上算 −1N∑ilog⁡2q(xi∣x1:i−1)-\frac{1}{N}\sum_i \log_2 q(x_i \mid x_{1:i-1}) 就行。

这正是训练语言模型的目标:最小化在训练文本上的交叉熵(等价于最大化似然)。所以”训练一个更好的语言模型”、“给出英语熵的更紧的上界”和”把文本压缩得更短”是同一件事(第 11 讲)。1951 年,Shannon 让人来玩一个猜字母的游戏(“the mouse ate my ho_“,下一个字母是什么?),用人当语言模型,估计英语大约是每个字母 0.6–1.3 bit。

本课程代码用两个从交叉熵派生的指标:

  • bit/字符(bpc):平均每个字符的交叉熵。字母表有 44 个字符时,什么都没学的均匀分布是 log⁡244≈5.46\log_2 44 \approx 5.46 bit。
  • 困惑度(perplexity) =2bpc= 2^{\text{bpc}}:可以理解为”模型平均在几个选项之间犹豫”。均匀分布的困惑度是 44;困惑度 1.5 意味着模型平均只在一两个字符之间犹豫。

CS324 课程笔记指出了困惑度的一个重要性质:它对两种错误的惩罚很不一样。

错误例子对困惑度的影响对生成的影响
召回错误(recall error):给真实出现的 token 几乎为 0 的概率模型认为 “cheese” 后面不可能是 ”.”非常大——一次 −log⁡0=∞-\log 0 = \infty 就能让困惑度爆掉不大
精确度错误(precision error):把概率分给不该出现的东西混入 5% 的乱码很小(困惑度只升高约 5%)很大——生成的文本有 5% 是乱码

所以,困惑度低不保证生成的文本好;评价生成模型需要别的指标(§4.4、代码 01 演示 4 和代码 02 演示 5 用的”格式合法率 / 为真率”就是一个例子)。

2.5 从 n-gram 到神经语言模型

n-gram 模型:预测下一个 token 时,只看前面 n−1n-1 个 token,概率就是在语料里数出来的频率:

p(xi∣xi−n+1:i−1)≈count(xi−n+1:i−1,xi)count(xi−n+1:i−1).p(x_i \mid x_{i-n+1:i-1}) \approx \frac{\text{count}(x_{i-n+1:i-1}, x_i)}{\text{count}(x_{i-n+1:i-1})}.

它从 1970 年代起就是语音识别(IBM 的 Jelinek 等人)、1990 年代起是统计机器翻译的核心部件,而且可以做得非常大:2007 年 Google 的 Brants 等人在 2 万亿个 token 上训练过 5-gram 模型——比 GPT-3 的训练数据(约 3000 亿 token)还多。训练 n-gram 就是数数,计算上极其便宜。

但 n-gram 有一个根本矛盾,代码 01 演示 3、4 在迷你互联网(约 26 万字符、5 种体裁)上把它量化了出来:

矛盾一:n 小,看不到远处的信息。 迷你互联网里有”kari lives in varno.”这样的人物介绍。要猜对城市,必须看到 14 个字符之前的名字。演示 4 从各阶 n-gram 里采样:n = 8、10 时,生成的人物介绍里城市只有约 11% 是对的——和在 8 个城市里瞎猜(12.5%)差不多;n = 14 时上下文刚好盖住名字,升到 60%。评论的评分离食物形容词有 30 多个字符,n = 14 也看不到,所以生成的评论常常”形容词说好、评分说差”。这叫**长程依赖(long-range dependency)**问题。课程笔记的例子是:“Stanford has a new course on large language models. It will be taught by ___“——要填对,得看到很远之前的 “Stanford”。

矛盾二:n 大,数据不够。 演示 3 的表格(节选):

n训练 bpc验证 bpc验证困惑度验证集里没见过的上下文(math 行)
14.5734.55023.420.0%
40.7380.7511.680.0%
80.3910.5851.5043.5%
140.3570.5511.4643.5%
320.3730.6961.6243.5%

验证集上 n = 14 最好,再往上反而变差:上下文越长,越多的上下文在训练语料里一次都没出现过,模型在那里只能给出均匀分布。这叫数据稀疏(data sparsity)。一个值得注意的细节:稀疏几乎全部来自加法那一种体裁(“37+45=82.”)。人物介绍、评论、故事是由很少的词按模板拼出来的,长上下文早就见过;而两位数加法有 8100 道题,训练集只有约 1900 行,一道新题的”37+45=“就是一个没见过的上下文。真实的语言更像加法,而不是模板:词的组合几乎无穷多,所以在真实英语上,稀疏在 n = 4、5 时就已经很严重,哪怕语料有万亿个词。

稀疏在生成时的后果更直观。演示 4 里,高阶 n-gram 生成的行有一半左右会在中途”掉下悬崖”:

n = 10   60+82=142.li:+?=rt.pv1e2ap0ejuyv97vtriy:0p4jhj3yg

前面的加法甚至是对的,但”0+82=142.”这个上下文没见过,模型给出均匀分布,抽到一个怪字符之后,后面的上下文就更没见过了,再也回不到正轨。

神经语言模型的出路是:不再”按字面查表”,而是用一个神经网络把上下文映射成一个向量,再从向量算出下一个 token 的分布。相似的上下文会被映射到相近的向量,于是”没见过但相似”的上下文也能共享统计信息。这条路的里程碑:

  • Bengio et al.(2003):第一个神经语言模型(前馈网络 + 词向量)。在同样的数据上比 n-gram 好,但计算太贵,之后十年 n-gram 依然是主流——因为它更容易扩展到大数据。
  • RNN / LSTM 语言模型(2010 年起):理论上能看到整个前文(相当于 n=∞n = \infty),但难训练、难并行。
  • Transformer(2017):上下文长度有上限(GPT-3 是 2048 个 token),但非常适合 GPU 并行训练,于是第一次让”大网络 + 大数据”变得可行(第 3、8 讲)。

用 CS324 笔记的话说:n-gram 计算高效、统计低效;神经语言模型统计高效、计算低效。随着硬件和算法的进步,计算效率的短板被补上,神经网络就赢了。

代码 02 在同一份数据上训练了一个约 11 万参数的小 Transformer(tiny_gpt.py,第 3 讲拆开),按体裁和最好的 n-gram 比较验证集 bpc:

体裁14-grambase model(小 Transformer)
bio(人物介绍)0.5310.474
qa(问答)0.4770.430
math(加法)4.1591.879
review(评论)0.2530.212
story(故事)0.1900.192
合计0.5510.360

差距最大的正是 n-gram 的两个弱点所在:需要长程信息的地方(人物事实、评论评分),以及组合爆炸的地方(加法:新题对 n-gram 是没见过的上下文,对神经网络只是”见过的数字的新组合”)。故事体裁两者打平——它的规律全在几个字符之内,查表就够了。

2.6 从语言模型到”预训练”

到 2010 年代中期,语言模型已经是很好的文本生成器,但大家还没意识到它是很好的通用表示学习器。转折来自”先在大量文本上学表示,再用到下游任务”这条路线:

年份工作预训练学到什么怎样用到下游
2013word2vec(Mikolov et al.)、GloVe每个词一个固定向量当作下游模型的输入特征
2018.2ELMo(Peters et al.)上下文相关的词表示(双向 LSTM 语言模型)特征 + 下游模型
2018.6GPT(Radford et al.)整个 Transformer 解码器(预测下一个词)在下游任务上微调整个模型
2018.10BERT(Devlin et al.)整个 Transformer 编码器(预测被遮住的词)微调整个模型;刷新了几乎所有 NLP 基准
2019GPT-2、T5更大的模型、更多的数据GPT-2 展示了不微调、直接用提示的 zero-shot 能力
2020GPT-31750 亿参数few-shot 提示:不改参数,在提示里给几个例子

这张表里有一个清晰的趋势:预训练的部分越来越多,下游任务专门的部分越来越少——从”只预训练词向量”到”预训练整个模型再微调”,再到”预训练整个模型,连微调都不要”。这正是 §1.3 说的同质化。BERT 发布一年后就被用进了 Google 搜索;到 2021 年,几乎所有最先进的 NLP 系统都是从少数几个预训练模型适配来的。

BERT 和 GPT 的训练目标不同(遮住中间的词 vs 预测下一个词),架构也不同(编码器 vs 解码器)——第 3 讲会专门比较它们,以及为什么后来 decoder-only 的 GPT 路线成为主流。


3. 配方:自监督预训练 + 适配 · The recipe: pretraining + adaptation

3.1 自监督:数据就是标签

基础模型的第一步是预训练(pretraining):在海量数据上,用一个不需要人工标注的目标训练模型。对语言模型,这个目标就是”预测下一个 token”。

代码 02 演示 1 展示了它是怎样从一段文本里”自动”造出训练样本的。从语料里随机切一段,输入 xx 和目标 yy 只差一位:

x = n d l y . ␣ r a t i n g : ␣ g o o d . ⏎ r e v i
y = d l y . ␣ r a t i n g : ␣ g o o d . ⏎ r e v i e

这一段同时提供了 24 道”填空题”:看到前 1 个字符猜第 2 个,看到前 2 个猜第 3 个……答案就在文本里。监督信号来自数据本身,所以叫自监督学习(self-supervised learning)。

为什么这一点如此关键?因为标注是昂贵的,而文本是几乎免费的。ImageNet 的 120 万张标注图片花了数年和大量人力;而互联网上的文本有数万亿个词,不需要任何人去标。自监督把”数据量的上限”从”能雇多少人标注”提高到了”能找到多少数据”。GPT-3 用了约 3000 亿个 token;2024 年的开放模型已经用到 15 万亿以上。

自监督的目标不止”预测下一个词”一种:BERT 遮住 15% 的词让模型猜(masked LM),CLIP 让模型判断哪段文字配哪张图(对比学习),图像模型可以遮住一部分图像块让模型补全。它们的共同点是:从数据本身构造出一个”猜”的任务,而要猜得好,就得学到数据背后的结构。第 3 讲比较这些目标。

3.2 规模

自监督解决了”数据从哪里来”,接下来的问题是”模型要多大”。2018–2021 年,语言模型的规模几乎每年增长一个数量级(CS324 Winter 2022 笔记的表格):

模型机构年份参数量
ELMoAI220189400 万
GPTOpenAI20181.1 亿
BERT-LargeGoogle20183.4 亿
GPT-2OpenAI201915 亿
Megatron-LMNVIDIA201983 亿
T5Google2019110 亿
Turing-NLGMicrosoft2020170 亿
GPT-3OpenAI20201750 亿
Megatron-Turing NLGMicrosoft、NVIDIA20215300 亿
GopherDeepMind20212800 亿

四年间增长了约 5000 倍。之后还有 PaLM(Google,2022,5400 亿;第 10 讲的客座报告)。规模带来了什么?两件事(第 4、5 讲):

  1. 平稳的改进:损失随参数、数据、算力按幂律下降——可以预测,可以规划(scaling laws)。
  2. “新”的能力:某些能力在小模型上几乎为零,到了某个规模才明显出现。GPT-3 论文里,两位数加法对小模型接近 0,对 1750 亿参数的模型接近 100%;few-shot 学习的收益也随模型变大而变大。

一个值得记住的观点(CS324 笔记):这些模型背后的核心技术,从 2018 年到 2020 年并没有本质变化——还是 Transformer、还是预测下一个词。变的主要是规模。“更多是不同的(more is different)“——规模本身带来了质变,这是这门课存在的原因之一。

规模也有代价:GPT-3 的一次训练需要约 3.1×10233.1 \times 10^{23} 次浮点运算,当时估计的算力成本是数百万美元(常被引用的估计约 460 万美元)。这意味着只有少数机构训练得起最大的模型(§5.7、第 10、19 讲)。

3.3 一个迷你实验:能力在预训练中先后出现

代码 02 演示 2 在笔记本 CPU 上把这个配方完整地走了一遍。“迷你互联网”有 5 种体裁,每种对应真实互联网上的一类内容:

bio     kari lives in varno.                                             ← 维基百科式的人物介绍
qa      q: where does kari live? a: varno.                               ← 问答网站(只有一半的人有)
math    37+45=82.                                                        ← 计算题
review  review: the soup was tasty but the host was rude. rating: ok.    ← 带评分的评论
story   the pilot finished the work. then she went home.                 ← 带代词的叙述

模型是一个 2 层、64 维、约 11 万参数的 decoder-only Transformer,用”预测下一个字符”训练 3000 步(约 1 分钟)。训练过程中每 500 步停下来,只用提示(不改参数)测试 7 种能力(exact match 准确率):

step验证 bpc事实补全问答·见过格式问答·没见过·城市问答·没见过·职业加法·见过的题加法·新题评论打分
05.4910.000.000.000.000.000.000.00
5000.5850.220.200.070.070.010.010.97
15000.4490.500.270.200.170.030.011.00
20000.4260.680.730.330.230.010.031.00
30000.4090.930.970.470.270.120.091.00

(“事实补全”:提示 “kari lives in”;“问答·见过格式”:有问答文本的 30 人;“问答·没见过”:另外 30 人,他们的事实只以叙述句出现过;“加法·新题”:训练语料里没有的 200 道题。)

几个值得细看的地方:

  1. 能力不是一起长出来的。 评论打分在 500 步时就接近满分;人物事实要到 1500–2500 步才大幅上升;跨格式的问答到最后也只做到一半;加法新题始终没出现。为什么评论最早?它只需要一条对所有评论都适用的规则(两个形容词的正负决定评分),一千九百多条评论都在为这条规则提供证据;人物事实则是 60 个人、每人两条互不相关的具体事实,每条只有几十行文本作证。
  2. 知识可以跨格式使用,但不完整。 有 30 个人从没出现在问答里,模型只在叙述句里见过他们。用问答格式问他们住在哪里,答对 0.47;问职业只有 0.27。职业为什么更差?一个直觉的猜测是”方向”:在 5 个人物介绍模板里,城市总是出现在名字后面,而职业有一个模板出现在名字前面(“the baker kari lives in …”)。真实的大模型确实有方向性的问题(“reversal curse”:学了”A 的妈妈是 B”不等于能回答”B 的孩子是谁”,第 5 讲再谈)。但这个猜测经不起检验:把那个模板改成职业在名字后面、重新训练(练习 6),职业只从 0.27 升到 0.33,差距仍在。像这样”先提出一个解释,再设计实验去推翻它”,是研究基础模型的基本功。
  3. 小模型没学会加法。 见过的题 0.12、新题 0.09,几乎一样低:既没背住(每道题在语料里平均只出现约 1 次),也没学会进位。这和 GPT-3 论文里”小模型的两位数加法接近 0”是一致的。

这个实验当然不能替代真正的大模型实验——我们的模型小了上百万倍,迷你互联网也比真实语料简单得多。它能说明的是机制:一个单一的、无标签的训练目标,会在训练过程中先后”长出”各种具体能力;哪种能力先出现,取决于数据里有多少证据支持它、它需要多少”记忆”或”计算”。

3.4 适配:把基础模型变成任务模型

预训练好的模型本身只会”续写”。把它变成一个具体任务的模型,叫适配(adaptation)。CS324 笔记把适配方法分成两大类:

(1) 提示(prompting):不改任何参数,把任务写成一段文字,让模型续写。

zero-shot:  q: where does batul live? a:                       → 模型续写 " quila."
few-shot:   q: where does kari live? a: varno.
             q: where does simin live? a: osku.
             q: where does batul live? a:                       → 模型续写

提示里放的例子叫示例(demonstrations),放 kk 个就叫 kk-shot。GPT-3 用这种方式做了几十个任务。它的上限是上下文长度:GPT-3 只有 2048 个 token,放不下多少例子。

(2) 训练(training):用少量标注数据更新模型的一部分或全部参数。

方法更新什么代价
探针 / 线性探测(probing)冻结整个模型,只在它的内部表示上训练一个很小的分类器(通常是线性的)最便宜;表示里没有的信息读不出来
全量微调(fine-tuning)更新所有参数每个任务存一份完整模型;数据少时容易过拟合
轻量微调(lightweight fine-tuning)只更新很少的新增参数(prompt tuning、prefix tuning、LoRA、adapter……)介于两者之间,第 6 讲

还有一类更”通用”的适配——指令微调和人类反馈强化学习(RLHF)——它不是为某一个任务,而是让模型学会”听指令”,ChatGPT 就是这样来的(第 7 讲)。

预训练到底带来了什么? 代码 03 用探针回答了两个问题。

演示 1:标签给不了的知识。 任务:给出一个人的名字,判断他住在北方还是南方。“region”这个词从没在迷你互联网里出现过;名字是随机音节,里面也没有任何关于住处的信息。随机抽 kk 个人当标注数据,在其余人上测试(重复 20 次取平均):

特征k = 4k = 8k = 16k = 32
多数类基线(永远猜 north)0.6000.6000.6000.600
预训练表示(读在 “kari lives in ” 末尾)0.5600.6040.6410.739
预训练表示(读在名字的最后一个字符)0.5120.5240.4910.513
从零开始(名字的字母计数)0.5340.4970.4850.504
上限参照(直接告诉它真实城市)0.6430.7880.9200.973

只看名字的从零模型永远是瞎猜——信息根本不在输入里。预训练表示(读在模型正要说出城市名的位置)随标签增加稳步上升到 0.74:标签只教会了探针”哪些城市算北方”,“这个人住在哪个城市”是预训练时从文本里学到的。这就是基础模型最核心的价值:把大量无标签数据里的知识,带到只有少量标签的任务里。 两个细节同样重要:(a) 读在名字的最后一个字符处就不行——那个位置的模型只需要预测下一个词是 “lives” 还是 “works”,还没有”想起”城市;表示里有什么,取决于模型在那个位置要做什么预测。(b) 离上限还有距离:这个小模型对每个人的城市并不完全确定(事实补全 0.93),城市信息在 64 维表示里也不一定线性可读。

演示 2:标签很少时帮多大忙。 任务:评论里的食物好不好(不管服务)——预训练时从没有这个标签。比较预训练表示 + 线性探针和从零训练的词袋(bag-of-words)逻辑回归:

设定特征k = 4k = 16k = 32k = 128k = 512
A:测试用词在标注数据里都可能见过预训练表示(“rating: ” 末尾)0.6610.8710.9540.9820.989
从零:词袋0.5270.6420.7670.9601.000
B:测试用的食物形容词在标注数据里从没出现预训练表示(“rating: ” 末尾)0.6120.8450.8890.9320.941
从零:词袋0.5020.5220.5120.5100.495

设定 A 是一个诚实的提醒:预训练的优势主要在标签稀缺时。标签多了以后,最简单的词袋模型也能学会”tasty 是好的、stale 是差的”,并在 k = 512 时反超。设定 B 揭示了预训练表示真正独特的地方:测试评论里的形容词(“lovely”、“greasy”……)在标注数据里一次都没出现过,词袋模型对它们一无所知(≈ 0.5);预训练模型却在预训练时见过它们和评分的关系,已经”知道”它们的正负,所以能泛化到标注数据之外(0.94)。代码 03 还比较了第三种特征——把评论各位置的表示平均起来——它在设定 B 里只有 0.52–0.67:读表示的方式同样重要。


4. 能力:GPT-3 能做什么、不能做什么 · Capabilities

4.1 GPT-3 的成绩单

GPT-3 论文(Brown et al., 2020)在几十个标准基准上测试了一个从没为这些任务训练过的模型。CS324 课程笔记 Capabilities 挑出了有代表性的几类(下表数字都引自那份笔记;默认设定是 1750 亿参数的模型,在上下文里放尽可能多的示例):

任务类型基准GPT-3对照怎么看
语言建模Penn Treebank 困惑度(zero-shot)20.5此前 zero-shot 最好的 GPT-2:35.8本行就是”预测下一个词”,大幅领先
长程语言建模LAMBADA(预测需要读完整段才能猜的最后一个词)困惑度1.92(few-shot)之前最好 8.63需要 few-shot 示例告诉它”只填最后一个词”
常识选择题HellaSwag 准确率79.3微调的 SOTA 85.6没训练过也接近
闭卷问答TriviaQA71.2(few-shot)检索增强的 RAG 68.0知识全在参数里,超过了能查资料的系统
闭卷问答NaturalQuestions29.9RAG 44.5问题越”冷门”,参数里的知识越不够
翻译WMT’16 德 → 英 BLEU40.6(few-shot)有监督 SOTA 40.2;GPT-3 zero-shot 27.2译入英语强,译出英语弱得多
算术2–5 位加减乘两位数加减接近满分,位数越多越差不是”懂了”算术,但远超预期
新闻生成人类判断”是不是机器写的”人的准确率约 52%瞎猜 50%人基本分不出来

(Penn Treebank 一行的对照数字取自 GPT-3 论文表 3.1。)

整体结论(也是 CS324 笔记的结论):有的任务很好,有的一般;模型越大、示例越多,效果越好;但我们并不清楚它为什么能做到。 另外,论文为了避免”测试题在训练数据里见过”的问题,没有报告 WikiText-103 上的困惑度——因为它取自维基百科,而维基百科就在 GPT-3 的训练数据里(§4.4)。

4.2 上下文学习 In-context learning

GPT-3 论文的标题是 Language Models are Few-Shot Learners。它最重要的发现是上下文学习(in-context learning, ICL):在提示里放几个”输入 → 输出”的例子,模型就能对一个新的输入给出合适的输出——不更新任何参数。

Input: Where is MIT?                         ← 课程笔记里的例子
Output: MIT is in Cambridge.

Input: Where is University of Washington?
Output: University of Washington is in Seattle.

Input: Where is Stanford University?
Output:                                      ← 模型从这里续写,给出 Stanford 所在的地方

为什么说这件事令人吃惊?对比一下传统的监督学习:要学一个新任务,需要收集数据、计算梯度、更新参数,学完的模型只会这一个任务。ICL 里,“学习”发生在一次前向传播之内:模型读了几个例子,就”切换”到了这个任务。同一个模型,换一组例子,就换了一个任务。

ICL 是 §1.3 说的”涌现”的标准例子:没有人设计它,没有训练目标直接奖励它。它从哪里来?这是第 5 讲的主题,几种主要的解释是:互联网文本里本来就有大量”列表、问答、模式重复”的结构,预测下一个词的模型必须学会”从前文推断当前文档在做什么”;这可以看成一种隐式的贝叶斯推断(Xie et al., 2021);而在模型内部,有一类叫 induction head 的注意力电路专门做”找到前文里相同的模式,照着往下写”(第 12 讲)。

ICL 也有明显的局限,迷你实验能看到其中一个。代码 02 演示 4 对 30 个只在叙述句里出现过的人,用不同的提示问”住在哪个城市”:

提示格式准确率
叙述句补全 “batul lives in”(训练里最常见的格式)0.93
问答格式,zero-shot0.47
问答格式,2-shot(先给 2 个别人的问答)0.60
问答格式,4-shot0.57
没见过的格式 “question: … answer:“,zero-shot0.00
没见过的格式,2-shot0.00

知识基本都在模型里(第一行),但取不取得出来,完全取决于问法。示例对见过的格式有一点帮助,对没见过的格式一点帮助都没有——模型甚至不知道该输出一个城市名(它输出了 “the staff”、“warm was” 这样的评论片段)。也就是说,这个 11 万参数的小模型不会”从提示里的例子学新格式”,只会”认出它见过的格式”。这和 GPT-3 论文的发现一致:few-shot 带来的提升随模型变大而变大,小模型几乎不会上下文学习。

4.3 一个模型、很多任务

代码 02 演示 3 用同一个 base model、同一组参数,只换提示,做了 6 件事:

知识:事实补全        base lives in                                              → telmi.     ✓
知识:问答            q: where does base live? a:                                → telmi.     ✓
知识:没见过问答的人  q: what does batul do? a:                                  → potter.    ✓
计算:新的加法题      70+73=                                                     → 138.       ✗(应为 143)
分类:评论打分        review: the cake was sour but the staff was quick. rating: → ok.        ✓
续写:故事            the pilot finished the work. then                          → she went home.

这就是同质化在使用者眼里的样子:任务变成了提示。它同时说明了”能力从数据里来”:模型会给评论打分,是因为迷你互联网里有带评分的评论;会问答,是因为有问答”网站”。GPT-3 能翻译、问答、写代码,也是因为互联网上有大量这样的文本。一个模型在预训练数据里没见过的东西,提示再巧也很难让它凭空做出来——这是第 2 讲(数据)的出发点。

4.4 评测为什么难

基础模型让评测变成了一个研究问题本身。几个从本讲就能看到的难点:

  1. 提示敏感:§4.2 的表格里,同一个模型、同一个知识,准确率从 0.93 到 0.00,全看怎么问。所以”模型 A 比模型 B 好”这句话必须带上”在什么提示下”。CS324 笔记还提到,即使是多项选择题,怎样用模型的概率来选答案也有好几种做法(直接比较概率——偏向短答案;按长度归一化;除以”中性提示下这个答案的概率”——惩罚本来就常见的答案),结果会不一样。
  2. 数据污染(contamination):测试题可能就在训练数据里。GPT-3 主动排除了 WikiText-103;但对一个用整个互联网训练的模型,你很难确定哪些基准没被它见过。我们的迷你实验也有一个小版本:验证集里的人物介绍行,在训练集里通常有一模一样的副本(每个模板重复了 4 次),所以 bio 体裁的验证 bpc 是偏乐观的。第 2 讲专门讨论去重和污染检测。
  3. 指标和我们关心的东西之间有距离:困惑度对”生成乱码”不敏感(§2.4);exact match 对”差一点就对了”毫不留情(第 5 讲会说明,这可能让能力看起来”突然出现”)。
  4. 开放式生成没有标准答案:写新闻、写故事、聊天,好坏怎么打分?GPT-3 用了人工评测;后来出现了用模型当评委的方法(以及它们自己的偏差)。

CRFM 在 2022 年推出了 HELM(Holistic Evaluation of Language Models),试图在统一的设定下、从准确率、校准、鲁棒性、公平性、偏见、毒性、效率等多个维度系统地评测基础模型——这本身就说明”评测基础模型”需要一个专门的框架。

4.5 不只是语言

“基础模型”之所以不叫”大语言模型”,是因为同一个配方在其他数据上同样有效(第 14、15 讲):

  • 视觉 + 语言:CLIP(2021)用 4 亿对网上的”图片 + 说明文字”做对比学习,之后只要写一句 “a photo of a dog”,就能零样本分类图片;DALL·E、Stable Diffusion 从文字生成图片。
  • 代码:Codex(2021)、CodeGen 在代码上预训练,能根据注释写函数。
  • 科学:蛋白质语言模型(ESM)只在氨基酸序列上做掩码语言建模,却学到了蛋白质结构的信息;Hazy 博客里提到的医学、法律应用也在快速出现。
  • 数据工作:§1.1 提到的实体匹配、数据清洗——这些”无聊但重要”的任务,用提示就能做到当时的最好水平。

5. 风险:同一个模型,同一组缺陷 · Risks

CS324 课程笔记列出了 8 类风险。它们不是”以后再说”的附录:这门课后半部分(第 16–19 讲)每一讲专门讨论其中几类。本节先建立全景,并用迷你实验给其中几类一个最小的、可以动手的例子。

5.1 可靠性:流畅 ≠ 正确

基础模型经常出错,而且错得很自信。课程笔记的例子:问 GPT-3 “谁发明了互联网”,它答 “Al Gore”。在医疗、法律这样的高风险场景,“看起来对”的错误答案比”明显不知道”更危险。今天我们把这种现象叫做幻觉(hallucination)。

迷你实验里能清楚地看到它的两个来源:

  • n-gram 的幻觉来自”看不见”(代码 01 演示 4):名字在 14 个字符之前,n = 10 的模型看不到是谁,就随便填一个城市——格式完美,内容是瞎猜。
  • 神经网络的幻觉来自”记不准”和”采样”(代码 02 演示 5):base model 生成的人物介绍里,“人物事实为真”的比例在 T=0.8T = 0.8 时是 79%,T=1T = 1 时 72%,T=1.5T = 1.5 时 65%(每个温度只有二三十行这样的句子,只看趋势)——假的句子和真的句子格式一模一样。
温度格式合法其中内容为真新的、合法且为真人物事实为真
0.599%97%38%100%(3 行)
0.895%84%28%79%(24 行)
1.091%67%19%72%(36 行)
1.547%44%4%65%(31 行)
2.017%2%0%0%(2 行)

温度是”多样性 vs 正确性”的旋钮:越低越保守、越正确,但越单调(T=0T = 0 永远生成同一行);越高越多样,但错得越多。没有一个温度能让模型”只说真话”——它根本没有”真”的概念,只有”概率”。

5.2 社会偏见

模型在不同群体上的表现可能不同(性能差异),也可能复现刻板印象(社会偏见)。课程笔记的例子:比较 “The software developer finished the program. He celebrated.” 和 ”… She celebrated.” 的概率,模型更偏向前者。偏见首先来自数据——模型学的就是数据的统计。

代码 03 演示 3 在迷你世界里做了同样的测量。迷你互联网的”故事”里,有 4 个职业后面的代词比例是偏斜的(这些比例是随意设定的,不对应任何真实统计):

职业语料里 she 的比例模型给 she 的概率(4 种句式)T = 1 采样T = 0.5 采样贪心
pilot0.840.74 / 0.85 / 0.85 / 0.750.750.90she
potter0.730.67 / 0.78 / 0.76 / 0.710.610.78she
tailor0.120.26 / 0.20 / 0.17 / 0.080.280.09he
judge0.250.43 / 0.41 / 0.29 / 0.170.390.32he
baker(语料 50 : 50)0.460.53 / 0.67 / 0.45 / 0.430.510.52she

(完整的 8 个职业见代码输出。)三个发现:

  1. 模型学到了偏斜,方向和语料一致,在 4 种不同的句式里都是如此。它没有”故意”偏向谁,它只是学了数据的统计——而这正是问题所在。
  2. 解码方式会放大偏斜。 用”|she 的比例 − 0.5|“在 8 个职业上的平均来量化偏斜:语料 0.173,模型概率 0.152,T=1T = 1 采样 0.117,T=0.5T = 0.5 采样 0.219,贪心解码 0.500——每个职业都变成 100 : 0,包括语料里 50 : 50 的职业(模型概率只要是 0.53,贪心就永远选 she)。同一个模型,部署时选的解码方式不同,表现出的偏见程度也不同。
  3. 偏斜在所有”应用”里方向一致——这是同质化的代价(§5.8)。

真实世界的偏见测量要复杂得多:怎样定义”公平”、用什么基准、偏见出现在表示里还是在下游决策里(第 18 讲)。

5.3 有害内容

训练数据来自互联网,互联网上有大量冒犯性、仇恨性的内容。模型会学会生成它们,有时甚至在无害的提示下。RealToxicityPrompts(Gehman et al., 2020)系统地测量了这一点;GPT-3 也被发现会生成针对特定宗教群体的刻板印象。对写作助手、聊天机器人,这是直接的部署风险。过滤训练数据是一种应对,但过滤器本身会带来新的偏差(例如把某些方言误判为”有害”而删掉——第 2、18 讲)。

5.4 虚假信息

§4.1 里,人类读者分不出 GPT-3 写的新闻。这意味着生成流畅、有说服力的虚假内容的成本大大降低:恶意的行动者(包括国家)可以低成本、大规模、用任何语言制造虚假信息,而不需要会说那种语言的人。检测机器生成的文本本身也是一个困难的研究问题。

5.5 安全

基础模型的训练数据来自公开的网络,这意味着任何人都可能往里面”投毒”。课程笔记引用了一个例子(Wallace et al., 2021):在训练数据里放入少量精心构造的文档,就能让模型在提示里出现 “Apple iPhone” 时生成负面内容——而这些投毒文档本身看起来毫无异常。第 17 讲的客座报告(Carlini)更进一步:对 LAION 这样的”URL 列表”式数据集,花几十美元买下过期的域名,就能控制一部分训练数据。当越来越多的系统建立在同一个基础模型上,一次成功的投毒会影响所有人。

5.6 隐私与法律

基础模型会记住训练数据的一部分,而且能被”问”出来(第 16 讲:训练数据提取攻击)。代码 01 演示 4 里,高阶 n-gram 生成的行有三分之一是训练集原句——在迷你世界里这只是”背诵”,在真实世界里,被背下来的可能是某个人的电话号码和住址。

法律问题同样没有定论(第 19 讲):用受版权保护的书训练模型算不算”合理使用”(fair use)?课程笔记的例子是:给 GPT-3 输入《哈利·波特》的开头,它会自信地接着往下写。模型生成的内容侵权,责任在谁——训练者、部署者还是用户?这些问题在 2023 年之后变成了真实的诉讼和立法。

5.7 成本、环境与访问

  • 成本:GPT-3 的一次训练需要数千张 GPU、数百万美元。这是一次性成本;推理(每次有人使用)是持续的成本。
  • 环境:大量计算意味着大量能耗和碳排放。账算起来并不简单——一个通用模型可能替代很多专用模型,从而节省总的计算;但训练很多”差不多”的大模型又是浪费(第 19 讲)。
  • 访问:2018 年的 BERT 是完全公开的;2020 年的 GPT-3 只能通过 API 使用,研究者看不到它的权重、训练数据和训练细节。最强的模型越来越封闭,这让独立的研究、审计和问责变得困难。当时的反向努力包括 Hugging Face 牵头的 BigScience(训练了开放的 BLOOM)、EleutherAI(开放的 GPT-J、GPT-NeoX,以及 2023 年的 Pythia)和斯坦福 CRFM(第 13 讲的客座报告专门讨论”像开源软件一样构建模型”)。

5.8 同质化的代价:单点故障

把前面几类风险串起来的,是 §1.3 的同质化。代码 03 演示 3 用 4 种不同的句式代表建立在同一个 base model 上的 4 个”应用”——一个写故事的工具、一个自动补全、一个对话系统……偏斜在 4 个应用里方向完全一致。如果很多产品都建立在同一个基础模型上,它们会共享同一组缺陷:

  • 同一个偏见,出现在招聘、贷款、医疗、教育的每一个下游系统里;
  • 同一个安全漏洞,所有下游系统都要修;
  • 同一个人,可能被所有系统同时拒绝(第 18 讲讨论的”结果同质化”)。

反过来,同质化也让修复变得高效:在基础模型上修一次,所有下游都受益。这就是为什么基础模型的研究不只是”让它更强”,也是”让它可以被检查、被理解、被修正”——机制可解释性(第 12 讲)、数据文档化(第 2 讲)、开放模型(第 13 讲)都和这一点有关。


6. 2023 年之后 · Since 2023

CS324 Winter 2023 开课时,GPT-4 还没有发布,最大的开放模型是 BLOOM(1760 亿参数)和 OPT-175B,ChatGPT 才出现 6 周。此后几年变化很快。这里只列和本课程主线直接相关的几条,后面每一讲的”2023 年之后”会展开:

  • 对齐成为标配。 ChatGPT 证明了”基础模型 + 指令微调 + RLHF”的威力。之后几乎所有面向用户的模型都经过这一步;DPO(2023)等方法让偏好对齐变得更简单(第 7 讲)。
  • 开放权重模型的爆发。 Meta 的 LLaMA(2023.2)之后,Llama 2/3、Mistral / Mixtral(混合专家)、Qwen、DeepSeek 等开放权重模型迅速追赶,§5.7 的”访问”问题部分缓解;同时,“开放权重”不等于”开放数据与训练过程”,透明度的问题仍在(第 13 讲)。
  • 数据成为核心竞争力。 训练数据从几千亿 token 增长到十几万亿 token;FineWeb、DCLM 等开放数据工作把”数据过滤与配比”变成了严肃的科学问题;合成数据被大量使用(第 2 讲)。
  • 规模的含义变了。 Chinchilla(2022)修正了”参数 vs 数据”的最优分配;后来很多模型为了降低推理成本,故意在远超”计算最优”的数据量上训练较小的模型(第 4 讲)。
  • 推理时计算(test-time compute)。 2024–2025 年,OpenAI o1、DeepSeek-R1 等”推理模型”用强化学习训练模型在回答前生成很长的思维链,在数学和编程上大幅提升。这是第 5 讲 chain-of-thought 一路发展下来的结果。
  • 原生多模态与智能体。 模型能同时处理文本、图像、音频,能调用工具、在环境中行动(第 14 讲)。
  • 监管落地。 欧盟 AI 法案(2024 年生效)对”通用目的 AI 模型”提出了专门的义务;版权诉讼进入法院(第 19 讲)。

但这门课的核心问题一个都没有过时:数据从哪里来、规模怎样带来能力、能力怎样被适配和对齐、我们是否理解它、它对社会意味着什么。 2023 年之后的进展,大多是在这些问题上走得更远,而不是让它们消失。


7. CS324 的结构与本讲义地图 · Course structure & map

7.1 原课的结构

CS324 Winter 2023 由 Christopher Ré、Percy Liang、Tatsunori Hashimoto 主讲,线上授课:

  • 第 1–4 周:教师讲座,讲基础并综述这个领域。
  • 第 5–10 周:每次课一位客座讲者(通过 Stanford MLSys Seminar),之后有一个仅限选课学生的问答。讲者来自 Google、OpenAI、Meta、Anthropic、EleutherAI 等机构和多所大学,题目从 FlashAttention、PaLM、机制可解释性到数据投毒、压缩与通用智能、基础模型伦理。
  • 早期作业(20%):在 Colab 里动手 prompting 开放模型(BLOOM、BLOOMZ):选一个任务和评测数据集 → 开发提示(体会”提示很强大但很脆弱”)→ 沿两个维度比较模型:模型大小,以及训练方式(普通自回归 vs 指令微调)。本讲代码 02 的演示 2、4 是这个作业在迷你世界里的缩影。
  • 课程项目(75%):1–3 人一组,做一个基础模型驱动的应用 / demo,或者一个研究项目。
  • 出勤与参与(5%)。

CS324 Winter 2022 的课程笔记把这个领域组织成一个”洋葱”,从外到内:行为(只通过 API 观察模型能做什么、有什么危害)→ 数据(训练数据决定了什么)→ 构建(架构、训练、系统)→ 超越语言(token 可以是代码、图像、蛋白质,语言模型只是基础模型的一种)。这个”从外到内”的顺序也很适合自学。

7.2 本讲义的 20 讲

Part内容讲次
I · 基础导论;数据;架构与训练目标;规模定律;涌现与上下文学习1–5
II · 适配与对齐提示、探针、微调与参数高效方法;指令微调、RLHF 与 Constitutional AI6–7
III · 系统与训练GPU 性能与 FlashAttention;分布式与去中心化训练;PaLM / OPT / BLOOM 的训练实录8–10
IV · 理解基础模型预测即压缩;机制可解释性11–12
V · 生态与应用像开源软件一样构建模型;多模态;领域基础模型(代码、生物医学、法律、RNA)13–15
VI · 社会影响隐私;安全与投毒;伦理与危害;环境与法律;课程总结与前沿16–20

每一讲开头都注明对应原课的哪一次讲座或客座报告、依据了哪些材料(SYLLABUS.md 有完整的对应表)。代码沿用本讲的”迷你互联网 + 小 Transformer”:后面各讲会在 fm_world.py 上改数据(去重、投毒、插入隐私信息……),在 tiny_gpt.py 上做实验(不同规模、上下文学习、LoRA、可解释性……),所以本讲的三个共享模块值得花时间读一读。

7.3 怎样学

  • 先看输出,再读代码。 每个脚本的每个演示后面都打印”观察 Observations”,解释数字说明了什么。建议先运行、读观察,再回头读代码。
  • 代码是”可以改的讲义”。 本讲的每个结论都可以通过改一个参数来检验:把人物介绍的模板改一下,看”问职业”会不会变好;把训练步数加倍,看加法会不会出现;把代词比例改成 50 : 50,看偏斜会不会消失。练习里有几道这样的题。
  • 区分”机制”和”量级”。 小模型能演示机制(自监督怎样产生能力、偏见怎样被继承),但不能演示量级(GPT-3 的能力有多强)。每当讲义从小模型推到大模型时,都会给出真实模型的文献数字作为对照。
  • 和其他课程的关系:如果你学过本目录下的 CS336(从零构建语言模型),第 3、4、8、9 讲可以作为复习,重点看”为什么”和客座报告的部分;CS224N 的预训练、后训练两讲是第 3、7 讲很好的前置。

8. 小结 · Summary

  1. 基础模型 = 在广泛数据上(通常用大规模自监督)训练、可以适配到大量下游任务的模型。这个名字强调它的角色(被很多系统建立在上面)和它的不完整(需要适配,缺陷会被继承),而不是某种特定技术。
  2. 它的意义可以用两个词概括:涌现(能力是训练的副产品,而不是被设计出来的,例如 in-context learning)和同质化(越来越多的系统建立在同一批模型上——杠杆,也是单点故障)。机器学习、深度学习、基础模型三个阶段,分别统一了学习算法、模型架构、模型本身。
  3. 语言模型是序列上的概率分布。自回归模型用链式法则把它分解成”下一个 token”的条件概率;结束符让不同长度的句子能放进同一个分布;温度控制生成的多样性;贪心解码不等于找最可能的句子,还容易陷入重复。
  4. 训练语言模型 = 最小化交叉熵,交叉熵是真实熵的上界,所以”更好的语言模型”、“更紧的熵估计”、“更短的压缩”是同一件事。困惑度对召回错误极其敏感,对精确度错误(生成乱码)却不敏感。
  5. n-gram 计算高效、统计低效:n 小看不到远处,n 大数据不够(迷你实验里,稀疏几乎全部来自组合爆炸的加法行;名字超出上下文时,事实正确率等于瞎猜)。神经语言模型用向量表示上下文,让相似的上下文共享统计,Transformer 让它能在大数据上训练。
  6. 配方:自监督预训练(数据就是标签)+ 适配(提示、探针、微调、指令对齐)。迷你实验里,一个”预测下一个字符”的目标在训练中先后”长出”了评论打分、人物事实、跨格式问答等能力,加法始终没有出现;预训练表示能带来标签给不了的知识(region 探针),并能泛化到标注数据里没见过的词。
  7. GPT-3 在有的任务上追平甚至超过有监督系统(德英翻译、TriviaQA),有的还差得远;模型越大、示例越多越好;上下文学习是它最重要的涌现能力,但小模型几乎不会。评测很难:提示敏感、数据污染、指标与目标不一致、开放式生成没有标准答案。
  8. 风险:可靠性(幻觉)、社会偏见、有害内容、虚假信息、安全(投毒)、隐私与法律、成本与环境、访问。同质化把它们放大:一个模型的缺陷,变成所有下游应用的缺陷(迷你实验里,偏斜在 4 个”应用”里方向一致,贪心解码把它放大到 100 : 0)。

9. 常见误区 · Common pitfalls

  1. “基础模型就是大语言模型。” 语言模型只是一类。CLIP、DALL·E、蛋白质语言模型、机器人基础模型都是基础模型;定义的核心是”广泛数据 + 自监督 + 可适配”,不是”语言”。
  2. “语言模型只会’预测下一个词’,所以不可能有’理解’。” 训练目标简单,不代表把它做好所需要的能力简单(§2.1)。反过来也不要走到另一个极端——“能预测好,所以一定理解了”。“预测好”和”理解”是什么关系,是第 5、11、20 讲反复讨论的开放问题。
  3. “困惑度越低,模型生成得越好。” 困惑度几乎不惩罚”把一点概率分给乱码”(精确度错误),而生成时这些乱码会真的被采样出来(§2.4)。评价生成要看别的指标。
  4. “贪心解码 = 最可能的句子。” 不是(§2.3)。而且最可能的句子也不一定是最好的句子:贪心常常导致重复。
  5. “温度越低越好,因为更准确。” 温度低让输出更保守,但也更单调,而且会放大模型分布里的偏斜(代码 03:贪心把 0.53 : 0.47 变成 100 : 0)。温度是一个取舍,不是一个”越低越好”的旋钮。
  6. “few-shot 就是给模型训练了几个样本。” in-context learning 不更新任何参数;“学习”只发生在一次前向传播里,提示一换就”忘了”。它和 few-shot 微调是两回事。
  7. “模型在某个基准上得了 X 分,说明它会这件事。” 分数取决于提示写法(§4.2:同一个知识,0.93 到 0.00),也可能来自训练数据里见过的测试题(数据污染)。
  8. “预训练总是比从零训练好。” 预训练的优势主要在标签稀缺、或者需要标注数据之外的知识时。标签充足、任务又”表面”简单时,一个词袋模型可能就够了(代码 03 演示 2 设定 A)。永远和一个简单的基线比一比。
  9. “模型有偏见,是因为有人故意让它有偏见。” 绝大多数情况下,偏见是模型忠实地学习了数据统计的结果(代码 03 演示 3)——正因为没有人”故意”,它才更难被发现和修正。
  10. “同质化只是风险。” 它也是杠杆:在基础模型上修一次,所有下游都受益。问题是怎样让这个”一次修复”变得可能(可检查、可理解、可更新)。

10. 练习 · Exercises

练习 1(链式法则与结束符) 用代码 01 的手写 bigram 模型(FIRST 和 NEXT 两张表)手算 p(the ball)p(\text{the ball}) 和 p(the mouse)p(\text{the mouse})。p(mouse∣the)=0.40p(\text{mouse} \mid \text{the}) = 0.40 大于 p(ball∣the)=0.20p(\text{ball} \mid \text{the}) = 0.20,两个句子的概率谁大?为什么?

参考答案

p(the ball)=0.70×0.20×p(</s>∣ball)=0.70×0.20×0.70=0.098p(\text{the ball}) = 0.70 \times 0.20 \times p(\text{</s>} \mid \text{ball}) = 0.70 \times 0.20 \times 0.70 = 0.098; p(the mouse)=0.70×0.40×p(</s>∣mouse)=0.70×0.40×0.25=0.070p(\text{the mouse}) = 0.70 \times 0.40 \times p(\text{</s>} \mid \text{mouse}) = 0.70 \times 0.40 \times 0.25 = 0.070。

“the ball” 反而更大。原因在结束符:在这个模型里,“mouse” 后面通常还要接着写(“ate” 占 0.60),只有 0.25 的概率在这里结束;“ball” 后面 0.70 的概率结束。语言模型给的是一个完整句子(到此结束)的概率,不是”这几个词通不通顺”。“the mouse” 作为一个完整的句子,在这个模型看来不太完整。

练习 2(温度放大偏斜) 模型给 she / he 的概率是 0.53 / 0.47(只考虑这两个选项)。分别在 T=1T = 1、T=0.5T = 0.5、T→0T \to 0 时,生成 she 的比例是多少?写出 TT 对”胜率比”(odds)的一般作用。

参考答案

T=1T = 1:0.53。T=0.5T = 0.5:0.5320.532+0.472=0.28090.5018≈0.560\frac{0.53^2}{0.53^2 + 0.47^2} = \frac{0.2809}{0.5018} \approx 0.560。T→0T \to 0:1.0。

一般地,pT(she)pT(he)=(p(she)p(he))1/T\frac{p_T(\text{she})}{p_T(\text{he})} = \left(\frac{p(\text{she})}{p(\text{he})}\right)^{1/T}:温度把胜率比开 1/T1/T 次方。T<1T < 1 时,任何不等于 1 的胜率比都会被放大;T→0T \to 0 时放大到无穷,于是哪怕 0.53 : 0.47 这样几乎平衡的分布,也会变成 100 : 0。这就是代码 03 里”贪心解码把偏斜放大到 0.500”的原因。

练习 3(困惑度与分词粒度) 代码 02 的 base model 在验证集上是 0.409 bit/字符。(a) 它的困惑度是多少?(b) GPT-3 在 Penn Treebank 上的困惑度是 20.5,能不能说 GPT-3 比我们的小模型”差 15 倍”?

参考答案

(a) 20.409≈1.332^{0.409} \approx 1.33:平均每个字符,模型只在一个多一点的选项之间犹豫。

(b) 不能。困惑度是”每个 token”的,而 token 的粒度不同:GPT-3 的一个 token 大约是 3–4 个字符的一个词片段,我们的 token 是 1 个字符。每个词片段要猜的东西多得多,困惑度自然更高。比较不同分词器的模型,要换算到同一个单位(例如 bit/字节或 bit/字符)。而且两者的数据完全不同:我们的迷你互联网是模板生成的,比真实英语可预测得多。

练习 4(为什么训练集上的交叉熵更低) 代码 01 演示 3 里,14-gram 在训练集上是 0.357 bit/字符,在验证集上是 0.551。“交叉熵 ≥ 熵”这个不等式,能不能用来说”0.357 是迷你互联网熵的一个上界”?

参考答案

不能。H(p,q)≥H(p)H(p, q) \ge H(p) 说的是:用一个事先固定的模型 qq,在来自 pp 的新数据上,期望编码长度不小于熵。训练集上的数字是在模型”见过答案”的数据上算的——模型的计数就来自这些数据,相当于考试前看过考卷,所以它可以低于真实的熵(过拟合、背诵)。只有在模型没见过的数据上算出的交叉熵才是熵的(有噪声的)上界估计。顺便一提,我们的验证集也不完全”干净”:人物介绍的每个模板在训练集里重复了 4 次,验证集里的 bio 行在训练集里通常有一模一样的副本(§4.4 的数据污染)。

练习 5(数据稀疏有多严重) (a) 字母表有 44 个字符时,5-gram 的上下文(前 4 个字符)一共有多少种可能?我们的训练语料有约 26 万个字符,实际只出现了 4,322 种上下文(代码 01 演示 3)。为什么这么少?(b) 如果是词级 5-gram、词表 5 万,可能的上下文有多少种?这说明了什么?

参考答案

(a) 444=3,748,09644^4 = 3{,}748{,}096 种。实际只出现 4,322 种,是因为迷你互联网是模板生成的,只用了很少的词,绝大多数字符组合(例如 “qzx7”)根本不会出现。真实的文本也是”高度结构化”的,这正是语言模型能学到东西的原因。

(b) 500004=6.25×101850000^4 = 6.25 \times 10^{18} 种,比任何语料的 token 数都多好几个数量级。即使真实文本只用到其中极小的一部分,长尾也长到任何语料都覆盖不了——一个新句子里几乎总有没见过的 5 词组合。所以词级 n-gram 很难超过 5,而神经网络通过”相似的上下文共享统计”绕开了这个问题。

练习 6(设计一个实验) 代码 02 里,“问答·没见过”问职业(0.27)比问城市(0.47)差。§3.3 提出了一个假设:职业有一个模板出现在名字前面。设计一个实验检验这个假设,写出你预测的结果。

参考答案

一个干净的设计:只改 fm_world.py 里的一个模板,把 "the {job} {name} lives in {city}." 改成 "{name} the {job} lives in {city}."(职业移到名字后面,其他不变;check_line 里对应的正则也要改),删掉 checkpoints/base_model.pt,重跑代码 02,比较”问答·没见过·职业”。如果假设成立,职业的准确率应该明显上升、向城市靠拢。

我在一份代码副本里跑了这个实验(没有改动课程目录里的文件):职业从 0.27 升到 0.33,城市从 0.47 变成 0.50,其他能力变化不大。30 个人里只多答对了 2 个,在噪声范围之内,而且职业仍然明显落后于城市。所以**“方向”这个解释最多只说明了一小部分**,假设基本被否定。还可能的原因(都没有验证):(1) 城市在 4 个模板里出现,职业只在 3 个模板里出现;(2) 职业词在”故事”体裁里大量出现(“the pilot finished the work”),这些和人物无关的上下文可能干扰了”名字 → 职业”的提取;(3) 问句本身不同(“live” vs “do”)。

做这类实验的注意事项:(1) 一次只改一个变量,否则无法归因;(2) 这个小模型的结果有随机性,最好再换 2–3 个种子(BASE_TRAIN 里的 model_seed、data_seed)看差距是否稳定——30 个人的评测集上,一个人就是 0.033;(3) 做完后把模板改回来、删掉缓存,否则后面几讲读到的是另一个 base model。

练习 7(预训练什么时候输给词袋) 代码 03 演示 2 设定 A 里,k = 512 时词袋模型(1.000)超过了预训练表示 + 线性探针(0.989)。给出两个原因,并提出一种可能让”预训练路线”在标签充足时也不输的方法。

参考答案

原因:(1) 任务在表面特征上就能解决:食物形容词本身决定答案,词袋特征直接编码了”出现了哪个形容词”,标签够多时线性模型就能把每个形容词的正负学准。(2) 线性探针只能读出冻结表示里线性可读的信息:64 维的表示是为”预测下一个字符”优化的,“食物好坏”的信息和服务好坏、评分等混在一起,线性读出有损失。

方法:微调整个模型(或用 LoRA 等轻量微调)而不只是训练探针,让表示本身为任务调整;或者把预训练特征和词袋特征拼在一起。第 6 讲会比较这些方法。值得注意的是,在设定 B(没见过的形容词)里,任何只依赖词袋的方法都无能为力——那才是预训练真正不可替代的地方。

练习 8(困惑度对精确度错误不敏感) 设模型 qq 在某段文本上的交叉熵是 HH。把它和一个”乱码分布” rr 混合:q′=0.95 q+0.05 rq' = 0.95\, q + 0.05\, r。证明 q′q' 的困惑度最多是 qq 的 1/0.95≈1.0531/0.95 \approx 1.053 倍。用 q′q' 生成文本时,会发生什么?

参考答案

对任何 token,q′(x)≥0.95 q(x)q'(x) \ge 0.95\, q(x),所以 −log⁡2q′(x)≤−log⁡2q(x)−log⁡20.95-\log_2 q'(x) \le -\log_2 q(x) - \log_2 0.95。对文本取平均,交叉熵最多增加 −log⁡20.95≈0.074-\log_2 0.95 \approx 0.074 bit,困惑度最多乘以 20.074=1/0.95≈1.0532^{0.074} = 1/0.95 \approx 1.053——只变差约 5%。

但用 q′q' 生成时,每一步都有 5% 的概率从乱码分布里抽一个 token;一段 100 个 token 的文本里平均有 5 个乱码,几乎每段都会被破坏(参见代码 01 演示 4 里 n-gram “掉下悬崖”的样子)。这就是 CS324 笔记说的:困惑度惩罚召回错误、宽容精确度错误,而生成恰恰对精确度错误最敏感。

练习 9(上下文学习) 代码 02 演示 4 里,给 2 个 “question / answer” 格式的示例,准确率仍然是 0.00。(a) 你预测一个大得多的模型(例如 GPT-3)在同样的设定下会怎样?(b) 叙述句补全 0.93、问答 zero-shot 0.47——这说明知识在模型里是怎样”存储”的?

参考答案

(a) 大模型很可能会正确地输出城市名:它在预训练里见过无数种”问题—答案”格式,能从两个示例推断出”这里要填一个城市”,这正是 GPT-3 论文观察到的”few-shot 收益随规模增大”。在迷你互联网里,问答格式只有一种(“q: … a:”),小模型也没有足够的容量学会”从示例推断格式”这种一般的能力。

(b) 知识的存储和提取方式绑在一起:模型最擅长用它见过最多的那种”路径”提取知识(“kari lives in” → 城市)。换一种路径(问答格式),只有一部分知识能被取出。这和真实 LLM 的现象一致:知识”在模型里”不等于”用任何问法都能问出来”;Allen-Zhu & Li 的 Physics of Language Models 系列发现,预训练数据里同一事实的表述越多样,知识越容易被灵活提取(第 2、5 讲)。

练习 10(风险的源头) 对 §5 的 8 类风险,在 §1.4 的生态图(数据创造 → 数据整理 → 训练 → 适配 → 部署)里找出它最主要的源头环节,并说出一个在那个环节上的缓解手段。

参考答案

参考(答案不唯一,很多风险有多个源头):

风险主要源头一个缓解手段
可靠性 / 幻觉训练(目标是”概率”不是”真”);部署(解码方式)检索增强、校准、让模型说”不知道”(第 7 讲)
社会偏见数据创造(社会本身的偏见);数据整理数据文档化与审计、反事实数据增强、偏见评测(第 2、18 讲)
有害内容数据创造数据过滤(注意误伤)、对齐(第 7 讲)
虚假信息部署(谁、为了什么用)使用政策、水印 / 检测、分阶段发布(第 18 讲)
安全(投毒)数据整理内容哈希校验、来源追踪(第 17 讲)
隐私数据整理(把个人信息收进来);训练(记忆)去重、差分隐私训练(第 16 讲)
法律数据整理(版权数据);部署数据许可、过滤、输出检测(第 19 讲)
成本、环境与访问训练更高效的训练与推理、开放模型、报告能耗(第 8–10、13、19 讲)

练习 11(动手) 把 fm_world.py 里 P_SHE 的所有值都改成 0.5,删掉 checkpoints/base_model.pt,重跑代码 03。演示 3 的”偏斜程度”会变成多少?贪心解码那一列呢?这说明了什么?(做完后记得改回来并删掉缓存。)

参考答案

我在一份代码副本里跑了这个实验(没有改动课程目录里的文件),结果:

语料模型概率(4 个应用平均)T = 1 采样T = 0.5 采样贪心
原设定(4 个职业偏斜)0.1730.1520.1170.2190.500
全部改成 0.50.0450.0260.0290.0440.500

语料的偏斜降到 0.045——剩下的是抽样噪声(每个职业只有约 240 行故事);模型概率的偏斜也降到 0.026。但贪心解码一列仍然是 0.500:8 个职业在应用 1 的句式里全部生成 she,因为模型给 she 的概率是 0.50–0.53,只要略高于 0.5,贪心就永远选它。这说明:去掉数据里的偏斜是必要的,但不够——确定性的解码方式本身就能把微小的、纯属噪声的差别变成”全有或全无”的输出。


11. 延伸阅读 · Further reading

原课阅读(按建议顺序)

背景与经典

  • Shannon, A Mathematical Theory of Communication(1948);Prediction and Entropy of Printed English(1951)。
  • Bengio et al., A Neural Probabilistic Language Model(2003)。
  • Jurafsky & Martin, Speech and Language Processing(第 3 版草稿)第 3 章 “N-gram Language Models”。
  • Devlin et al., BERT(2018);Radford et al., Improving Language Understanding by Generative Pre-Training(GPT,2018)。

本讲提到的其他工作

  • Narayan et al., Can Foundation Models Wrangle Your Data?(2022)——用提示做实体匹配、错误检测、数据填补。
  • Liang et al., Holistic Evaluation of Language Models(HELM,2022)——系统评测基础模型。
  • Weidinger et al., Ethical and Social Risks of Harm from Language Models(2021);Bender et al., On the Dangers of Stochastic Parrots(2021)——风险的系统梳理(第 2、18 讲还会读)。

12. 下一讲预告 · Next lecture

本讲反复出现一句话:“能力从数据里来,缺陷也从数据里来。“模型会给评论打分,是因为数据里有带评分的评论;模型对职业有偏斜,是因为数据里有偏斜;验证集的数字偏乐观,是因为验证集和训练集有重复。

第 2 讲:数据——基础模型从哪里学,数据怎样决定它会什么。 真实的预训练数据从哪里来(Common Crawl、C4、The Pile)?怎样过滤”低质量”文本,过滤器又会误伤谁?为什么要去重,重复的数据怎样伤害模型?测试集污染怎样检测?Ludwig Schmidt 的客座报告给出了一个更强的论点:CLIP 的分布鲁棒性几乎完全由训练数据决定,而不是架构或训练目标。代码会在迷你互联网上动手做去重、过滤和污染检测,并观察它们怎样改变 base model。

← 返回课程目录