从二元统计理解下一个 token 预测
语言模型输出下一个符号听起来抽象。先用相邻字符的频率做一个极小模型,可以直观看到“给定上下文,得到候选分布”的过程。
▶ 本文含视频讲解▶ 教学视频手动播放 · 英语讲解
Let's build GPT: from scratch, in code
结合模型讲解理解本文实验的背景;正文提供可独立运行的简化示例。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。
播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。
问题从哪里出现
语言模型输出下一个符号听起来抽象。先用相邻字符的频率做一个极小模型,可以直观看到“给定上下文,得到候选分布”的过程。
理解核心机制
二元模型只观察前一个字符,把后继字符的出现次数归一化为概率。它保留很少的上下文,因此适合解释条件概率,却无法承担现代语言模型的能力。
动手做一个小实验
Python 3.11 或更新版本,仅使用标准库;将示例保存为 demo.py 后执行 python3 demo.py。数字与样本均为教学演示,不代表真实模型或服务器的测量结果。
from collections import defaultdict, Counter
text = "banana bandana"
counts = defaultdict(Counter)
for previous, current in zip(text, text[1:]):
counts[previous][current] += 1
row = counts["a"]
total = sum(row.values())
probabilities = {char: count / total for char, count in row.items()}
assert abs(sum(probabilities.values()) - 1) < 1e-12
print(probabilities)适用边界与常见误区
未见过的前缀没有分布,需要平滑或回退。训练文本很小时,频率只是样本现象,不能被解读为语言规律;这里的字符也不等于实际模型 token。
继续练习
加入另一段文本,比较同一前缀的分布变化,再尝试使用前两个字符,观察稀疏程度如何增加。