用基础数学理解 nanoGPT 的语言建模

把语言建模问题写成条件概率:估计 $P(x_{t+1}\mid x_{\le t})$。 这篇文章更偏“看源码时能对得上号”的解释:以 nanoGPT(GPT-2 风格 Transformer)为参照(推荐对照这份带注释的实现:https://github.com/buvidk1234/nanoGPT ),只用必要的基础数学,把它为什么能做下一个 token 预测、训练时到底在优化什么,讲清楚。 约定一个更贴近实现的术语:模型直接处理的不是“单词”,而是 token id(通常由 BPE 等子词分词得到的整数序列)。训练后我们有时会观察到 token embedding 的几何相似性,但它不是先验语义规则,而是被目标函数与数据共同塑形的结果。 从最底层开始:如何在数值空间里表示 token,并让这种表示能够被后续计算反复使用? 如何让计算机表示 token? 可以借助一种数学工具——向量。 两个向量的夹角余弦可以衡量它们的相似度: $$\cos(\theta) = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{a}\| \|\mathbf{b}\|}$$$\cos(\theta)$ 越接近 1,两个向量越相似;越接近 -1,越相反。 因此,我们可以用向量来表示 token;余弦相似度常被用作“观察/分析”这种表示的一个指标(例如看哪些 token 的向量更接近)。但需要强调: 余弦相似度不是“语义”的定义,只是向量空间中的一个几何量。 向量会在训练目标(下一个 token 预测)驱动下被塑形,最终是否呈现出你直觉里的“近义/反义”取决于数据、模型容量与训练过程。 这种表示方式称为 Token Embedding:每个 token 对应一个 $d$ 维向量 $\mathbf{e} \in \mathbb{R}^d$。 如何让计算机表示序列? 同一个 token 在不同上下文里可能承担不同功能。仅靠 Token Embedding 得到的是“上下文无关”的初始表示,还需要一种方式把位置信息与上下文交互纳入计算。 为此引入位置向量(Positional Embedding):假设序列长度为 $m$,为每个位置分配一个 $d$ 维向量 $\mathbf{p}_j$。在 nanoGPT / GPT-2 的常见实现里,这个位置向量通常是一个可学习的查表(learned positional embedding)。将两者相加得到模型输入: ...

March 11, 2026