R

BPE 分词 - 离散与连续的边界辨析

创建 2026-05-16 更新 2026-05-18 6 条双链 共创

BPE 分词 - 离散与连续的边界辨析

核心命题:BPE 词表为何是有限给定的?Rick 用”高维向量取值连续,对应词义应该无限”的直觉切进 LLM 架构中最容易混淆的边界——tokenizer 的离散符号空间和 embedding 的连续向量空间是两个不同层。词表大小的硬约束不来自输入,而来自输出端 softmax。

Rick 的关键追问

[!quote] Rick 的关键介入 在 BPE 方向上,为什么词表数量是给定的、有限的?我理解如果是向量化,高维向量中每个维度的取值都可以是连续的,所以对应的词义应该是无限的才对

这条追问的价值不在答案,而在它精确命中了一个常见误读:把”模型的语义表达能力”和”模型的输入 / 输出符号集合”混为一谈。绝大多数普及材料把 BPE 描述成”模型用到的词典”,但没说清楚词典只规约了离散符号的范围,不约束语义空间的精度。

离散层与连续层的分工

整个管线:

原始文本 →(BPE 分词)→ token ID 序列(离散整数)→(embedding 查表)→ 向量序列(连续高维)→ Transformer 计算

  • “高维向量取值连续,词义无限”的直觉描述的是 embedding 之后的事——这一空间确实连续,模型在其中的注意力 / 前馈计算也都是连续的。
  • 经过多层 Transformer 后,同一 token 的表征会根据上下文被推到完全不同的向量位置(bank 在 “river bank” vs “bank account” 里的表征差异巨大)。模型的语义表达能力不受词表大小限制。

BPE 词表解决的是另一个问题——输入端的离散化 + 输出端的概率分布

输入端:为什么必须离散化

embedding 层物理上是 [vocab_size, d_model] 的查找表。token ID 是整数索引。如果词表无限大,查找表也要无限大——存储上不可能。

为什么不直接喂连续表征?原始文本本身就是离散的(字符序列 / 字节序列),不像图像或音频那样存在天然连续信号。必须在某个粒度做离散到连续的跳板,跳板本身必须有限。

输出端:词表大小的硬约束

更硬的约束在输出端:

[!quote] Rick 的关键介入 这一步是必须的吗?或者说,我们只需要预测下一个最大概率的 token / 字节就可以了,实现这个目标一定需要穷尽计算所有候选吗?还是可以通过其他算法来实现?或者考虑放弃求全局最优,提前收敛?

这条追问把”全词表 softmax”的合理性问题摆到桌面。

模型生成时,最后一层向量通过 [d_model, vocab_size] 的 LM head 投影,得到每个 token 的分数,再做 softmax 归一化。每生成一个 token,必须对词表所有候选计算分数。vocab_size = 128K 时每步生成做一次 128K 维矩阵乘 + softmax。词表”无限”则 softmax 数学上不存在。

替代路径存在但都有代价:

  • 分层 softmax:树状词表,复杂度从 O(V) 降到 O(log V)。质量损失通常较小但不为零。
  • Negative sampling / NCE:Word2Vec 时代的近似——只对负样本子集计算损失。训练时可行,推理时不直接适用。
  • Adaptive softmax:按频率分组,高频组小、低频组大。
  • 最近邻近似 / LSH / PQ:在 embedding 空间里找 top-k 候选,避免计算所有内积。
  • Speculative decoding:小模型起草、大模型校验。校验仍需 full softmax。
  • Sparse 预测头:只对子集计算 logits。

工程现实是:现代大模型里 LM head 的计算占比已经很小,Transformer 层堆叠才是主导成本。在质量损失和算力收益之间,全 softmax 仍是默认选择。词表大小是 trade-off 的支点——越大序列越短但参数和每步 softmax 越贵;越小则相反。

中文的字节级路径:UTF-8 的物理惩罚

[!quote] Rick 的关键介入 继续讨论,字节级 对于中文来说可行吗?

物理事实:UTF-8 编码下,英文字母 1 字节、中文汉字 3 字节。

序列长度膨胀比对:

  • 英文:BPE token → 字节 大约展开 3-5 倍。
  • 中文:BPE token → 字节 大约展开 2.5-3 倍(因为 BPE 对中文压缩率本来就不高,每个常见汉字几乎就是一个独立 token)。

序列长度上中文字节级别的惩罚倍数其实和英文差不多——这与”中文 3 字节所以惩罚更重”的直觉相反。

但更深的问题在语义层:

  • “你” 的 UTF-8 编码是 0xE4 0xBD 0xA0。三个字节中任何一个单独拿出来毫无语义——0xE4 只是 UTF-8 编码协议的前缀标记。
  • 英文字节与字符近似一一对应(0x61 = “a”),模型在字节级别直接看到有意义的语言单元。
  • 中文则需要模型先学会 UTF-8 协议本身(识别 3 字节序列边界与组合方式),再学会”三个字节合起来是哪个字符”——等于在语言建模之前强加了一层编码协议学习任务。

英文的字节模型 ≈ 字符级模型。中文的字节模型则需要额外承担”反向解码 UTF-8”的负担。这是字节级路线在中文场景的真实代价。

提问方法论:用直觉冲突倒推架构边界

这场对话的可复用模式:

  • 用一个看起来不一致的直觉作为切入点(连续向量空间 vs 有限词表);
  • 不接受 AI 的标准教科书回答,追问到能定位”约束究竟来自哪个组件”;
  • 用追问形式逼出”必须 / 可以 / 是 trade-off”的层级——把模糊的”为什么必须如此”分解为可分别讨论的几种约束。

这是 Rick 对技术理解的标准要求:能给出”工程现状是 X,理论上还有 Y、Z 可选,目前选 X 是因为 trade-off 落在哪里”——而非单一答案。

关联节点