Tokenization 与 BPE:模型的词汇表

02-架构解剖 入门 约 20 分钟 #分词#BPE#词表#tokenizer 更新 2026-10-02
当前状态:未学
本文基于模型知识整理(生成时未联网核对),BPE 算法与分词缺陷案例建议对照 Sennrich 2016 与 GPT-4 tokenizer 分析复核。

一句话定义

Tokenization 把原始文本切成模型词表内的 token(子词单元):主流算法 BPE(字节对编码)从字符开始迭代合并最高频相邻对,直到词表达到预定大小——模型看到的世界不是字符也不是词,而是这些统计学出来的子词片段。

为什么重要

分词是模型与文本的接口:拼写能力("strawberry 有几个 r"的失败)、数字运算错误、中英效率差、代码缩进敏感——一大半"LLM 的怪癖"根源于分词。理解 BPE,才能理解为什么"token 数≠字符数"、为什么 tokenizer 改版是模型升级的大事(Llama 3 词表扩到 128k)。

前置知识

kp-001(token 的概念);无其他前置。

核心概念

  • 三种粒度:字符级(序列过长)、词级(词表爆炸+OOV)、子词级(折衷,现代标准)——BPE/WordPiece(BERT 用,形如 ##ing)/SentencePiece(语言无关、把空格当字符)。
  • BPE 训练流程:① 起始词表=全部字节/字符;② 统计语料中相邻 token 对频次;③ 合并最高频对成新 token 加入词表;④ 重复直到词表大小(如 128k)。高频词长、低频词碎——"the"一个 token、"strengthening"多个 token。
  • 字节级 BPE(GPT 系):先按字节(256 基础)再 BPE——任何文本(含 emoji/任何语言)都可表示,永无 OOV。代价:非英语文本 token 效率低(同内容中文字节数多 → 多花 token 数与钱,kp-030 数字问题同源)。
  • 词表的工程属性:大小权衡(大=压缩好/嵌入矩阵大;Llama-3 从 32k 扩到 128k 的动机=多语言与代码效率);特殊 token(BOS/EOS/角色标记)是"保留字";tokenizer 与模型绑定(换 tokenizer=重训)。
  • 多语言公平问题:同一段话英文 100 token、某些语言 300 token——API 成本与"思考 token 预算"的语言不公平(kp-031 的公平性议题)。

原理与机制

BPE 为什么优于词级:词级遇到新词只能 <UNK>(信息全丢);BPE 退到子词("unbelievable"→"un"+"believ"+"able")——组合性让有限词表覆盖无限文本,且常见词保持完整(高频优先合并)。这是"统计学习出的层次表示"——与模型内部学到的层次特征(字符→词素→语义)遥相呼应。

分词缺陷的机制(怪癖溯源):

  • 拼写失败:token 是"整块"字符序列,模型内没有字符级对齐——问字母个数像问"这个词的第几个像素";
  • 数字错误:数字被切成不规则片段("1234567"→"123"+"45"+"67"),位值结构被打乱;
  • 代码缩进敏感:空格串与制表符是不同 token,缩进语义被 tokenizer 形态绑架;
  • 对抗注入:刻意构造奇怪 token 边界绕过安全过滤(安全层的 tokenizer 级漏洞,kp-030)。

修复方向:字节级 LAUREL 编码(给字节注入字符信息)、多尺度数字分词、tokenizer 改造——均为 kp-031 前沿的活跃方向;短中期内"分词怪癖是 LLM 的出厂设定"。

图示

BPE 训练: 字节词表(256) → 迭代合并最高频对 → 词表128k
推理: 文本 → 最长匹配词表切分 → token id 序列
粒度: 高频整词(1 token) ; 低频/新词 → 碎片化
怪癖溯源: 拼写/数字/缩进/公平性 ← token粒度的世界观
字节级: 永无OOV ; 非英语效率低 (多花token)

直观类比

BPE 像"乐高颗粒设计":常用形状做成大颗粒(拼搭快),罕见形状用小颗粒凑——颗粒表(词表)有限但组合无限。拼写问题像"问乐高成品里有几颗 2×4 砖":成品只记录颗粒编号序列,"原砖的边数"信息在拼装时已丢。

实例或案例

  • "strawberry 有几个 r"翻车:tokenizer 把 strawberry 切成 2-3 块,模型内部缺乏字符序列表示——2024 年最著名的分词怪癖话题(o1 类模型靠思维链绕过)。
  • Llama 3 词表 32k→128k:多语言压缩率提升(同内容 token 数下降)——tokenizer 升级=推理成本下降。
  • GPT-4 的 tiktoken:开源分词器,可亲手跑 BPE 观察切分(kp-032 的延伸实验)。

常见误区

  • 误区一:"模型认字"。模型认 token——字符级知识是间接的(由分词统计与训练数据推断),拼写类能力天然脆弱。
  • 误区二:"token 数=词数/字符数"。比例因语言/领域而异(代码与中文尤甚)——成本与上下文预算必须按 token 计。
  • 误区三:"换 tokenizer 不影响模型"。词表嵌入矩阵绑定 tokenizer——换分词=必须重训或做嵌入对齐。

与其他知识点的关系

  • kp-001/012:token 是架构输入与训练目标的单位。
  • kp-025/030:token 效率影响上下文预算与数字能力。
  • kp-032:tiktoken/tokenizers 库的实操。

自测题

  1. 简述 BPE 训练的四步循环。

答:字节起始 → 统计相邻对频次 → 合并最高频对入词表 → 重复至目标词表大小。

  1. 为什么字节级 BPE"永无 OOV"?

答:基础词表是全部 256 字节——任何文本最终都可分解到字节层,组合覆盖无死角。

  1. 举两个"分词导致的 LLM 怪癖"并说明机制。

答:拼写失败(token 无字符级对齐);数字运算错误(位值被不规则切分打乱)——均源于 token 粒度世界观。

延伸阅读

  • Sennrich 等, "Neural Machine Translation of Rare Words with Subword Units"(ACL 2016,BPE 原文)。
  • OpenAI tiktoken 库与 GPT-4 tokenizer 可视化工具( tictokenizer.leelo.co 类在线工具)。
  • Karpathy《Let's build the GPT Tokenizer》视频(最佳手把手指教)。