几乎所有大型语言模型(LLM)都有自己独立的词表(Vocabulary)。这是模型设计和训练过程中的核心组件之一。以下是关于词表的关键点:
1. 词表的作用
- 分词基础:词表定义了模型如何将输入文本拆分成基本单元(如单词、子词、符号等)。
- 数值化映射:每个词表中的单元对应一个唯一整数(Token ID),模型通过处理这些 ID 进行运算。
- 模型容量:词表大小直接影响模型的参数量和处理效率。
2. 不同模型的词表差异
- 语言差异:
- 中文模型(如 ChatGLM、Qwen)包含大量中文字符和常见中文词汇。
- 多语言模型(如 mBART、NLLB)的词表可能覆盖数十种语言的字符。
- 训练数据:
- 代码模型(如 CodeLlama)的词表包含编程语言关键词(
if
,def
,{}
等)。 - 专业领域模型可能包含生物/化学术语(如 AlphaFold 相关的蛋白质序列 token)。
- 代码模型(如 CodeLlama)的词表包含编程语言关键词(
- 分词算法:
- BPE(Byte Pair Encoding):GPT 系列、RoBERTa。
- WordPiece:BERT、DistilBERT。
- Unigram:T5、XLM-R。
- SentencePiece:LLaMA、Gemini(支持跨语言无空格分词)。
3. 典型模型的词表大小对比
模型 | 词表大小 | 特点 |
---|---|---|
GPT-2 | 50,257 | 英文为主,含常见符号 |
BERT | 30,522 | 英文+WordPiece 子词 |
LLaMA 3 | 128,256 | 多语言优化,支持代码 |
Qwen-1.5 | 152,064 | 中英混合,覆盖数学/代码符号 |
Claude 3 | ~200k | 强调多语言和长上下文支持 |
4. 为什么需要自定义词表?
- 效率优化:避免对常见词(如英文的
the
、中文的的
)过度拆分。 - 语言适配:中文/日文等非空格语言需要不同的分词策略。
- 领域适配:医学/法律模型需保留专业术语的完整性(如
"冠状动脉"
不应被拆解)。 - 生僻词处理:通过子词组合(如
"Deep" + "##seek" → "Deepseek"
)解决未登录词问题。
5. 词表如何影响模型行为?
- 分词结果差异:
- 输入
"ChatGPT is amazing!"
:- GPT-2 可能拆为
["Chat", "G", "PT", " is", " amazing", "!"]
- LLaMA 可能拆为
["Chat", "GPT", " is", " amazing", "!"]
- GPT-2 可能拆为
- 输入
- 语言偏误:词表以英文为主时,中文/泰文等语言的效率会下降。
- 信息损失:过小的词表可能导致专有名词被强制拆解(如
"Transformer" → "Trans" + "##former"
)。
6. 特殊 Token 示例
除了常见词汇,词表还包含功能性 Token:
[CLS]
、[SEP]
→ BERT 用于句子分类/分隔<|im_start|>
→ ChatML 格式中的对话开始标记<0x04>
(EOS)→ 句子结束符▁
→ SentencePiece 表示空格
总结:
词表是每个大模型的身份证和语言基因,决定了模型如何看待文本。不同模型因目标语言、领域和算法选择差异,会采用完全不同的词表设计。这也是同一段输入在不同模型中表现各异的原因之一!