R

问题:为什么词表数量必须是离散有限的?

创建 2026-03-24 更新 2026-03-24 3 条双链 共创

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

总结

  • 你记忆当中连续的高维向量是在 pipeline 的下一个步骤

  • 输入端限制:

    • 文本天然就是有限的,离散的。区别只在于有多离散。
    • token 和 字节 只是不同程度的离散 的区别
  • 输出端限制:

    • softmax 归一化步骤的必然要求
      • 模型生成文本时,最后一层输出一个向量,需要通过一个 [d_model, vocab_size] 的投影矩阵(LM head),得到词表中每一个 token 的概率分数,然后做 softmax 归一化,从中采样下一个 token。
      • 这意味着:每生成一个 token,模型必须对词表中的所有候选计算一遍分数。
        • vocab_size 是 128K 时,每一步生成都需要做一次 128K 维的矩阵乘法加 softmax。如果词表是 1M,这个计算量翻 8 倍。如果词表是”无限的”,softmax 在数学上就不存在了——你没法对无限个选项做概率归一化。

完整回答

A:这个问题问得很好,它触及了一个很多人混淆的架构边界:tokenizer 的离散符号空间和 embedding 的连续向量空间是两个完全不同的层,服务于不同的目的。

离散层和连续层的分工

整个管线是这样的:

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

你说的”高维向量每个维度取值连续,词义应该无限”——这个直觉完全正确,但它描述的是 embedding 之后的事情。embedding 空间确实是连续的,模型在这个空间里做的所有计算(注意力、前馈网络)也都是连续的。经过多层 Transformer 之后,同一个 token 的表征会根据上下文被推到向量空间中完全不同的位置——“bank” 在 “river bank” 和 “bank account” 里的最终表征差异巨大(但属于同一个 token)。所以模型的语义表达能力确实不受词表大小限制。

但 BPE 词表解决的不是语义表达问题,而是输入端的离散化问题和输出端的概率分布问题

那实际锁死词表大小的是什么?

是三个真正 binding 的约束。

第一,序列长度与注意力计算的对偶关系。 这才是核心 trade-off。词表越大,平均每个 token 覆盖的文本越长,序列越短,注意力计算的 O(N2)O(N^2) O(N2) 受益越大。词表越小,序列越长,注意力成本急剧膨胀。词表大小的工程最优点,本质上是在 embedding/LM head 的参数开销注意力计算的序列长度开销之间找的平衡。softmax 只是前者中的一个次要分项。

第二,训练数据的统计覆盖率。 词表中的每一个 token 都需要在训练语料中出现足够多次,才能学到一个有意义的 embedding。词表越大,低频 token 越多,这些 token 的 embedding 训练不充分,在向量空间中的位置是噪声。这就是 glitch token 问题的根源——词表里约 4.3% 的条目是”幽灵 token”,在实际推理中几乎不会被命中,但占着词表槽位。所以词表大小还有一个统计覆盖的天花板:不是你想加多少 token 就能加的,语料的分布决定了有效词表的上限。

第三,BPE 压缩的边际收益递减。 BPE 的合并过程是按频率从高到低贪心执行的。前几千次合并覆盖的是最高频的共现模式,压缩效率极高。但到了词表后半段,每次合并捕获的模式越来越稀有,压缩收益趋近于零。从 100K 扩到 200K 带来的平均序列长度缩减,远小于从 32K 扩到 100K。这意味着词表大小存在一个自然的收益饱和点。

示例

用具体数字走一遍。

假设你要处理一段 1000 个英文单词的文本。

场景 A:词表 32K(小词表)

BPE 合并次数少,很多词被拆成碎片。“internationalization” 可能被拆成 “inter” + “national” + “ization” 三个 token。整段文本编码后大约 1500 个 token。

Transformer 的注意力计算量与序列长度的平方成正比:15002=2,250,0001500^2 = 2,250,000 15002=2,250,000。

但 embedding 矩阵很小:[32K, d_model],LM head 也是 [d_model, 32K]。模型参数中这部分占比小。

场景 B:词表 256K(大词表)

BPE 合并了更多高频模式,“internationalization” 整个成为一个 token。同样的文本编码后大约 900 个 token。

注意力计算量:9002=810,000900^2 = 810,000 9002=810,000。 比场景 A 省了 64%。

但 embedding 矩阵变成 [256K, d_model],LM head 变成 [d_model, 256K]。这两个矩阵的参数量翻了 8 倍。对于 7B 的小模型,这可能意味着模型总参数量增加 10% 以上,显存占用和加载时间都上升。

场景 C:词表 256(字节级,极端小词表)

每个字节就是一个 token。同样的文本大约 5000 个字节。

注意力计算量:50002=25,000,0005000^2 = 25,000,000 50002=25,000,000。 是场景 A 的 11 倍。

但 embedding 矩阵只有 [256, d_model],几乎可以忽略不计。


所以”对偶关系”说的就是这件事:词表大小和序列长度是跷跷板的两端。你把词表做大,序列变短,注意力省了,但 embedding/LM head 的参数开销涨了。你把词表做小,embedding 几乎免费,但序列暴涨,注意力计算扛不住。

当前 32K-200K 的主流词表范围,就是这个跷跷板在现有硬件条件下的平衡点——两边的成本加起来总和最小的那个区间。