MIT深度学习课程第九讲:Causal Transformer、Decoding 与 BPE Tokenization
本节课从上一讲的 BERT 和 masking 出发,切换到另一种 self-supervised learning 方法:
next word prediction这也是 GPT 类模型的核心训练思想。
本节主线包括:
- 回顾
BERT如何通过masking做 self-supervised learning。 - 引入
next word prediction。 - 说明普通 bidirectional transformer encoder 为什么会在 next word prediction 中“偷看未来”。
- 引入
causal self-attention/masked self-attention。 - 区分
encoder、decoder、causal encoder等术语。 - 说明 GPT 式 autoregressive generation 如何逐 token 生成文本。
- 解释
decoding:如何从 softmax 概率表中选择下一个 token。 - 比较
greedy decoding、random sampling、top-k、top-p/ nucleus sampling、temperature。 - 说明 LLM 为什么可能 hallucinate 或 off the rails。
- 引入现代 tokenization,重点讲
Byte Pair Encoding/BPE。
一、回顾 BERT 与 Masking
老师先回顾上一节课。
上一节讲了 BERT 的创建方式,以及一种 self-supervised learning 技术:
masking在图像领域,可以用大量带标签图片训练 ResNet 之类模型。
但文本预训练面临一个问题:
如果没有明确的最终任务,如何给一段文本定义 label?masking 的想法是:
- 从每个句子中随机选一些词。
- 把这些词替换成
mask token。 - 训练网络恢复这些空白。
也就是让模型:
fill in the blanks如果把 Wikipedia 这类大规模文本都这样处理,并训练网络填空,得到的模型会学到很多有用的语言表示。
BERT 就是这种思路下的著名模型之一。
二、从 Masking 到 Next Word Prediction
本节课转向另一种 self-supervised learning:
next word prediction老师指出,它可以看作 masking 的一种特殊形式。
普通 masking 是随机选择一个词遮住。
next word prediction 则可以理解为:
总是遮住最后一个词,让模型预测下一个词。它不一定必须使用完整句子,也可以使用 sentence fragments。
例如:
the mission of the MIT Sloan School ...可以构造多个训练片段:
- 输入
the,预测mission。 - 输入
the mission,预测of。 - 输入
the mission of,预测the。 - 依此类推。
也就是:
first few words -> next word三、用 Transformer Encoder 做 Next Word Prediction 的初始想法
老师接着尝试用上一节的 transformer encoder 来解决 next word prediction。
示例句子是:
the cat sat on the mat如果拆成多条训练样本,可以写成:
- 输入
the,输出cat。 - 输入
the cat,输出sat。 - 输入
the cat sat on,输出the。 - 输入
the cat sat on the,输出mat。
为了更紧凑地表达这些训练对,可以使用 shifted sequence。
也就是:
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
初始模型结构与上一讲类似:
- 输入 token sequence。
- 生成 positional input embeddings。
- 送入 transformer stack。
- 得到 contextual embeddings。
- 经过一个或多个
ReLU。 - 每个位置接一个 softmax。
这里的 softmax 输出范围是整个 vocabulary。
本节先暂时假设 vocabulary 是 word vocabulary,而不是更细粒度的 tokens。
老师假设 vocabulary 规模大约是:
50,000 words因此每个输出位置都是:
50,000-way softmax这和上一讲 BERT 中每个位置预测 vocabulary token 的形式相似。
五、生成时只关心最后一个预测
虽然每个位置都会输出一个 50,000-way softmax,但在实际 next word generation 中,通常只关心最后一个位置。
原因是:
最后一个位置的预测才基于当前输入中所有已给出的词。例如输入:
it was a dark and模型内部可能会为每个位置都产生预测,但真正要拿来生成下一个词的是最后一个位置的 softmax。
前面位置的预测会由模型结构自然产生,但生成时会被忽略。
六、课堂问答:如何预测句子结束
有学生问:
模型如何预测一个句子的结束?老师回答,此时“句子”的概念已经弱化。
这类模型的 tokenization 会把 punctuation 也纳入考虑,例如:
- period
- exclamation mark
- 其他标点
因此,句子结束可以通过模型生成 punctuation 或特定结束 token 来体现。
这个问题会在后面讲 tokenization 时进一步解释。
七、普通 Transformer Encoder 的问题:偷看未来
如果直接使用上一讲的 transformer encoder 来做 next word prediction,会出现一个关键问题:
模型可以看到未来的词。这是因为普通 self-attention 是 bidirectional 的。
在 self-attention 中,每个词的 contextual embedding 会根据句子中所有词的 embeddings 做 weighted average。
也就是说:
- 最后一个词可以看见前面的词。
- 第一个词也可以看见后面的词。
- 任意词都可以关注任意其他词。
这对 BERT 的 masked prediction 很有用,但对 next word prediction 会造成 cheating。
八、为什么会 Cheating
例如要预测:
the cat -> sat模型本应只看到:
the cat然后预测:
sat但如果 self-attention 可以看到完整 sequence,它在计算 the 或 cat 的 contextual embedding 时可能已经看见了 sat。
这样模型可以直接从未来词中复制答案,任务就不再具有挑战性。
老师把这个问题概括为:
peeking into the future九、课堂问答:Loss Function 是什么
有学生问,这里的 loss function 是什么。
老师回答,仍然使用:
cross-entropy这和前面分类任务一致。
如果一个输出位置要在 50,000 个词中分类,那么该位置有一个 cross-entropy loss。
整条 sequence 有多个输出位置,因此 overall loss 是这些位置 loss 的:
- sum
- 或更精确地说,average
老师回顾,cross-entropy 可以看作:
-log(probability of the right answer)课堂中他提到,对多个输出位置分别计算 cross-entropy,然后取平均,例如写成类似:
1 / 7这样的平均形式。
十、课堂问答:Vocabulary 很大是否让 Loss 复杂
有学生问,vocabulary 很大,比如 50,000 个输出类别,loss 是否会变复杂。
老师回答,计算上会更重,但概念上没有区别。
原来可能是把输入分类到 10 个类别。
现在是:
每个词位置都要分类到 50,000 个词之一。如果句子有多个词,就相当于有多个 classification problems。
最终 loss 是这些位置的平均 loss。
十一、解决方法:Causal Self-Attention
为了防止模型偷看未来,需要修改 attention。
核心做法是:
future words receive zero attention weight在计算某个词的 contextual embedding 时,只允许它关注自己和之前的词。
对于未来词,attention weight 直接设为 0。
设为 0 后,再对剩余非零权重重新归一化,使每一行权重仍然加起来等于 1。
这种做法称为:
causal self-attention也称:
masked self-attention十二、Causal Attention 的例子
对于:
the cat sat on the mat如果要预测 on,模型只能看:
the cat sat后面的词不会参与当前预测。
对应到 attention matrix,就是把未来位置的格子全部置零。
例如:
- 预测
cat时,只能用the。 - 预测
sat时,只能用the cat。 - 预测
on时,只能用the cat sat。
老师说明,真实实现中为了计算效率,会用很优雅的底层方式处理 mask,但课堂不展开实现细节。
关键思想是:
把普通 attention head 替换成 causal / masked attention head。这样模型就不能作弊了。
十三、Causal 不是 Causality
老师特别提醒:
causal这个词在这里与统计或因果推断中的 causality 没有关系。
它只是 transformer 语境中的一个术语,表示模型只能看过去,不能看未来。
十四、Encoder、Decoder 与 Causal Encoder
原始 Attention Is All You Need 论文是为 machine translation 设计的,例如 English to German。
原始结构是:
encoder-decoder architecture上一讲熟悉的是:
encoder原论文中还有:
decoderdecoder 中使用了 masked attention。
因此,在不同语境中:
decoder可能有两个含义:
- 指原始 machine translation 中 encoder-decoder 架构的第二部分。
- 指使用 masked / causal attention 的 causal encoder。
本课程不讲 machine translation,因此这里说的:
decoder
causal encoder基本可以理解为同一类东西。
十五、课堂问答:Bidirectional 与 Causal 的区别
有学生问,某些 transformer 使用 bidirectional attention,这和当前讲的 causal 是否不同。
老师回答:
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 换成:
causal multi-head attention就得到:
decoder或:
causal encoder训练流程仍然类似:
- 构造 input / output shifted sequences。
- 通过一组 causal encoder stacks。
- 接 dense /
ReLU/ softmax。 - 使用 cross-entropy 训练。
重要差异全部集中在 attention layer:
attention must be masked / causal十七、课堂问答:Masking 是否只在训练时使用
有学生问,causal mask 是否只在训练时使用,validation / testing / inference 时是否不需要。
老师回答,不需要在 inference 时“取消 mask”。
原因是模型实际使用时的目标就是:
给定当前字符串,预测下一个词。预测下一个词时,只需要使用它之前的所有内容。
因此 causal structure 与 inference 目标一致。
最后一个位置的预测会使用之前所有词,这正是需要的行为。
十八、课堂问答:BERT 和 GPT 权重是否不同
有学生问,如果一个模型按普通 bidirectional 方式训练,另一个模型按 future weights 置零的 causal 方式训练,两者权重是否不同。
老师回答:
The weights are going to be very different.这是两个不同模型。
BERT可以看见所有词,适合某些理解类任务。- GPT 类模型不能看未来,适合生成类任务。
十九、Autoregressive Generation 的基本循环
训练好 causal language model 后,可以用它生成文本。
输入:
it was a dark and模型输出最后一个位置的 softmax。
假设 vocabulary 从 aardvark 到 zebra,softmax 会给每个 token 一个概率,所有概率加起来为 1。
例如:
stormy可能是最高概率词。
最简单的做法是选出最高概率词,把它接到输入后面:
it was a dark and stormy然后再次输入模型。
下一步可能选出:
night于是得到:
it was a dark and stormy night然后继续重复。
这就是 autoregressive generation 的核心:
predict -> append -> predict -> append -> ...可以指定生成最多 100 个 tokens,也可以让模型在生成 period、exclamation mark 或其他停止信号时结束。
二十、课堂问答:输入越长预测越好吗
有学生问,初始输入越长,预测是否越好。
老师回答,这取决于任务目标。
更准确的说法是:
输入中包含的信息越有帮助,预测通常越好。如果任务需要更多上下文,那么更长、更相关的 prompt 会提供更多线索。
二十一、课堂问答:Google Search / Autocomplete 是否使用这种模型
有学生问,这是否也适用于 Google Search 或 autocomplete。
老师回答,他不知道 Google autocomplete 是否实际使用这种模型。
这些系统的内部实现通常不会公开。
他猜测,Google 搜索中出现的 generative AI panel 可能使用类似模型,但 default autocomplete 是否使用则不清楚,因为这类模型计算成本很高。
二十二、课堂问答:Vocabulary 是否固定
有学生问 vocabulary list 是否是 static。
老师回答:
for a given model, yes但它实际上不是 word vocabulary,而是:
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 称为:
autoregressive language model也称:
causal language modelGPT family 是最著名的 autoregressive language model。
autoregressive 的含义是:
用过去的输出作为下一次预测的输入。也就是:
predict -> feed prediction back -> predict again二十四、课堂问答:ChatGPT 打字式输出是否就是这个过程
有学生问,在 GPT 中看到模型一个词一个词输出,是否就是刚刚描述的 recalculation。
老师回答:
Correct.如果使用 API,会看到类似:
streaming API它会把每次生成的 token stream 出来。
在 Web interface 中,看起来像人在打字。
老师补充,他听说有些系统可能故意放慢输出速度,让用户感觉像有人在另一端输入。
这属于 UX 层面的处理,不改变底层逐 token 生成机制。
二十五、LLM 中的 L
老师解释:
LLM = Large Language Model其中 large 只是因为模型使用了大量数据和大量参数。
当 language model 规模足够大,就称为:
large language model没有更神秘的含义。
二十六、GPT-3 的结构与训练数据
老师提到,GPT-3 是 autoregressive language model。
其公开论文中给出了架构细节:
96transformer blocks。- 每个 block 有
96个 causal attention heads。
老师指出,GPT-4 之后架构没有公开,外界只能猜测。
GPT-3 的训练数据包括从多种来源抓取的大量文本。
老师提到大约:
30 billion sentences来源包括:
- WebText
- Wikipedia
- book databases
- 其他文本来源
训练方式就是:
next word prediction二十七、Text In, Text Out 的灵活性
老师强调,生成文本的能力非常强大,因为很多任务都可以表示成:
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。
问题是:
应该从这个概率分布中选择哪个 token?这个过程称为:
decoding也就是从 softmax probability distribution 中选择下一个 token。
老师指出,要让 GenAI 系统表现良好,decoding / sampling strategy 非常重要。
二十九、Greedy Decoding
最简单的方法是:
greedy decoding即总是选择概率最高的 token。
例如:
stormy = 0.6如果它是最高概率,就选择 stormy。
适用场景:
- factual accuracy 很重要。
- 希望输出 deterministic。
- 同一问题应得到同一答案。
- reasoning、math、logic 等任务。
例如 customer support agent 中,如果两个客户问同一问题,不希望得到不同答案。
greedy decoding 的优点是:
deterministic因为同一输入产生同一个 softmax 表,而每次都取最高概率项,结果不会变。
三十、Random Sampling
另一种简单方法是:
random sampling也就是按 softmax 概率比例随机抽取 token。
如果 stormy 的概率是 0.6,随机采样 100 次,大约会有 60 次采到 stormy。
但也可能采到低概率词,例如:
aardvarkzebra
适用场景:
- creative writing
- poem
- haiku
- screenplay
- 需要多样性的回答
random sampling 的优点是生成更丰富、更有变化。
代价是:
outputs become stochastic同一个问题可能每次输出都不同。
三十一、课堂问答:Sampling 是否改变概率表或 Loss
有学生问,random sampling 是否会让概率估计更好,或者影响最终概率表和 loss function。
老师回答:
The table doesn't change.softmax 概率表是 decoding 的起点。
decoding 只是决定从表中取哪个 token。
它不会改变训练时的 loss,也不会改变概率表本身。
三十二、课堂问答:ChatGPT 同一 Prompt 输出不同的原因
有学生问,ChatGPT 同一个 prompt 反复运行会得到不同答案,是否因为使用 random sampling。
老师回答:
Correct.这正是采样策略带来的随机性。
三十三、课堂问答:生成错误后能否恢复
有学生问,逐词预测时如果生成了错误词,例如:
the night was dark and aardvark后续是否会被带偏,模型能否自己恢复。
老师回答:
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 的头部:
head of the distribution而大量无关或低质量词位于:
long tail目标是:
从 head 中采样,而不是从 tail 中采样。如果模型足够好,它会把大部分概率集中在少数高质量候选词上,并把其他词概率压到很低。
三十六、Tail 的风险
即使 tail 中每个单独词的概率都很小,tail 整体的概率仍可能不小。
老师用例子说明:
stormy = 0.6night = 0.3- 剩余 tail 总和约
0.1
单个 tail word 很小,但从 tail 中采到某个词的整体概率是 10%。
一旦模型采到一个不好的 tail token,后续生成可能无法恢复,文本就会 off the rails。
三十七、课堂问答:Head 与 Tail 是否有技术定义
有学生问,head 和 tail 是否有技术上的精确定义。
老师回答:
No.这是一个常用直觉,不是固定数学边界。
因为不同问题、不同模型、不同输入,对“合理候选词数量”的需求都不一样。
有些情况可能需要 20 个候选词,有些可能需要 40 个,有些可能只需要 10 个。
三十八、GPT-3.5 示例:低概率词如何带偏输出
老师用 GPT-3.5 做了示例。
输入:
students at the MIT Sloan School of Management are模型预测的 top words 包括:
invitedgivenexpectedrequiredable
最高概率也只有大约 3%,第二梯队约 2%,但仍然高于大量其他词。
老师先接上高概率词:
invited后续生成看起来合理,例如邀请提交 white papers 等。
然后老师故意选择低概率 tail words:
masters,概率约0.05%spending,概率约0.11%
强行使用 masters 后,模型生成了类似:
students ... are masters of chaos ...强行使用 spending 后,模型生成了类似:
students ... are spending the semester learning life skills through knitting socks这说明一个低概率 token 就可能把后续文本带到很奇怪的方向。
三十九、课堂问答:这些奇怪句子是否来自训练集
有学生问,这些句子是否真的来自训练集。
老师回答,不一定。
LLM 更像是在训练数据中做粗略、近似的 pattern matching。
它不意味着 MIT 官网真的有类似句子。
可能是很多大学网站、论坛、Reddit 等文本中存在类似模式,被模型组合成了当前输出。
老师强调:
LLM 给出的不是 correctness guarantee,而是 probabilistically plausible response。也就是说,模型输出的是“概率上看起来不离谱”的内容,而不是保证正确的事实。
老师还举了自己名字的例子:让模型列出他获得的 awards,模型生成了许多并不存在的奖项。
四十、课堂问答:是否有 Sliding Window 更重视近处词
有学生问,模型是否类似 sliding window,会更重视较近的词。
老师回答,不按这种方式理解。
训练时给模型 sentence fragments,让它预测下一个词。
输入越长、信息越充分,通常越能缩小不确定性。
例如:
the capital of只能知道后面可能是某个国家或州。
但:
the capital of France is会显著缩小可能答案范围。
老师引用了一个表达:
subtractive sculpting意思是,每个新词都会逐步削掉一部分不可能性,直到答案空间越来越清晰。
四十一、让 Random Sampling 更可控的三种方法
老师接下来介绍三种调节 random sampling 的方法:
top-k samplingtop-p sampling/nucleus samplingtemperature
共同目标是:
强调 distribution 的 head,削弱或排除 tail。四十二、Top-k Sampling
top-k sampling 的做法是:
只从概率最高的 k 个 tokens 中采样。例如:
k = 2如果前两个词概率是:
0.6, 0.2则忽略其他词,并把这两个概率重新归一化:
0.75, 0.25然后从这个新的分布中采样。
k 可以是:
1020304050
具体值依赖任务。
缺点是:
假设每个输入都需要同样数量的候选词。但现实中,有些输入可能只需要少量候选词,有些需要更多。
四十三、Top-p / Nucleus Sampling
top-p sampling 也叫:
nucleus sampling它不固定候选词数量,而是固定累计概率阈值。
做法是:
- 将 tokens 按概率从高到低排序。
- 依次加入候选集合。
- 直到累计概率至少达到
p。 - 对候选集合重新归一化。
- 从候选集合采样。
例如:
p = 0.9如果前几个概率是:
0.6 + 0.2 + 0.1 = 0.9则选择这三个词,重新归一化后采样。
老师认为这种方式通常更有效,因为它不会硬编码候选词数量,而是随分布变化。
四十四、课堂问答:Top-p 如何处理刚刚超过阈值
有学生问,如果某个词让累计概率刚刚超过 0.9,是否只取该词的一部分概率。
老师回答,不会取一部分。
算法会不断加入完整的词,直到累计概率刚刚超过阈值。
四十五、课堂问答:能否设单词概率阈值
有学生问,是否可以设置一个最低概率阈值,只考虑概率超过某个值的词。
老师回答,可以这样做,但没有完美答案。
问题在于阈值也很任意。
可能某个合理词概率是 0.89,但阈值设为 0.9,它就被排除了。
这正是人们发展 top-k、top-p 等 heuristic 的原因。
实践中也可以组合:
top-p + top-k例如一直加入词,直到达到累计概率阈值或达到 k 个词, whichever is earlier。
四十六、Temperature
第三种方法是:
temperature它比 top-k 和 top-p 更“软”。
top-k 和 top-p 会直接划线,排除一部分词。
temperature 则通过改变 softmax 的形状,让 head 更突出或让分布更平坦。
四十七、Softmax 与 Temperature 公式
普通 softmax 形式是:
P_i = exp(a_i) / sum_j exp(a_j)其中 a_i 是输出层中第 i 个 token 对应的原始分数。
temperature 在 softmax 中加入参数 T:
P_i = exp(a_i / T) / sum_j exp(a_j / T)T 就是 temperature。
四十八、Temperature 接近 0
如果:
T -> 0那么最大的 a_i 会被极大放大。
它对应 token 的概率会接近:
1其他 token 的概率接近:
0因此,当 T = 0 或非常接近 0 时,sampling 几乎等同于:
greedy decoding也就是总是选择概率最大的 token。
四十九、Temperature 变大
如果 T 变大,分布会变得更平坦。
当 T 超过 1,例如接近:
1.5
2不同 tokens 的概率会更接近。
结果是随机性更强,甚至可能接近真正随机,输出容易变成 garbage。
五十、OpenAI Playground 示例
老师演示了:
platform.openai.com也就是 OpenAI Playground。
在 Playground 中可以:
- 输入 prompt。
- 选择 model。
- 调整
temperature。 - 调整
top_p。 - 查看 token probabilities。
- 控制输出 token 数,例如设为
30。
老师提到,OpenAI Playground 支持 top_p,但没有 top_k。
默认 temperature 是:
1设为:
0就接近 greedy decoding。
五十一、Playground 中的 MIT Sloan 示例
老师再次输入:
students at the MIT Sloan School of Management are使用 GPT-3.5 时,最高概率词仍是:
invited概率约:
3.18%把 temperature 设为 0 后,模型会稳定选择:
invited这说明 temperature 可以控制 decoding 的确定性。
老师指出,开发者会使用这些概率显示来 debugging,观察模型在具体 use case 中的概率分布,再据此调参数。
五十二、Temperature = 2 的 Garbage 示例
老师把 temperature 调到最大,例如:
2这意味着几乎任何 token 都可能被选中。
模型随后生成了明显的乱码式输出。
老师借此强调:
只改一个参数,就可能让一个看似智能的 LLM 产生垃圾输出。因此在 production use cases 中,必须非常谨慎地设置这些 decoding parameters。
五十三、切换到 Tokenization
讲完 decoding 后,老师转到:
tokenization此前课程使用过 STIE 流程:
standardizetokenizeindexencode
传统 standardization 可能包括:
- strip punctuation
- lowercase
- remove stop words,例如
a - stemming
但 GPT 类模型并没有简单去掉这些信息。
五十四、现代模型为什么不能简单 STIE
GPT 输出中可以看到:
- punctuation 保留得很好。
- uppercase / lowercase 被区分。
- 可以处理用户新造的词。
老师举了一个自造词例子:
reldoh这是:
hodler反过来写。
老师给出的定义是:
a student who understands deep learning backwards然后要求模型用这个词造句。
模型生成了一个合理句子,大意是 Jane 在 advanced neural network seminar 中是一个真正的 reldoh,能够反向解释复杂 deep learning concepts。
这说明模型不仅在查表,也能组合和使用新词。
问题变成:
模型如何处理 vocabulary 中没有的新词?答案是:
Byte Pair Encoding简称:
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 中有所有字符,那么任何新词都能被拼出来。
例如:
reldoh = r e l d o h但只用 characters 不理想,因为模型需要从零学习每个词的含义。
另一个极端是把所有 words 都放进 vocabulary。
这也不理想,因为 infrequent words 会占用 embedding vector,但很少出现,不值得加入。
更好的方案是同时使用:
- individual characters
- frequent full words
- frequent subwords / word fragments
例如:
ize会出现在:
- standardize
- normalize
- 其他类似词
因此可以把 ize 作为 subword token,而不是为每个完整词单独保留 token。
characters 还包括:
- uppercase letters
- lowercase letters
- numbers
- punctuation
这些都可以作为 atomic units。
五十七、BPE 的基本算法
BPE 的基本做法是:
- 从每个 character 作为 token 开始。
- 在训练 corpus 中统计相邻 token pair 的频率。
- 找到最频繁相邻 pair。
- 把它们 merge 成一个新 token。
- 把新 token 加入 vocabulary。
- 更新 corpus。
- 重复直到 vocabulary 达到预设大小。
老师指出,BPE 最初来自数据压缩思想。
如果某些字符总是一起出现,那么把它们作为一个 token 可以压缩表示。
五十八、BPE 示例:the cat sat on the mat
老师用一个极小训练 corpus 演示:
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次,因为出现在cat、sat、mat中。
最频繁的是:
a t因此合并为:
at并把 at 加入 vocabulary。
corpus 中对应位置也更新为 at 这个 token。
五十九、继续 Merge
更新 corpus 后,再重新统计 adjacent token pairs。
如果多个 pair 频率相同,可以随机选择一个。
示例中接下来可能合并:
t h -> th再下一步可能合并:
th e -> the如此反复,直到达到预设 vocabulary size。
GPT-2 和 GPT-3 的 vocabulary size 大约是:
50,000GPT-4 的 vocabulary size 大约是:
100,000六十、Tokenizing 新文本时应用 Merge 顺序
BPE 训练完成后,会保留一串 merge rules。
当新文本进入时,tokenizer 会按训练时学到的 merge 顺序应用这些规则。
例如新文本:
the rat会先应用:
a t -> at再应用:
t h -> th
th e -> the最终 token 可能包括:
the- space token
rat
这说明即使 rat 不是完整 vocabulary word,也可以由 r 与 at 等 token 组合出来。
六十一、Tokenizer 演示:hands-on deep learning
老师展示了一个 tokenizer 网站,并输入:
hands-on deep learning结果中可以看到:
- uppercase
H可以是自己的 token。 -可以是自己的 token。on可以是一个 token。deep可以是一个 token。learning可以是一个 token。
注意,带前导空格的词和不带前导空格的词可能是不同 tokens。
例如:
deep和:
deep可能对应不同 token。
原因是大多数词在文本中经常出现在 space 之后,把 space 与词一起编码可以节省计算和表示成本。
六十二、Tokenizer 保留 Case 与 Punctuation
老师继续演示:
Deep和deep是不同 token。!会作为 token。- uppercase
The、lowercasethe、带空格的the也可能对应不同 tokens。
他提到:
- uppercase
Thewith a space 对应 token383。 - lowercase
the对应 token262。 - 不带 space 的
the又是不同 token。
这说明现代 tokenizer 确实保留:
- case
- punctuation
- whitespace patterns
六十三、名字的 Tokenization
老师还尝试了名字:
JaneJane 可以是一个 token。
他再尝试:
Rama发现自己的名字大写形式没有被 tokenizer 当作单独 token。
但 lowercase:
rama却是一个 token。
当 Jane 出现在不同上下文中,例如前面带空格时,tokenization 也可能变化,可能拆成带 space 的 j 和 ane 等形式。
老师最后鼓励学生去 tokenizer 工具中查看自己的名字会如何被分词。
六十四、本节结束
本节课在 BPE tokenization 演示后结束。
老师提醒,tokenization 的行为很有趣,背后机制就是本节讲的基本思想。
六十五、本节核心脉络
本节课可以压缩为以下主线:
BERT使用masking做 self-supervised learning。next word prediction可以看作总是预测最后空白的特殊 masking。- 直接用 bidirectional transformer encoder 会偷看未来词,导致 next word prediction 作弊。
causal self-attention通过把未来词 attention weight 设为0来阻止偷看未来。- causal encoder / decoder 是 GPT 类生成模型的核心。
- GPT 类模型是
autoregressive language model,通过predict -> append -> predict生成文本。 decoding是从 softmax 概率分布中选择下一个 token。greedy decoding适合需要确定性和事实准确性的任务。- random sampling 适合创意任务,但可能采到 tail token 并导致输出跑偏。
top-k、top-p和temperature都是控制 sampling 的方法。temperature接近0时接近 greedy,较大时分布更平坦、更随机。- GPT 类模型使用现代 tokenizer,而不是简单 STIE。
BPE通过从 characters 开始反复合并高频相邻 tokens,构建包含 characters、words、subwords 的 vocabulary。- 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 和带空格的词片段。