词表大小 $V$ 是 tokenizer 最核心的超参:它同时决定嵌入矩阵的行数、序列长度、logits 层的计算量,以及尾部 token 的训练充分性。前一篇讲过 BPE 的压缩率随 $V$ 边际递减(3010 那篇的压缩曲线),这里不再重复机制,专算账——把 32k 和 128k 两个选择的全部成本摆到桌面上,你会看到"最优 $V$"不是一个常数,而是随模型规模漂移的。
第一笔账:嵌入参数 $2Vd$
输入嵌入和输出 lm_head 各占 $V\times d$,合计 $2Vd$,这是 $V$ 最直接的成本。代具体数字:LLaMA-2 7B 用 $V=32000$、$d=4096$,嵌入相关参数约 $2\times32000\times4096\approx 2.6$ 亿,占 7B 总量的 3.7%。Llama 3 8B 用 $V=128256$,同样 $d=4096$,这笔账变成约 10.5 亿,占比升到 13%。Qwen2.5 7B 更激进,$V=152064$、$d=3584$,约 11 亿参数,占比接近 14%。
占比翻倍意味着什么?对 7B 这种规模,10 亿参数足够堆两层多的 Transformer 块,拿来买压缩率是否划算,取决于第二笔账。
第二笔账:logits 层的计算与显存
每个 token 的 lm_head 前向是 $d\times V$ 的矩阵乘,约 $2dV$ FLOPs。Llama 3 的配置下约 10.5 亿 FLOPs,对比模型主体每 token 的 $2N\approx 16$ GFLOPs,占比 6.5% 左右——推理时 logits 层是按 token 收费的固定税,$V$ 翻倍,这笔税翻倍,而省下的序列长度收益是次线性的。
训练时更疼的是 softmax 的显存。交叉熵要在 $V$ 维上算概率,一个 512k token 的 batch、$V=128256$、fp32 概率矩阵就是 $512000\times128256\times4$ 字节 $\approx$ 262 GB——超过任何单卡显存。这就是为什么训练框架必须有 chunked cross entropy(分块算 softmax 回传梯度)或 sampled softmax(只对采样子集归一化)。$V$ 越大,这个工程负担越重,而且它不随序列变短而下降——恰好和压缩率的收益方向相反。
第三笔账:序列长度与压缩率的兑换
收益侧:$V$ 越大,同一段文本的 token 数越少。英文网页文本上,32k 词表的压缩率约 4.2 字符/token,128k 词表约 4.7——提升约 12%。序列短 12%,注意力($O(n^2)$ 项)和推理时的 KV cache 都等比例省下来。注意这笔账只对长序列推理重要:预训练是一次性成本,序列短 12% 只省一次;推理服务按 token 计费,序列长度每 token 都在重复计费。
把三笔账合起来看方向:$V$ 翻倍,成本(嵌入参数、logits 税、训练 softmax 显存)全部线性甚至超线性上涨,收益(序列缩短)却在递减。纯数学上最优的 $V$ 应该让"边际成本 = 边际收益"。用上面的数字估一下:对 8B 模型,$V$ 从 64k 升到 128k,嵌入参数多约 5 亿、logits 税翻倍到 13% 左右,而序列只缩短不到 10%——对短输出场景(聊天、分类)是净亏,对长输出场景(RAG、长文生成)勉强打平。
规模如何移动最优点
近两年的事实趋势是 $V$ 一路走高:GPT-2 的 50k,LLaMA 的 32k,到 Llama 3 / Qwen2.5 / Gemma 2 的 128k–256k。驱动力有三条。
其一,模型变大后参数账相对变薄。13% 听着吓人,但 70B 模型上同一 $V$ 只占 1.5%——大模型买压缩率几乎只付 logits 税,参数成本被稀释了。反过来说,小模型用 128k 词表是把有限的参数预算花在了最不值的地方,2B 以下的模型用 32k–50k 是更合理的选择。
其二,多语言强制抬高 $V$。Qwen2.5 的 152k 里 CJK 条目占大头:中文一个字 UTF-8 占 3 字节,32k 英文向词表在中文上只能做到 1 字 2–3 token,152k 词表才能把中文压到 1 字 1 token 附近。多语言能力是用词表条目买来的,这笔账无法回避(3070 那篇会展开)。
其三,MoE 解耦了容量与计算。Dense 模型里 $2Vd$ 是真金白银的参数,MoE 里同样 $2Vd$ 但激活计算不随 $V$ 涨(lm_head 除外),词表成本只剩显存和 logits 税——DeepSeek-V3 敢用 100k+ 词表,架构红利是原因之一。
尾部 token 的隐性成本
还有一笔不容易进表格的账:词表尾部的低频 token 在训练里没见过足够样本,嵌入接近随机初始化,成为行为异常的 glitch token。$V$ 越大,尾部越长,这批 token 的占比越高。它们平时遇不到,一旦遇到(比如提示注入里刻意插入的冷门合并条目)行为完全不可控。128k 词表把尾部风险放大了一倍,这是大词表的隐性税,3080 之后讲安全时会再展开。
小结
$V$ 的账本是四项成本(嵌入参数、logits 税、训练 softmax 显存、尾部 token 风险)对一项收益(序列缩短)的交换,交换比率随模型规模、任务类型、语言构成三方漂移。选 $V$ 没有银弹,只有明确的问句:模型多大?输出多长?语种多杂?三个答案定了,账本自然算出该选哪一档。