同样的文本内容,在一个模型中可能只需要100个token,在另一个模型中却可能膨胀到300个。这背后的差异源于一个经常被忽视但至关重要的设计决策:词表大小的选择。

当研究者讨论大语言模型的scaling law时,焦点通常集中在模型参数量和训练数据量这两个维度。然而,2024年NeurIPS上发表的一篇论文揭示了一个被严重低估的因素——词表大小对模型性能的影响远比想象中更大。论文预测,LLaMA-70B的最优词表大小应该至少是216K,而非其实际使用的32K。这意味着,当前大多数大模型的词表配置可能远非最优。

tokenization flow

词表:模型的"字典"如何影响一切

词表(Vocabulary)是语言模型能识别的所有token的集合。每个token可以是一个完整的单词、一个词根词缀,或者一个字符片段。当一段文本输入模型时,分词器(Tokenizer)会将其切分成一系列token,这些token的ID随后被转换为向量表示,成为模型处理的实际输入。

词表大小直接决定了三个核心指标:分词效率、模型参数量、以及上下文窗口的利用效率。

分词效率可以用压缩率(Compression Ratio)来量化。假设原始文本有$H$个字符,分词后有$D$个token,则压缩率为:

$$CR = \frac{D}{H}$$

压缩率越低,意味着同样的内容被编码成更少的token。实验数据表明,压缩率与词表大小的关系可以近似表示为:

$$f(V) = a \log^2(V) + b \log(V) + c$$

其中$a \approx 0.0064$,$b \approx -0.1581$,$c \approx 1.2047$。这个公式揭示了一个重要现象:压缩率随着词表增大而下降,但下降速度逐渐放缓——边际效益递减规律在词表设计中同样存在。

vocabulary architecture

graph LR
    A[输入文本] --> B[分词器]
    B --> C[Token序列]
    C --> D[Token ID]
    D --> E[Embedding矩阵]
    E --> F[向量表示]
    
    subgraph "词表大小影响"
        G[分词效率]
        H[参数量]
        I[上下文利用率]
    end
    
    B -.-> G
    E -.-> H
    C -.-> I

大词表 vs 小词表:一场复杂的权衡博弈

选择更大的词表还是更小的词表?这并非简单的"越大越好"或"越小越好",而是一场涉及多个维度的复杂权衡。

大词表的优势

更大的词表能带来更高的分词效率。以GPT-4为例,其词表大小约为100K,相比GPT-3的50K词表,同样的内容可以用更少的token表示。这意味着在相同的上下文窗口限制下,模型能够处理更多的实际文本内容。

多语言处理是大词表的另一大优势。对于使用CJK(中日韩)文字的语言,词表大小的影响尤为显著。以GPT-4的cl100k_base分词器为例:

  • 英文文本中,“cat"是1个token
  • 同样表示"猫"的汉字"猫”,在cl100k_base中需要3个token([163, 234, 104]

根据一项对200万翻译句对的分析,CJK语言的token数量相对英文的比例如下:

语言 Token比率
中文(普通话) 1.76x
日语 2.12x
韩语 2.36x

这意味着,如果英文需要100个token,中文平均需要176个,日语需要212个,韩语则需要236个。词表越大,能够直接收录的CJK字符越多,这种效率差距就越小。LLaMA 3将词表从32K扩展到128K,很大程度上就是为了改善多语言处理效率。

tradeoffs diagram

graph TD
    subgraph "大词表优势"
        A1[更高的分词效率]
        A2[更好的多语言支持]
        A3[更有效的上下文利用]
        A4[更少的OOV问题]
    end
    
    subgraph "大词表代价"
        B1[更大的Embedding矩阵]
        B2[更多的内存消耗]
        B3[每个token计算开销增加]
        B4[训练时间延长]
    end
    
    A1 --> C[权衡决策]
    A2 --> C
    A3 --> C
    A4 --> C
    B1 --> C
    B2 --> C
    B3 --> C
    B4 --> C

大词表的代价

更大的词表意味着更大的embedding矩阵。Embedding矩阵的大小为:

$$N_{embedding} = V \times d$$

其中$V$是词表大小,$d$是embedding维度。对于一个隐藏层维度为4096的模型:

  • 32K词表:$32,000 \times 4,096 = 131,072,000$参数
  • 128K词表:$128,000 \times 4,096 = 524,288,000$参数

词表增大4倍,仅embedding层就增加了近4亿参数。再加上输出层的语言模型头(LM Head),词表相关的参数量会翻倍。

对于小型模型而言,这个问题更加突出。Gemma 2B模型的embedding层占总参数的26%,而Gemma 7B模型中这一比例降至11%。模型越小,词表参数占比越高,盲目扩大词表会严重挤压模型的"有效容量"。

推理效率也受到影响。每次生成token时,模型需要计算整个词表上的概率分布。更大的词表意味着softmax计算涉及更大的维度,每个生成步骤的计算开销增加。

parameter distribution

pie title Gemma 2B模型参数分布
    "Embedding层 (26%)" : 26
    "Transformer层 (74%)" : 74
pie title Gemma 7B模型参数分布
    "Embedding层 (11%)" : 11
    "Transformer层 (89%)" : 89

词表大小的数学本质:信息论视角

从信息论角度,词表大小决定了模型输出分布的熵的上界:

$$H(P) \leq \log(V)$$

词表越大,理论上模型能够表达的信息量越大。但这并不意味着实际性能一定更好,因为更大的词表可能导致概率分布更加分散,增加模型学习的难度。

为了在不同词表大小之间公平比较模型性能,研究者提出了归一化损失函数:

$$\mathcal{L}_u = -\frac{1}{T} \sum_{i=1}^{T} \log \frac{p(w_i | w_{1:i-1}, V)}{p(w_i | V)}$$

其中$p(w_i | V)$表示token $w_i$在分词语料库中的频率。这个归一化损失消除了词表大小对原始损失函数的系统性影响,使得不同词表配置的模型可以在同一基准下比较。

最优词表大小:NeurIPS 2024的核心发现

2024年NeurIPS发表的论文《Scaling Laws with Vocabulary: Larger Models Deserve Larger Vocabularies》系统性地研究了词表大小与模型scaling的关系。研究者训练了参数量从33M到3B的多个模型,每个模型使用不同大小的词表(从4K到96K),训练数据量最高达500B字符。

scaling laws chart

三种预测方法

论文提出了三种预测最优词表大小的方法,它们得出了高度一致的结论。

IsoFLOPs分析:在固定的计算预算下,寻找使归一化损失最小的词表配置。实验结果显示,词表参数$N_v$与计算预算$C$呈幂律关系:

$$N_v = 0.20 \times C^{0.42}$$

而非词表参数$N_{nv}$的关系为:

$$N_{nv} = 0.08 \times C^{0.50}$$

这表明词表参数的增长速度慢于非词表参数,但两者都与计算预算正相关。

导数求极值法:对总计算量公式求导,找到最优词表大小。总计算量可以表示为:

$$C \approx 6 N D \approx 6(N_{nv} + Vd) \times H \times f(V)$$

其中$N = N_{nv} + Vd$是总参数量,$D = H \times f(V)$是总token数。令$\frac{\partial C}{\partial V} = 0$可以数值求解最优词表大小。

参数拟合:直接拟合归一化损失函数:

$$\mathcal{L}_u = -E + \frac{A_1}{N_{nv}^{\alpha_1}} + \frac{A_2}{N_v^{\alpha_2}} + \frac{B}{[Hf(V)]^\beta}$$

然后寻找使损失最小的词表配置。

flowchart TB
    subgraph "方法1: IsoFLOPs分析"
        M1A[固定计算预算]
        M1B[训练多组模型]
        M1C[寻找最小损失点]
    end
    
    subgraph "方法2: 导数求极值"
        M2A[建立计算量公式]
        M2B[对词表大小求导]
        M2C[数值求解最优值]
    end
    
    subgraph "方法3: 参数拟合"
        M3A[拟合损失函数]
        M3B[搜索最优配置]
        M3C[预测最优词表]
    end
    
    M1C --> R[一致的结论]
    M2C --> R
    M3C --> R

缩放公式的实际应用

三种方法导出了一个统一的缩放公式:

$$N_v^{opt} = N_v^0 \times \left(\frac{N_{nv}}{N_{nv}^0}\right)^\gamma$$

其中$\gamma \approx 0.83$是一个经验常数,$N_{nv}^0$和$N_v^0$是基准小模型的参数。

应用这个公式,论文对当前主流模型的最优词表大小进行了预测:

模型 实际词表 预测最优词表 差距
LLaMA-70B 32K 216K+ 7x
LLaMA-7B 32K 65K 2x
Mistral-7B 32K 65K 2x

惊人的发现是:几乎所有主流开源模型的词表都偏小,只有Gemma-2-9B接近最优配置。

vocabulary comparison

gantt
    title 主流模型词表大小对比
    dateFormat X
    axisFormat %s
    
    section 实际词表
    LLaMA-70B (32K)     :0, 32
    LLaMA-7B (32K)      :0, 32
    Mistral-7B (32K)    :0, 32
    GPT-4 (100K)        :0, 100
    LLaMA-3 (128K)      :0, 128
    Gemma (256K)        :0, 256
    
    section 预测最优
    LLaMA-70B最优 (216K) :crit, 0, 216
    LLaMA-7B最优 (65K)   :crit, 0, 65
    Mistral-7B最优 (65K) :crit, 0, 65

数据量对最优词表的影响

论文还研究了训练数据量对最优词表的影响。在固定非词表参数的情况下:

  • 当训练数据受限时,最优词表大小会减小(防止过拟合)
  • 当训练数据充足时,最优词表大小会增加(更好利用数据)

这解释了一个现象:为什么早期的模型倾向于使用较小的词表?部分原因可能是训练数据相对有限,小词表有助于防止对罕见token的过拟合。

主流模型的词表演进

LLaMA系列的词表扩张

LLaMA系列模型的词表选择反映了对这一问题的认识演进:

  • LLaMA 1 & 2:使用32K词表,基于SentencePiece的BPE分词器。这个选择相对保守,优先考虑训练和推理效率。
  • LLaMA 3:将词表扩大到128K,采用TikToken分词器。这一变化的动机明确:改善多语言处理效率,特别是对CJK语言的支持。

词表增大带来的收益是实实在在的。在相同内容的情况下,LLaMA 3的128K词表相比LLaMA 2的32K词表,token数量显著减少。这意味着在相同的上下文窗口内,模型能够处理更多的实际文本内容。

LLaMA evolution

timeline
    title LLaMA系列词表演进
    section LLaMA 1 (2023.02)
        32K词表 : SentencePiece BPE
        : Byte-level fallback
    section LLaMA 2 (2023.07)
        32K词表 : 改进的CJK支持
        : 更好的多语言覆盖
    section LLaMA 3 (2024.04)
        128K词表 : TikToken分词器
        : 显著提升分词效率
        : 更好的代码处理

GPT系列的渐进式增长

OpenAI的GPT系列展示了词表大小的渐进式增长:

  • GPT-2/GPT-3:约50K词表,使用byte-level BPE
  • GPT-4:约100K词表,cl100k_base分词器

GPT-4的词表扩大带来了显著的效率提升。一个具体的例子:同样的文本片段,GPT-4只需要185个token,而GPT-2/GPT-3需要300个token。在上下文窗口有限的情况下,这相当于将有效上下文长度增加了60%以上。

GPT-4的词表设计还针对编程语言进行了优化。例如,代码中常见的缩进空格序列被合并为单个token,而GPT-2会将每个空格单独tokenize。

Gemma的激进选择

Google的Gemma模型选择了256K的超大词表,是目前主流模型中词表最大的之一。这个选择的代价是明显的:Gemma 2B模型的embedding层占总参数的26%,远高于其他模型。

但这种设计也有其合理性:Gemma强调多语言和文化理解能力,更大的词表使其能够更好地处理各种语言和文化特定内容,包括emoji和特殊符号。

词表设计的技术细节

BPE vs Unigram vs WordPiece

现代大模型主要使用三种子词分词算法,它们对词表大小的影响各有特点:

Byte-Pair Encoding (BPE):从字符级别开始,迭代地合并最常见的字符对。词表大小由迭代次数决定,每个新合并的token都会被添加到词表中。BPE产生的词表大小与训练语料的统计特性紧密相关。

Unigram Language Model:从一个大的候选词表开始,逐步删除低概率的token,直到达到目标词表大小。相比BPE,Unigram可以产生概率性的分词结果,支持分词正则化技术。

WordPiece:与BPE类似,但使用似然度而非频率来选择合并。BERT系列模型使用这种方法。

在相同的目标词表大小下,三种方法产生的实际分词效率差异不大,但BPE因其确定性和简单性而成为当前主流选择。

tokenizer algorithms

graph TB
    subgraph "BPE算法流程"
        BPE1[初始: 字符级词表] --> BPE2[统计字符对频率]
        BPE2 --> BPE3[合并最频繁对]
        BPE3 --> BPE4{达到目标大小?}
        BPE4 -->|否| BPE2
        BPE4 -->|是| BPE5[输出词表]
    end
    
    subgraph "Unigram算法流程"
        U1[初始: 大候选词表] --> U2[计算token概率]
        U2 --> U3[删除低概率token]
        U3 --> U4{达到目标大小?}
        U4 -->|否| U2
        U4 -->|是| U5[输出词表]
    end

Byte-level vs Character-level

Byte-level BPE(如GPT系列使用的方法)将文本视为UTF-8字节序列,而非Unicode字符序列。这确保了任何文本都能被处理,不存在真正的"未知字符"问题。

代价是:对于不常见的字符组合,byte-level BPE可能产生更长的token序列。例如,一个汉字可能被表示为多个字节token。

LLaMA 1使用的byte-level BPE在某些情况下产生了奇怪的分词结果,特别是对非英文文本。LLaMA 2通过在词表中预置常用CJK字符改善了这一问题,但32K的词表大小仍然限制了覆盖范围。

实践指南:如何选择词表大小

基于模型规模的估算

使用NeurIPS 2024论文的缩放公式,可以根据预期的模型规模估算最优词表大小:

$$V^{opt} \approx \frac{N_v^{opt}}{d} = \frac{N_v^0}{d} \times \left(\frac{N_{nv}}{N_{nv}^0}\right)^{0.83}$$

以基准模型$N_{nv}^0 = 33M$,$N_v^0/d \approx 8K$为例,不同规模模型的最优词表估算如下:

模型规模 最优词表(估算)
1B ~20K
7B ~65K
70B ~200K
175B ~300K

基于应用场景的考量

实际选择词表大小时,除了模型规模,还需考虑应用场景:

单语言英文场景:32K-50K通常足够。英文的词根词缀相对有限,更大的词表边际收益递减。

多语言场景:建议至少100K。特别是需要支持CJK语言时,更大的词表能显著改善处理效率。

代码生成场景:100K+。代码包含大量特定词汇(函数名、变量名、关键字组合),更大的词表能更有效地压缩代码。

资源受限场景:可能需要小于理论最优值。在边缘设备或移动端部署时,较大的embedding矩阵会带来显著的内存和计算开销。

quadrantChart
    title 词表大小选择决策矩阵
    x-axis 小词表优先 --> 大词表优先
    y-axis 低资源约束 --> 高资源约束
    quadrant-1 大词表场景
    quadrant-2 平衡场景
    quadrant-3 小词表场景
    quadrant-4 特殊优化
    "多语言应用": [0.8, 0.8]
    "代码生成": [0.7, 0.7]
    "单语言英文": [0.3, 0.6]
    "边缘设备部署": [0.2, 0.2]
    "大型模型训练": [0.9, 0.9]
    "小模型优化": [0.2, 0.4]

词表扩展技术

对于已经训练好的模型,可以通过词表扩展技术改善其在特定语言或领域的表现:

  1. 添加新token:在词表中添加目标语言或领域的高频token
  2. 继续预训练:用目标数据对扩展后的词表进行继续预训练
  3. 参数高效微调:只训练新添加token的embedding,保持其他参数不变

这种方法被广泛用于开发特定语言的模型变体,如中文LLaMA系列。

词表设计的未来趋势

自适应词表

研究者正在探索训练过程中动态调整词表的方法。一种思路是"词表课程学习":训练初期使用较小粒度的token(如字符级别),随着模型能力提升,逐步合并为更大的token。

这种方法使模型能够自适应地学习最优的分词粒度——对于容易预测的内容使用大token,对于难以预测的内容保持细粒度分解。

架构级别的创新

另一种思路是将分词决策移入模型架构内部。Megabyte(2023)将文本作为固定长度的字节块处理,由模型内部学习如何将字节组合成语义单元。这种方法模糊了传统"分词"和"表示学习"的边界。

无分词器架构

一些研究探索完全绕过传统分词的方法。Byte Latent Transformer(2024)直接在字节序列上进行建模,通过动态确定分割点来避免预定义词表的限制。这种方法在理论上可以处理任意语言和格式,但代价是序列长度显著增加。

future directions

mindmap
  root((词表技术演进))
    传统方法
      BPE
      Unigram
      WordPiece
    当前趋势
      更大词表
      多语言优化
      代码特定token
    未来方向
      自适应词表
        课程学习
        动态合并
      架构创新
        Megabyte
        无分词器
      字节级建模
        Byte Latent Transformer
        动态分割

结语:重新审视词表的重要性

词表大小的选择,表面上看是一个简单的超参数配置,实则深刻影响着模型的效率、能力和适用范围。NeurIPS 2024的研究揭示,当前主流模型的词表配置可能远非最优,更大的模型理应配备更大的词表。

对于模型开发者而言,词表设计需要综合考虑模型规模、目标应用、训练数据量和部署环境。盲目追求大词表或固守小词表都不是最优策略——关键在于找到与模型规模和任务需求相匹配的平衡点。

随着模型规模的持续增长和对多语言能力要求的提高,词表大小的优化将成为模型设计中越来越重要的一环。理解词表背后的权衡逻辑,有助于开发者做出更明智的设计决策。

参考文献

  1. Liu, Q., et al. “Scaling Laws with Vocabulary: Larger Models Deserve Larger Vocabularies.” NeurIPS 2024.
  2. Sennrich, R., Haddow, B., & Birch, A. “Neural Machine Translation of Rare Words with Subword Units.” ACL 2016.
  3. Kudo, T., & Richardson, J. “SentencePiece: A simple and language independent subword tokenizer and detokenizer for Neural Text Processing.” EMNLP 2018.
  4. Radford, A., et al. “Language Models are Unsupervised Multitask Learners.” OpenAI 2019.
  5. Touvron, H., et al. “Llama 2: Open Foundation and Fine-Tuned Chat Models.” 2023.
  6. Meta AI. “The Llama 3 Herd of Models.” 2024.
  7. OpenAI. “GPT-4 Technical Report.” 2023.
  8. Google DeepMind. “Gemma: Open Models Based on Gemini Research and Technology.” 2024.
  9. Devoto, A. “Visualizing the Vocabulary of an LLM.” 2025.
  10. Gulati, S. “Why LLM Vocabulary Size Matters.” 2024.