ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

分词器从0到1:ai-engineering-from-scratch 中 BPE、WordPiece、SentencePiece 实现对比

2026/9/15 18:37:33 拓冰建站 浏览量
分词器从0到1:ai-engineering-from-scratch 中 BPE、WordPiece、SentencePiece 实现对比 分词器从0到1ai-engineering-from-scratch 中 BPE、WordPiece、SentencePiece 实现对比【免费下载链接】ai-engineering-from-scratchLearn it. Build it. Ship it for others.项目地址: https://gitcode.com/GitHub_Trending/ai/ai-engineering-from-scratch分词器Tokenizer是每一个大语言模型LLM的入口模型并不读文字只读整数。开源项目ai-engineering-from-scratch用从零手写的方式把当前三大主流分词算法——BPE、WordPiece、SentencePiece——讲透并亲手实现是新手理解分词器如何从 0 到 1 构建的完整学习路径。分词器为什么重要分词器决定了上下文窗口的实际容量unhappiness若被拆成 4 个 token多音节文本的 128K 上下文窗口会缩水近 75%推理成本每个 token 都计费、都消耗算力token 越少生成越快多语言公平性面向英语训练的英文本分词器韩语文本平均一个词要 2~3 个 token上下文效率直接减半一句话总结课程观点分词不是预处理而是架构决策。三种方案为什么子词分词胜出方案示例unhappiness优点致命缺陷词级分词[unhappiness]直观生词变[UNK]词表需无限大字符级分词u n h a p p i n e s s11 个 token永不失配序列爆炸模型浪费注意力子词分词[un, happi, ness]常见词保持完整生词可拆解— ✅所有现代 LLM——GPT、Claude、BERT、Llama——全部采用子词分词。区别只在于用哪种算法。BPE 从 0 到 1一次贪心压缩BPEByte Pair Encoding字节对编码的训练逻辑简单到可以写在一张便签上从单个字符或原始字节开始统计语料中所有相邻 token 对的出现次数把频率最高的一对合并成新 token重复直到达到目标词表大小关键在于合并表merge table本身就是分词器。编码新文本时必须严格按照训练时学到的顺序应用合并规则——顺序错了解码出的就是一串错误的 token。以课程中的小语料为例lower×5、lowest×2、newest×6Step 1 统计相邻对(w,e)13 次最高 Step 2 合并 (w,e) → we Step 3 合并 (we,s) → wes Step 4 合并 (wes,t) → west ...直到达到目标词表大小GPT-2 的改进是字节级 BPEByte-level BPE以 0~255 的原始字节作为基础词表恰好 256 个任何语言、任何编码都永远不会出现未知 token。GPT-2 词表 50,257GPT-4 约 100,256cl100k_baseGPT-4o 达 200,019。WordPiece换了选对标准的 BPEWordPieceBERT 所用与 BPE 长得很像区别只在合并准则BPE: 选出现次数最多的对 → count(A, B) WordPiece: 选共同出现超出随机期望的对 → count(AB) / (count(A) × count(B))BPE 问哪一对出现得最多WordPiece 问哪一对的共现比巧合更值得合并 这个微妙差异产出了不同的词表。WordPiece 还使用##前缀标记续接子词unhappiness → [un, ##happi, ##ness]BERT 用 30,522 大小的 WordPiece 词表运行至今。SentencePiece真正语言无关的分词器SentencePiece 的杀手锏不做预分词。它把输入当作原始 Unicode 字符流含空格没有针对特定语言的切词规则空格用▁表示。这对中文、日文、泰语等空格不划分词的语言至关重要。它支持两种算法BPE 模式与标准 BPE 相同的合并逻辑直接作用于原始字符序列Llama 2 采用词表 32,000Unigram 模式思路完全相反——从超大词表出发迭代删除对语料似然影响最小的 token剪枝而非合并T5、Gemma 采用 注意一个细节Llama 3 抛弃了 32K 的 SentencePiece 词表改用 tiktoken 的字节级 BPE 128,256 词表——多语言的税逼着词表变大。三大分词器速查对比维度BPEWordPieceSentencePiece合并准则原始频率似然比BPE 或 Unigram剪枝预分词通常需要如 GPT-2 正则需要无需语言无关续接标记无##前缀▁表示前导空格代表模型GPT 全系、Llama 3BERT、DistilBERTLlama 2、T5、Gemma实现库tiktokenRustHF Tokenizerssentencepiece词表大小一个有真金白银代价的决策128K 词表 × 4,096 维嵌入 5.24 亿参数仅嵌入矩阵32K 词表则约 1.31 亿——4 亿参数的差距只来自分词器选择但大词表压缩更狠同样一段英文128K 词表比 32K 词表少约 30% 的 token推理直接省 30% 的前向计算模型词表大小分词类型英文平均 token/词BERT30,522WordPiece~1.4GPT-250,257字节级 BPE~1.3Llama 232,000SentencePiece BPE~1.4Llama 3128,256字节级 BPEtiktoken~1.1GPT-4o200,019字节级 BPE~1.0动手实践仓库里的三层递进实现课程把写分词器拆成了由浅入深的三条线全部可运行① 核心原理课Phase 10 · Lesson 01 从字符级分词器起步手写一个完整的字节级 BPEtrain()里统计词对 → 合并最高频 → 记入合并表的循环就是 BPE 的灵魂。压缩比token 数 ÷ 原始字节数越低越好训练语料外出现unhappiness这种新模式时压缩比变差——这正是分词器对未见模式回退到字符级的直观证据。教程文档docs/en.mdPython 实现code/bpe.pyRust 实现code/bpe.rs② 生产级分词器Phase 10 · Lesson 02 上一个 BPE 一遇到日语、emoji、混用 Tab 的代码就崩。这一课补全工业级分词器的五阶段流水线归一化 → 预分词 → BPE 合并 → 特殊 token 注入 → ID 映射并讲透 chat template 如何把多轮对话拍平成 token 序列。教程文档docs/en.md生产级实现code/main.py③ 毕业项目Phase 19 · Project 30 从零训练字节级 BPE 词表256 个字节 ID 打底 → 保留特殊 token 区间【免费下载链接】ai-engineering-from-scratchLearn it. Build it. Ship it for others.项目地址: https://gitcode.com/GitHub_Trending/ai/ai-engineering-from-scratch创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考