分词(Tokenization)是大模型处理文本的第一步,相当于给模型 "拆分语言积木"------ 不同的拆分方式,直接影响模型的理解效率、显存占用和生成效果。
市面上主流大模型的分词算法主要有三类:BPE、WordPiece、SentencePiece。今天就用大白话拆解它们的核心逻辑、异同点,再结合 LLaMA、BERT、ChatGLM 等热门模型的分词实践,帮你彻底搞懂 "大模型是怎么切分文本的"。
一、Byte-Pair Encoding(BPE):按频率合并,大模型的 "基础分词法"
BPE(字节对编码)是最经典的分词算法,GPT-2、BART、LLaMA 等主流模型都在用。它的核心思路特别简单:从最小字符开始,反复合并高频相邻子词,直到达到目标词表大小。
1. BPE 构建词典的完整步骤
以英文 "low""lower""newest""widest" 为例,一步步看 BPE 怎么造词表:
- 准备阶段:确定训练语料(比如上述 4 个单词)和目标词表大小(假设目标:10 个词);
- 字符级拆分 :把每个单词拆成最小字符,末尾加 "</w>"(标记单词结束),统计频率:
- low</w>: 1、lower</w>: 1、newest</w>: 1、widest</w>: 1
- 拆分后:l o w </w>、l o w e r </w>、n e w e s t </w>、w i d e s t </w>
- 高频合并:统计所有相邻字符对的频率,合并最高频的对。比如 "e" 和 "s" 出现 2 次(newest、widest),合并为 "es";
- 重复合并:不断重复步骤 3------ 下次合并 "es" 和 "t"(频率 2)为 "est",再合并 "w" 和 "i"(频率 1)...... 直到词表达到 10 个词;
- 停止条件:词表大小达标,或下一个最高频字符对的频率为 1(再合并无意义)。
2. BPE 的核心特点
- 优点:逻辑简单、易实现,能平衡 "词粒度" 和 "字符粒度"------ 高频词会被合并成一个子词(比如 "est"),低频词保留字符级拆分,兼顾效率和覆盖率;
- 缺点:对低频词拆分过细(比如生僻词可能拆成单个字符),处理中文时容易出现 "单字拆分"(LLaMA 原生中文分词就是如此)。
二、WordPiece:按语言模型概率合并,BERT 的 "智能分词法"
WordPiece 是 Google 为 BERT 设计的分词算法,本质上是 BPE 的 "改进版"------ 核心思想和 BPE 一致,但合并规则不同。
1. WordPiece 与 BPE 的核心异同
| 对比维度 | BPE | WordPiece |
|---|---|---|
| 核心思想 | 从字符开始,逐步合并子词 | 同 BPE(字符→子词) |
| 合并规则 | 选择出现频率最高的相邻子词合并 | 选择能让语言模型概率提升最大的相邻子词合并 |
| 目标 | 减少文本总 token 数 | 提升模型对文本的语义理解 |
| 代表模型 | GPT-2、LLaMA、BART | BERT、DistilBERT |
2. 合并规则的通俗解释
BPE 像 "看 popularity 选队友"------ 谁凑在一起出现次数多,就合并谁;WordPiece 像 "看默契度选队友"------ 合并后能让整个句子的 "语义合理性"(语言模型概率)最高,才合并。
比如 "newest" 中的 "e" 和 "s",BPE 合并是因为它们一起出现 2 次;WordPiece 合并是因为 "es" 作为一个子词,能让 "newest" 的语义更连贯(模型预测 "newest" 的概率更高)。
3. WordPiece 的核心特点
- 优点:拆分更贴合语义,能减少 "无意义子词"(比如不会把 "apple" 拆成 "app"+"le" 这种语义割裂的组合);
- 缺点:计算复杂度比 BPE 高(需要计算语言模型概率),对低频词的处理效果仍有限。
三、SentencePiece:把空格当字符,多语种模型的 "万能分词法"
SentencePiece 是 Google 推出的 "通用分词工具",不是单一算法 ------ 它支持 BPE 和 Unigram 两种核心逻辑,核心创新是把空格当作特殊字符处理。ChatGLM、BLOOM、PaLM 等多语种模型都在用。
1. SentencePiece 的核心思路
传统分词算法(BPE/WordPiece)会先按空格拆分单词,再处理每个单词;而 SentencePiece 直接把整个句子当作 "字符序列",空格被编码成特殊符号(比如 "▁"),再用 BPE 或 Unigram 算法拆分。
举个例子,句子 "I love China":
- 传统 BPE:先拆成 "I""love""China" 三个单词,再分别拆分;
- SentencePiece:先转换成 "▁I▁love▁China"(空格→▁),再整体按 BPE 合并,可能拆成 "▁I""▁love""▁Chi""na"。
2. SentencePiece 的核心特点
- 优点:
- 支持多语种:不用单独处理每种语言的空格、标点,适配中文(无空格)、英文(有空格)等多种语言;
- 灵活性高:可选择 BPE 或 Unigram 算法,按需调整;
- 无词表依赖:能处理生僻词、网络新词(拆成字符级);
- 缺点:词表通常较大(比如 BLOOM 词表达 25 万),对模型显存有一定要求。
四、三大分词算法核心对比表
| 算法 | 核心逻辑 | 合并规则 | 代表模型 | 优点 | 缺点 |
|---|---|---|---|---|---|
| BPE | 字符→高频合并→子词 | 按出现频率最高合并 | GPT-2、LLaMA、BART | 简单易实现、效率高 | 低频词拆分过细、中文支持弱 |
| WordPiece | 字符→语义合并→子词 | 按语言模型概率最大合并 | BERT、DistilBERT | 语义贴合度高 | 计算复杂、多语种支持弱 |
| SentencePiece | 空格当特殊字符 + BPE/Unigram | 可选(频率 / 概率) | ChatGLM、BLOOM、PaLM | 多语种友好、灵活 | 词表大、显存占用高 |
五、实战对比:主流大模型的分词方式差异
不同模型选择的分词算法不同,直接导致了它们的分词效果天差地别 ------ 尤其是处理中文时。
1. 热门模型分词方式一览
| 模型 | 分词算法 | 词表大小 | 中文分词特点 |
|---|---|---|---|
| LLaMA(原生) | BPE | 32000 | 分词极细,平均 1 个汉字拆成 1.45 个 token(比如 "中" 拆成 2 个 token) |
| Chinese LLaMA | BPE(扩展中文词表) | ~80000 | 1-2 个汉字拆成 1 个 token,编码效率大幅提升 |
| BERT | WordPiece | 30522 | 中文按单字拆分("中国"→"中"+"国"),语义贴合度高 |
| ChatGLM-6B | SentencePiece(BPE) | 65024 | 平衡中英文,中文 1-2 字拆 1 个 token,效率和语义兼顾 |
| BLOOM | SentencePiece(Unigram) | 250880 | 多语种适配,中英文分词效率和 ChatGLM 接近 |
2. 分词效果直观对比(以 "我爱中国" 为例)
- LLaMA(原生):
▁+我(拆成 2 个 token)+▁+爱(拆成 2 个 token)+▁+中(拆成 2 个 token)+国(拆成 2 个 token)→ 共 10 个 token; - Chinese LLaMA:
▁我爱+中国→ 共 2 个 token; - BERT:
我+爱+中+国→ 共 4 个 token; - ChatGLM-6B:
▁我爱中国→ 共 1 个 token; - BLOOM:
▁我+爱+中+国→ 共 4 个 token。
3. 核心区别总结
- 中文支持:ChatGLM-6B > Chinese LLaMA > BLOOM > BERT > LLaMA(原生);
- 分词效率(token 数越少效率越高):扩展词表的模型 > 多语种模型 > 原生单语种模型;
- 语义贴合度:WordPiece(BERT)> SentencePiece(ChatGLM)> BPE(LLaMA);
- 显存占用:词表越大占用越高(BLOOM > ChatGLM > LLaMA > BERT)。
六、总结:怎么选分词算法?
- 若做英文单语种模型:优先 BPE(简单高效)或 WordPiece(语义更好);
- 若做多语种模型:必选 SentencePiece(空格处理 + 多算法支持);
- 若做中文模型:优先用 SentencePiece 或扩展中文词表的 BPE(避免单字拆分);
- 若模型参数量小(<7B):选小词表 BPE(节省显存);若模型参量大(>13B):可选大词表 SentencePiece(提升效率)。
分词算法是大模型的 "地基"------ 选对了,模型能以更少的 token 处理更多文本,显存占用更低、生成更流畅。理解了 BPE、WordPiece、SentencePiece 的核心逻辑,不仅能更好地选型,还能在模型微调时针对性优化词表(比如给 LLaMA 扩展中文词表),让模型更适配你的任务~