Skip to content

MIT深度学习课程第九讲:Causal Transformer、Decoding 与 BPE Tokenization

本节课从上一讲的 BERTmasking 出发,切换到另一种 self-supervised learning 方法:

text
next word prediction

这也是 GPT 类模型的核心训练思想。

本节主线包括:

  • 回顾 BERT 如何通过 masking 做 self-supervised learning。
  • 引入 next word prediction
  • 说明普通 bidirectional transformer encoder 为什么会在 next word prediction 中“偷看未来”。
  • 引入 causal self-attention / masked self-attention
  • 区分 encoderdecodercausal encoder 等术语。
  • 说明 GPT 式 autoregressive generation 如何逐 token 生成文本。
  • 解释 decoding:如何从 softmax 概率表中选择下一个 token。
  • 比较 greedy decoding、random sampling、top-ktop-p / nucleus sampling、temperature
  • 说明 LLM 为什么可能 hallucinate 或 off the rails。
  • 引入现代 tokenization,重点讲 Byte Pair Encoding / BPE

一、回顾 BERT 与 Masking

老师先回顾上一节课。

上一节讲了 BERT 的创建方式,以及一种 self-supervised learning 技术:

text
masking

在图像领域,可以用大量带标签图片训练 ResNet 之类模型。

但文本预训练面临一个问题:

text
如果没有明确的最终任务,如何给一段文本定义 label?

masking 的想法是:

  1. 从每个句子中随机选一些词。
  2. 把这些词替换成 mask token
  3. 训练网络恢复这些空白。

也就是让模型:

text
fill in the blanks

如果把 Wikipedia 这类大规模文本都这样处理,并训练网络填空,得到的模型会学到很多有用的语言表示。

BERT 就是这种思路下的著名模型之一。

二、从 Masking 到 Next Word Prediction

本节课转向另一种 self-supervised learning:

text
next word prediction

老师指出,它可以看作 masking 的一种特殊形式。

普通 masking 是随机选择一个词遮住。

next word prediction 则可以理解为:

text
总是遮住最后一个词,让模型预测下一个词。

它不一定必须使用完整句子,也可以使用 sentence fragments。

例如:

text
the mission of the MIT Sloan School ...

可以构造多个训练片段:

  • 输入 the,预测 mission
  • 输入 the mission,预测 of
  • 输入 the mission of,预测 the
  • 依此类推。

也就是:

text
first few words -> next word

三、用 Transformer Encoder 做 Next Word Prediction 的初始想法

老师接着尝试用上一节的 transformer encoder 来解决 next word prediction。

示例句子是:

text
the cat sat on the mat

如果拆成多条训练样本,可以写成:

  • 输入 the,输出 cat
  • 输入 the cat,输出 sat
  • 输入 the cat sat on,输出 the
  • 输入 the cat sat on the,输出 mat

为了更紧凑地表达这些训练对,可以使用 shifted sequence。

也就是:

text
input  = the cat sat on the
output = cat sat on the mat

输入是原句去掉最后一个词。

输出是原句去掉第一个词。

这样:

  • the 用来预测 cat
  • the cat 用来预测 sat
  • the cat sat on the 用来预测 mat

四、模型结构:每个位置接 Vocabulary Softmax

初始模型结构与上一讲类似:

  1. 输入 token sequence。
  2. 生成 positional input embeddings。
  3. 送入 transformer stack。
  4. 得到 contextual embeddings。
  5. 经过一个或多个 ReLU
  6. 每个位置接一个 softmax。

这里的 softmax 输出范围是整个 vocabulary。

本节先暂时假设 vocabulary 是 word vocabulary,而不是更细粒度的 tokens。

老师假设 vocabulary 规模大约是:

text
50,000 words

因此每个输出位置都是:

text
50,000-way softmax

这和上一讲 BERT 中每个位置预测 vocabulary token 的形式相似。

五、生成时只关心最后一个预测

虽然每个位置都会输出一个 50,000-way softmax,但在实际 next word generation 中,通常只关心最后一个位置。

原因是:

text
最后一个位置的预测才基于当前输入中所有已给出的词。

例如输入:

text
it was a dark and

模型内部可能会为每个位置都产生预测,但真正要拿来生成下一个词的是最后一个位置的 softmax。

前面位置的预测会由模型结构自然产生,但生成时会被忽略。

六、课堂问答:如何预测句子结束

有学生问:

text
模型如何预测一个句子的结束?

老师回答,此时“句子”的概念已经弱化。

这类模型的 tokenization 会把 punctuation 也纳入考虑,例如:

  • period
  • exclamation mark
  • 其他标点

因此,句子结束可以通过模型生成 punctuation 或特定结束 token 来体现。

这个问题会在后面讲 tokenization 时进一步解释。

七、普通 Transformer Encoder 的问题:偷看未来

如果直接使用上一讲的 transformer encoder 来做 next word prediction,会出现一个关键问题:

text
模型可以看到未来的词。

这是因为普通 self-attention 是 bidirectional 的。

在 self-attention 中,每个词的 contextual embedding 会根据句子中所有词的 embeddings 做 weighted average。

也就是说:

  • 最后一个词可以看见前面的词。
  • 第一个词也可以看见后面的词。
  • 任意词都可以关注任意其他词。

这对 BERT 的 masked prediction 很有用,但对 next word prediction 会造成 cheating。

八、为什么会 Cheating

例如要预测:

text
the cat -> sat

模型本应只看到:

text
the cat

然后预测:

text
sat

但如果 self-attention 可以看到完整 sequence,它在计算 thecat 的 contextual embedding 时可能已经看见了 sat

这样模型可以直接从未来词中复制答案,任务就不再具有挑战性。

老师把这个问题概括为:

text
peeking into the future

九、课堂问答:Loss Function 是什么

有学生问,这里的 loss function 是什么。

老师回答,仍然使用:

text
cross-entropy

这和前面分类任务一致。

如果一个输出位置要在 50,000 个词中分类,那么该位置有一个 cross-entropy loss。

整条 sequence 有多个输出位置,因此 overall loss 是这些位置 loss 的:

  • sum
  • 或更精确地说,average

老师回顾,cross-entropy 可以看作:

text
-log(probability of the right answer)

课堂中他提到,对多个输出位置分别计算 cross-entropy,然后取平均,例如写成类似:

text
1 / 7

这样的平均形式。

十、课堂问答:Vocabulary 很大是否让 Loss 复杂

有学生问,vocabulary 很大,比如 50,000 个输出类别,loss 是否会变复杂。

老师回答,计算上会更重,但概念上没有区别。

原来可能是把输入分类到 10 个类别。

现在是:

text
每个词位置都要分类到 50,000 个词之一。

如果句子有多个词,就相当于有多个 classification problems。

最终 loss 是这些位置的平均 loss。

十一、解决方法:Causal Self-Attention

为了防止模型偷看未来,需要修改 attention。

核心做法是:

text
future words receive zero attention weight

在计算某个词的 contextual embedding 时,只允许它关注自己和之前的词。

对于未来词,attention weight 直接设为 0

设为 0 后,再对剩余非零权重重新归一化,使每一行权重仍然加起来等于 1

这种做法称为:

text
causal self-attention

也称:

text
masked self-attention

十二、Causal Attention 的例子

对于:

text
the cat sat on the mat

如果要预测 on,模型只能看:

text
the cat sat

后面的词不会参与当前预测。

对应到 attention matrix,就是把未来位置的格子全部置零。

例如:

  • 预测 cat 时,只能用 the
  • 预测 sat 时,只能用 the cat
  • 预测 on 时,只能用 the cat sat

老师说明,真实实现中为了计算效率,会用很优雅的底层方式处理 mask,但课堂不展开实现细节。

关键思想是:

text
把普通 attention head 替换成 causal / masked attention head。

这样模型就不能作弊了。

十三、Causal 不是 Causality

老师特别提醒:

text
causal

这个词在这里与统计或因果推断中的 causality 没有关系。

它只是 transformer 语境中的一个术语,表示模型只能看过去,不能看未来。

十四、Encoder、Decoder 与 Causal Encoder

原始 Attention Is All You Need 论文是为 machine translation 设计的,例如 English to German。

原始结构是:

text
encoder-decoder architecture

上一讲熟悉的是:

text
encoder

原论文中还有:

text
decoder

decoder 中使用了 masked attention。

因此,在不同语境中:

text
decoder

可能有两个含义:

  1. 指原始 machine translation 中 encoder-decoder 架构的第二部分。
  2. 指使用 masked / causal attention 的 causal encoder。

本课程不讲 machine translation,因此这里说的:

text
decoder
causal encoder

基本可以理解为同一类东西。

十五、课堂问答:Bidirectional 与 Causal 的区别

有学生问,某些 transformer 使用 bidirectional attention,这和当前讲的 causal 是否不同。

老师回答:

text
bidirectional means I can see everything.

上一讲用于 BERT 的普通 self-attention 就是 bidirectional。

它可以向前看,也可以向后看。

causal 则不能看未来词。

十六、BERT 与 GPT 的架构分工

老师总结:

  • 左边是上一讲用于 BERT 的 transformer encoder,用于 masked prediction。
  • 右边是本节用于 next word prediction 的 causal encoder / decoder。

如果把 ordinary multi-head attention 换成:

text
causal multi-head attention

就得到:

text
decoder

或:

text
causal encoder

训练流程仍然类似:

  1. 构造 input / output shifted sequences。
  2. 通过一组 causal encoder stacks。
  3. 接 dense / ReLU / softmax。
  4. 使用 cross-entropy 训练。

重要差异全部集中在 attention layer:

text
attention must be masked / causal

十七、课堂问答:Masking 是否只在训练时使用

有学生问,causal mask 是否只在训练时使用,validation / testing / inference 时是否不需要。

老师回答,不需要在 inference 时“取消 mask”。

原因是模型实际使用时的目标就是:

text
给定当前字符串,预测下一个词。

预测下一个词时,只需要使用它之前的所有内容。

因此 causal structure 与 inference 目标一致。

最后一个位置的预测会使用之前所有词,这正是需要的行为。

十八、课堂问答:BERT 和 GPT 权重是否不同

有学生问,如果一个模型按普通 bidirectional 方式训练,另一个模型按 future weights 置零的 causal 方式训练,两者权重是否不同。

老师回答:

text
The weights are going to be very different.

这是两个不同模型。

  • BERT 可以看见所有词,适合某些理解类任务。
  • GPT 类模型不能看未来,适合生成类任务。

十九、Autoregressive Generation 的基本循环

训练好 causal language model 后,可以用它生成文本。

输入:

text
it was a dark and

模型输出最后一个位置的 softmax。

假设 vocabulary 从 aardvarkzebra,softmax 会给每个 token 一个概率,所有概率加起来为 1

例如:

text
stormy

可能是最高概率词。

最简单的做法是选出最高概率词,把它接到输入后面:

text
it was a dark and stormy

然后再次输入模型。

下一步可能选出:

text
night

于是得到:

text
it was a dark and stormy night

然后继续重复。

这就是 autoregressive generation 的核心:

text
predict -> append -> predict -> append -> ...

可以指定生成最多 100 个 tokens,也可以让模型在生成 period、exclamation mark 或其他停止信号时结束。

二十、课堂问答:输入越长预测越好吗

有学生问,初始输入越长,预测是否越好。

老师回答,这取决于任务目标。

更准确的说法是:

text
输入中包含的信息越有帮助,预测通常越好。

如果任务需要更多上下文,那么更长、更相关的 prompt 会提供更多线索。

二十一、课堂问答:Google Search / Autocomplete 是否使用这种模型

有学生问,这是否也适用于 Google Search 或 autocomplete。

老师回答,他不知道 Google autocomplete 是否实际使用这种模型。

这些系统的内部实现通常不会公开。

他猜测,Google 搜索中出现的 generative AI panel 可能使用类似模型,但 default autocomplete 是否使用则不清楚,因为这类模型计算成本很高。

二十二、课堂问答:Vocabulary 是否固定

有学生问 vocabulary list 是否是 static。

老师回答:

text
for a given model, yes

但它实际上不是 word vocabulary,而是:

text
token vocabulary

之后的 BPE 会解释,即使 vocabulary 固定,模型也能处理新词。

二十三、Sequence Generation 与 Autoregressive Language Model

到这里,三类任务可以对应起来:

  • BERT / BERT-like models 可以做 classification。
  • BERT / BERT-like models 可以做 labeling。
  • causal encoder / decoder 可以做 sequence generation。

使用 next word prediction 在 text sequences 上训练的 sequence generation model 称为:

text
autoregressive language model

也称:

text
causal language model

GPT family 是最著名的 autoregressive language model。

autoregressive 的含义是:

text
用过去的输出作为下一次预测的输入。

也就是:

text
predict -> feed prediction back -> predict again

二十四、课堂问答:ChatGPT 打字式输出是否就是这个过程

有学生问,在 GPT 中看到模型一个词一个词输出,是否就是刚刚描述的 recalculation。

老师回答:

text
Correct.

如果使用 API,会看到类似:

text
streaming API

它会把每次生成的 token stream 出来。

在 Web interface 中,看起来像人在打字。

老师补充,他听说有些系统可能故意放慢输出速度,让用户感觉像有人在另一端输入。

这属于 UX 层面的处理,不改变底层逐 token 生成机制。

二十五、LLM 中的 L

老师解释:

text
LLM = Large Language Model

其中 large 只是因为模型使用了大量数据和大量参数。

当 language model 规模足够大,就称为:

text
large language model

没有更神秘的含义。

二十六、GPT-3 的结构与训练数据

老师提到,GPT-3 是 autoregressive language model。

其公开论文中给出了架构细节:

  • 96 transformer blocks。
  • 每个 block 有 96 个 causal attention heads。

老师指出,GPT-4 之后架构没有公开,外界只能猜测。

GPT-3 的训练数据包括从多种来源抓取的大量文本。

老师提到大约:

text
30 billion sentences

来源包括:

  • WebText
  • Wikipedia
  • book databases
  • 其他文本来源

训练方式就是:

text
next word prediction

二十七、Text In, Text Out 的灵活性

老师强调,生成文本的能力非常强大,因为很多任务都可以表示成:

text
text in, text out

因此模型不仅可以生成普通文本,还可以:

  • generate code
  • generate documentation for code
  • summarize text
  • answer questions
  • build chatbots

ChatGPT 之后围绕 GenAI 的大量兴奋,正来自这种简单但灵活的接口。

老师还推荐了 Andrej Karpathy 的 “build GPT from scratch” 视频,以及一个用 NumPy 从较底层构建 GPT 的博客,帮助理解这些模型的实际构建方式。

二十八、Decoding:从概率表中选择 Token

每次生成时,模型最后一个位置会输出一个 softmax 概率表。

例如有 50,000 个候选 tokens。

问题是:

text
应该从这个概率分布中选择哪个 token?

这个过程称为:

text
decoding

也就是从 softmax probability distribution 中选择下一个 token。

老师指出,要让 GenAI 系统表现良好,decoding / sampling strategy 非常重要。

二十九、Greedy Decoding

最简单的方法是:

text
greedy decoding

即总是选择概率最高的 token。

例如:

text
stormy = 0.6

如果它是最高概率,就选择 stormy

适用场景:

  • factual accuracy 很重要。
  • 希望输出 deterministic。
  • 同一问题应得到同一答案。
  • reasoning、math、logic 等任务。

例如 customer support agent 中,如果两个客户问同一问题,不希望得到不同答案。

greedy decoding 的优点是:

text
deterministic

因为同一输入产生同一个 softmax 表,而每次都取最高概率项,结果不会变。

三十、Random Sampling

另一种简单方法是:

text
random sampling

也就是按 softmax 概率比例随机抽取 token。

如果 stormy 的概率是 0.6,随机采样 100 次,大约会有 60 次采到 stormy

但也可能采到低概率词,例如:

  • aardvark
  • zebra

适用场景:

  • creative writing
  • poem
  • haiku
  • screenplay
  • 需要多样性的回答

random sampling 的优点是生成更丰富、更有变化。

代价是:

text
outputs become stochastic

同一个问题可能每次输出都不同。

三十一、课堂问答:Sampling 是否改变概率表或 Loss

有学生问,random sampling 是否会让概率估计更好,或者影响最终概率表和 loss function。

老师回答:

text
The table doesn't change.

softmax 概率表是 decoding 的起点。

decoding 只是决定从表中取哪个 token。

它不会改变训练时的 loss,也不会改变概率表本身。

三十二、课堂问答:ChatGPT 同一 Prompt 输出不同的原因

有学生问,ChatGPT 同一个 prompt 反复运行会得到不同答案,是否因为使用 random sampling。

老师回答:

text
Correct.

这正是采样策略带来的随机性。

三十三、课堂问答:生成错误后能否恢复

有学生问,逐词预测时如果生成了错误词,例如:

text
the night was dark and aardvark

后续是否会被带偏,模型能否自己恢复。

老师回答:

text
It cannot.

错误 token 进入后续输入后,可能会持续影响后续生成。

因此每一步生成都很关键。

老师后面会用例子展示模型如何 off the rails。

三十四、课堂问答:Bing 的 Creative / Balanced / Precise

有学生问,Bing 中的 creative、balanced、precise 是否就是在调这些 decoding 参数。

老师回答,是的。

这些选项底层是在调整后面要讲的一些 parameters。

如果直接使用 API,用户可以自己控制这些参数。

三十五、Head 与 Tail

老师接着解释 random sampling 的风险。

理想情况下,对于一个 input phrase,好的下一个词应该集中在 probability distribution 的头部:

text
head of the distribution

而大量无关或低质量词位于:

text
long tail

目标是:

text
从 head 中采样,而不是从 tail 中采样。

如果模型足够好,它会把大部分概率集中在少数高质量候选词上,并把其他词概率压到很低。

三十六、Tail 的风险

即使 tail 中每个单独词的概率都很小,tail 整体的概率仍可能不小。

老师用例子说明:

  • stormy = 0.6
  • night = 0.3
  • 剩余 tail 总和约 0.1

单个 tail word 很小,但从 tail 中采到某个词的整体概率是 10%

一旦模型采到一个不好的 tail token,后续生成可能无法恢复,文本就会 off the rails。

三十七、课堂问答:Head 与 Tail 是否有技术定义

有学生问,head 和 tail 是否有技术上的精确定义。

老师回答:

text
No.

这是一个常用直觉,不是固定数学边界。

因为不同问题、不同模型、不同输入,对“合理候选词数量”的需求都不一样。

有些情况可能需要 20 个候选词,有些可能需要 40 个,有些可能只需要 10 个。

三十八、GPT-3.5 示例:低概率词如何带偏输出

老师用 GPT-3.5 做了示例。

输入:

text
students at the MIT Sloan School of Management are

模型预测的 top words 包括:

  • invited
  • given
  • expected
  • required
  • able

最高概率也只有大约 3%,第二梯队约 2%,但仍然高于大量其他词。

老师先接上高概率词:

text
invited

后续生成看起来合理,例如邀请提交 white papers 等。

然后老师故意选择低概率 tail words:

  • masters,概率约 0.05%
  • spending,概率约 0.11%

强行使用 masters 后,模型生成了类似:

text
students ... are masters of chaos ...

强行使用 spending 后,模型生成了类似:

text
students ... are spending the semester learning life skills through knitting socks

这说明一个低概率 token 就可能把后续文本带到很奇怪的方向。

三十九、课堂问答:这些奇怪句子是否来自训练集

有学生问,这些句子是否真的来自训练集。

老师回答,不一定。

LLM 更像是在训练数据中做粗略、近似的 pattern matching。

它不意味着 MIT 官网真的有类似句子。

可能是很多大学网站、论坛、Reddit 等文本中存在类似模式,被模型组合成了当前输出。

老师强调:

text
LLM 给出的不是 correctness guarantee,而是 probabilistically plausible response。

也就是说,模型输出的是“概率上看起来不离谱”的内容,而不是保证正确的事实。

老师还举了自己名字的例子:让模型列出他获得的 awards,模型生成了许多并不存在的奖项。

四十、课堂问答:是否有 Sliding Window 更重视近处词

有学生问,模型是否类似 sliding window,会更重视较近的词。

老师回答,不按这种方式理解。

训练时给模型 sentence fragments,让它预测下一个词。

输入越长、信息越充分,通常越能缩小不确定性。

例如:

text
the capital of

只能知道后面可能是某个国家或州。

但:

text
the capital of France is

会显著缩小可能答案范围。

老师引用了一个表达:

text
subtractive sculpting

意思是,每个新词都会逐步削掉一部分不可能性,直到答案空间越来越清晰。

四十一、让 Random Sampling 更可控的三种方法

老师接下来介绍三种调节 random sampling 的方法:

  1. top-k sampling
  2. top-p sampling / nucleus sampling
  3. temperature

共同目标是:

text
强调 distribution 的 head,削弱或排除 tail。

四十二、Top-k Sampling

top-k sampling 的做法是:

text
只从概率最高的 k 个 tokens 中采样。

例如:

text
k = 2

如果前两个词概率是:

text
0.6, 0.2

则忽略其他词,并把这两个概率重新归一化:

text
0.75, 0.25

然后从这个新的分布中采样。

k 可以是:

  • 10
  • 20
  • 30
  • 40
  • 50

具体值依赖任务。

缺点是:

text
假设每个输入都需要同样数量的候选词。

但现实中,有些输入可能只需要少量候选词,有些需要更多。

四十三、Top-p / Nucleus Sampling

top-p sampling 也叫:

text
nucleus sampling

它不固定候选词数量,而是固定累计概率阈值。

做法是:

  1. 将 tokens 按概率从高到低排序。
  2. 依次加入候选集合。
  3. 直到累计概率至少达到 p
  4. 对候选集合重新归一化。
  5. 从候选集合采样。

例如:

text
p = 0.9

如果前几个概率是:

text
0.6 + 0.2 + 0.1 = 0.9

则选择这三个词,重新归一化后采样。

老师认为这种方式通常更有效,因为它不会硬编码候选词数量,而是随分布变化。

四十四、课堂问答:Top-p 如何处理刚刚超过阈值

有学生问,如果某个词让累计概率刚刚超过 0.9,是否只取该词的一部分概率。

老师回答,不会取一部分。

算法会不断加入完整的词,直到累计概率刚刚超过阈值。

四十五、课堂问答:能否设单词概率阈值

有学生问,是否可以设置一个最低概率阈值,只考虑概率超过某个值的词。

老师回答,可以这样做,但没有完美答案。

问题在于阈值也很任意。

可能某个合理词概率是 0.89,但阈值设为 0.9,它就被排除了。

这正是人们发展 top-ktop-p 等 heuristic 的原因。

实践中也可以组合:

text
top-p + top-k

例如一直加入词,直到达到累计概率阈值或达到 k 个词, whichever is earlier。

四十六、Temperature

第三种方法是:

text
temperature

它比 top-ktop-p 更“软”。

top-ktop-p 会直接划线,排除一部分词。

temperature 则通过改变 softmax 的形状,让 head 更突出或让分布更平坦。

四十七、Softmax 与 Temperature 公式

普通 softmax 形式是:

text
P_i = exp(a_i) / sum_j exp(a_j)

其中 a_i 是输出层中第 i 个 token 对应的原始分数。

temperature 在 softmax 中加入参数 T

text
P_i = exp(a_i / T) / sum_j exp(a_j / T)

T 就是 temperature。

四十八、Temperature 接近 0

如果:

text
T -> 0

那么最大的 a_i 会被极大放大。

它对应 token 的概率会接近:

text
1

其他 token 的概率接近:

text
0

因此,当 T = 0 或非常接近 0 时,sampling 几乎等同于:

text
greedy decoding

也就是总是选择概率最大的 token。

四十九、Temperature 变大

如果 T 变大,分布会变得更平坦。

T 超过 1,例如接近:

text
1.5
2

不同 tokens 的概率会更接近。

结果是随机性更强,甚至可能接近真正随机,输出容易变成 garbage。

五十、OpenAI Playground 示例

老师演示了:

text
platform.openai.com

也就是 OpenAI Playground。

在 Playground 中可以:

  • 输入 prompt。
  • 选择 model。
  • 调整 temperature
  • 调整 top_p
  • 查看 token probabilities。
  • 控制输出 token 数,例如设为 30

老师提到,OpenAI Playground 支持 top_p,但没有 top_k

默认 temperature 是:

text
1

设为:

text
0

就接近 greedy decoding。

五十一、Playground 中的 MIT Sloan 示例

老师再次输入:

text
students at the MIT Sloan School of Management are

使用 GPT-3.5 时,最高概率词仍是:

text
invited

概率约:

text
3.18%

把 temperature 设为 0 后,模型会稳定选择:

text
invited

这说明 temperature 可以控制 decoding 的确定性。

老师指出,开发者会使用这些概率显示来 debugging,观察模型在具体 use case 中的概率分布,再据此调参数。

五十二、Temperature = 2 的 Garbage 示例

老师把 temperature 调到最大,例如:

text
2

这意味着几乎任何 token 都可能被选中。

模型随后生成了明显的乱码式输出。

老师借此强调:

text
只改一个参数,就可能让一个看似智能的 LLM 产生垃圾输出。

因此在 production use cases 中,必须非常谨慎地设置这些 decoding parameters。

五十三、切换到 Tokenization

讲完 decoding 后,老师转到:

text
tokenization

此前课程使用过 STIE 流程:

  1. standardize
  2. tokenize
  3. index
  4. encode

传统 standardization 可能包括:

  • strip punctuation
  • lowercase
  • remove stop words,例如 a
  • stemming

但 GPT 类模型并没有简单去掉这些信息。

五十四、现代模型为什么不能简单 STIE

GPT 输出中可以看到:

  • punctuation 保留得很好。
  • uppercase / lowercase 被区分。
  • 可以处理用户新造的词。

老师举了一个自造词例子:

text
reldoh

这是:

text
hodler

反过来写。

老师给出的定义是:

text
a student who understands deep learning backwards

然后要求模型用这个词造句。

模型生成了一个合理句子,大意是 Jane 在 advanced neural network seminar 中是一个真正的 reldoh,能够反向解释复杂 deep learning concepts。

这说明模型不仅在查表,也能组合和使用新词。

问题变成:

text
模型如何处理 vocabulary 中没有的新词?

答案是:

text
Byte Pair Encoding

简称:

text
BPE

五十五、现代 Tokenization 的目标

现代模型需要 tokenization 方案能够:

  • preserve punctuation
  • preserve case
  • handle new words

因此现代模型通常不直接使用简单 STIE

老师提到:

  • GPT family 使用 Byte Pair Encoding / BPE
  • BERT 使用 WordPiece

这些方法的共同思想是构建一个由多种粒度组成的 vocabulary。

五十六、Characters、Words 与 Subwords

一个极端做法是只使用 individual characters。

如果 vocabulary 中有所有字符,那么任何新词都能被拼出来。

例如:

text
reldoh = r e l d o h

但只用 characters 不理想,因为模型需要从零学习每个词的含义。

另一个极端是把所有 words 都放进 vocabulary。

这也不理想,因为 infrequent words 会占用 embedding vector,但很少出现,不值得加入。

更好的方案是同时使用:

  • individual characters
  • frequent full words
  • frequent subwords / word fragments

例如:

text
ize

会出现在:

  • standardize
  • normalize
  • 其他类似词

因此可以把 ize 作为 subword token,而不是为每个完整词单独保留 token。

characters 还包括:

  • uppercase letters
  • lowercase letters
  • numbers
  • punctuation

这些都可以作为 atomic units。

五十七、BPE 的基本算法

BPE 的基本做法是:

  1. 从每个 character 作为 token 开始。
  2. 在训练 corpus 中统计相邻 token pair 的频率。
  3. 找到最频繁相邻 pair。
  4. 把它们 merge 成一个新 token。
  5. 把新 token 加入 vocabulary。
  6. 更新 corpus。
  7. 重复直到 vocabulary 达到预设大小。

老师指出,BPE 最初来自数据压缩思想。

如果某些字符总是一起出现,那么把它们作为一个 token 可以压缩表示。

五十八、BPE 示例:the cat sat on the mat

老师用一个极小训练 corpus 演示:

text
the cat sat on the mat

真实 GPT 不会 lowercasing,但为了课堂简化,老师在示例中做了标准化。

他还用特殊格式表示 word boundaries,例如用 underscore 表示 space。

初始 vocabulary 是训练 corpus 中出现的所有 individual letters。

然后统计 adjacent token pairs。

例如:

  • t h 出现 2 次。
  • h e 出现 2 次。
  • c a 出现 1 次。
  • a t 出现 3 次,因为出现在 catsatmat 中。

最频繁的是:

text
a t

因此合并为:

text
at

并把 at 加入 vocabulary。

corpus 中对应位置也更新为 at 这个 token。

五十九、继续 Merge

更新 corpus 后,再重新统计 adjacent token pairs。

如果多个 pair 频率相同,可以随机选择一个。

示例中接下来可能合并:

text
t h -> th

再下一步可能合并:

text
th e -> the

如此反复,直到达到预设 vocabulary size。

GPT-2 和 GPT-3 的 vocabulary size 大约是:

text
50,000

GPT-4 的 vocabulary size 大约是:

text
100,000

六十、Tokenizing 新文本时应用 Merge 顺序

BPE 训练完成后,会保留一串 merge rules。

当新文本进入时,tokenizer 会按训练时学到的 merge 顺序应用这些规则。

例如新文本:

text
the rat

会先应用:

text
a t -> at

再应用:

text
t h -> th
th e -> the

最终 token 可能包括:

  • the
  • space token
  • r
  • at

这说明即使 rat 不是完整 vocabulary word,也可以由 rat 等 token 组合出来。

六十一、Tokenizer 演示:hands-on deep learning

老师展示了一个 tokenizer 网站,并输入:

text
hands-on deep learning

结果中可以看到:

  • uppercase H 可以是自己的 token。
  • - 可以是自己的 token。
  • on 可以是一个 token。
  • deep 可以是一个 token。
  • learning 可以是一个 token。

注意,带前导空格的词和不带前导空格的词可能是不同 tokens。

例如:

text
deep

和:

text
 deep

可能对应不同 token。

原因是大多数词在文本中经常出现在 space 之后,把 space 与词一起编码可以节省计算和表示成本。

六十二、Tokenizer 保留 Case 与 Punctuation

老师继续演示:

  • Deepdeep 是不同 token。
  • ! 会作为 token。
  • uppercase The、lowercase the、带空格的 the 也可能对应不同 tokens。

他提到:

  • uppercase The with a space 对应 token 383
  • lowercase the 对应 token 262
  • 不带 space 的 the 又是不同 token。

这说明现代 tokenizer 确实保留:

  • case
  • punctuation
  • whitespace patterns

六十三、名字的 Tokenization

老师还尝试了名字:

text
Jane

Jane 可以是一个 token。

他再尝试:

text
Rama

发现自己的名字大写形式没有被 tokenizer 当作单独 token。

但 lowercase:

text
rama

却是一个 token。

Jane 出现在不同上下文中,例如前面带空格时,tokenization 也可能变化,可能拆成带 space 的 jane 等形式。

老师最后鼓励学生去 tokenizer 工具中查看自己的名字会如何被分词。

六十四、本节结束

本节课在 BPE tokenization 演示后结束。

老师提醒,tokenization 的行为很有趣,背后机制就是本节讲的基本思想。

六十五、本节核心脉络

本节课可以压缩为以下主线:

  1. BERT 使用 masking 做 self-supervised learning。
  2. next word prediction 可以看作总是预测最后空白的特殊 masking。
  3. 直接用 bidirectional transformer encoder 会偷看未来词,导致 next word prediction 作弊。
  4. causal self-attention 通过把未来词 attention weight 设为 0 来阻止偷看未来。
  5. causal encoder / decoder 是 GPT 类生成模型的核心。
  6. GPT 类模型是 autoregressive language model,通过 predict -> append -> predict 生成文本。
  7. decoding 是从 softmax 概率分布中选择下一个 token。
  8. greedy decoding 适合需要确定性和事实准确性的任务。
  9. random sampling 适合创意任务,但可能采到 tail token 并导致输出跑偏。
  10. top-ktop-ptemperature 都是控制 sampling 的方法。
  11. temperature 接近 0 时接近 greedy,较大时分布更平坦、更随机。
  12. GPT 类模型使用现代 tokenizer,而不是简单 STIE。
  13. BPE 通过从 characters 开始反复合并高频相邻 tokens,构建包含 characters、words、subwords 的 vocabulary。
  14. BPE 让模型能保留标点、大小写,并处理新词。

六十六、关键术语表

next word prediction

给定前文 token sequence,预测下一个 token 的 self-supervised learning 任务。

causal self-attention

只允许当前位置关注自己和过去 tokens,不允许关注未来 tokens 的 attention。

masked self-attention

在本节语境中与 causal self-attention 基本同义,通过 mask 屏蔽未来位置。

decoder

在本节中通常指使用 masked / causal attention 的 causal encoder;在 machine translation 中也可指 encoder-decoder 架构的第二部分。

autoregressive language model

把上一步生成结果接回输入,继续预测下一步的 language model。

causal language model

使用 causal attention 训练 next word prediction 的语言模型。

decoding

从 softmax probability distribution 中选择下一个 token 的过程。

greedy decoding

每次选择概率最高的 token。

random sampling

按 softmax 概率分布随机抽取 token。

top-k sampling

只从概率最高的 k 个 tokens 中重新归一化并采样。

top-p sampling

也称 nucleus sampling,从累计概率达到 p 的最小候选集合中采样。

temperature

softmax 中用于控制分布尖锐或平坦程度的参数。

STIE

传统文本向量化流程:standardize、tokenize、index、encode。

Byte Pair Encoding

简称 BPE,从字符开始反复合并高频相邻 token pair 的 tokenization 方法。

subword

词的一部分,常用于组合 infrequent words 或 new words。

token vocabulary

模型固定的一组 tokens,可能包括 characters、words、subwords、punctuation 和带空格的词片段。

最后更新于: