1.2 Token 与嵌入:文本到可计算表示的转换#
神经网络只能处理数值,因此文本进入模型前须先被切分为称作 token 的离散单元,再由嵌入查表映射为向量。分词决定了模型观测的最小粒度与序列长度,嵌入则把语义关系编码为向量空间中的几何关系。
本页沿三条线索展开:分词算法如何形成词表,词表如何改变成本与能力,以及 token id 如何进入连续向量空间。
核心问题
词级与字符级切分各自的失效模式,以及 subword(子词)token 为何成为工业标准;BPE 如何从字符逐步合并出一张词表(附逐步合并算例)。
字节级 BPE(BBPE)、WordPiece、SentencePiece 三条主流路线在切分准则上的差异,以及
"cat"与" cat"(带空格前缀)为何是两个不同 token。词表大小 $V$ 在序列长度与嵌入矩阵参数量之间的权衡,及从 GPT-2 的 50K 到 GPT-4o 的 200K 的演进逻辑。
能归纳数字算术、字符计数、多语言成本、代码缩进等失败模式的共同根源。
能解释 token id 经嵌入矩阵映射为向量的机制,以及静态嵌入与上下文嵌入的关键区别。
完整转换链路见图 1。
一、问题的提出:以什么为单位切分文本#
Tokenization 将离散文本切分为有限词表中的 token 序列,再把每个 token 映射为整数 id。切分粒度决定词表规模、序列长度与新输入的编码方式。
分词粒度像积木尺寸。三种粒度的差别是整词积木表达直接却难以备齐,字符积木覆盖一切却让组合链过长,子词积木则复用常见部件。
两端方案各有代价:词级保留完整词义却封闭词表,字符级覆盖任意输入却膨胀序列。工业方案的目标是同时吸收两端的优点。
子词方案源于开放词表研究,最初服务于神经机器翻译中的罕见词处理,随后成为聊天模型的通用输入基础。
subword 的学术起点:Sennrich、Haddow、Birch 2016 将 subword 引入现代 NLP[^bpe]。
该工作借用原本用于数据压缩的 BPE(Byte Pair Encoding,字节对编码)解决神经机器翻译的开放词表问题,使模型能够翻译训练时未见的罕见词。实测增益为英德、英俄翻译分别提升约 1.1、1.3 BLEU。压缩算法改善翻译质量,也与上一节压缩即智能的论点相呼应。
token 数量直接决定 API 计费与上下文容量,服务端以分词后的序列长度作为统计依据。
计费与上下文长度的换算:大模型 API 按 token 计费,上下文长度也以 token 而非字数计量。经验上,1 个英文 token 约相当于 4 个字符或 0.75 个单词;中文约为 1 token 对应 1 至 2 个汉字。
因此128K 上下文实际可容纳的中文内容,往往少于按字数估算的结果。检查方法是使用 OpenAI 的 Tokenizer 可视化工具,观察 token 数量与每个 token 的内容。
二、BPE 的训练机制与合并算例#
BPE 是一种贪心词表学习算法,反复合并语料中加权频次最高的相邻符号对。现代 NLP 中的定义来自 Sennrich et al. 20161。
加权语料记为 $D=\{(w_i,f_i)\}$,其中 $w_i$ 是第 $i$ 个词的当前符号序列,$f_i$ 是该词在语料中的频次。计数函数 $C_t(a,b)$ 表示相邻符号对 $(a,b)$ 在全部 $w_i$ 中按 $f_i$ 加权后的出现次数,$V_t$ 则表示第 $t$ 轮词表。
$$ C_t(a,b)=\sum_i f_i\,N_{w_i}^{(t)}(a,b),\qquad (a_t^*,b_t^*)=\arg\max_{(a,b)}C_t(a,b) $$符号含义:$N_{w_i}^{(t)}(a,b)$ 表示第 $t$ 轮时,符号对 $(a,b)$ 在词 $w_i$ 中出现几次。一次更新把所有不重叠的 $a_t^*\ b_t^*$ 替换为新符号 $a_t^*b_t^*$,并令 $V_{t+1}=V_t\cup\{a_t^*b_t^*\}$。
BPE 像为常见组合制作快捷键。高频片段逐步成为完整单元,罕见组合则保留为可拼接的小块。
逐步合并算例#
原论文的四词语料包含 low × 5、lower × 2、newest × 6、widest × 3。词尾记号 </w> 使初始化后的 low 写作 l o w </w>;乘数记录词频,并与符号重复次数区分。
| 状态 | 本轮计算 | 为什么得到该结果 |
|---|---|---|
| $t=0$ | $C_0(e,s)=6+3=9$ | newest 出现 6 次、widest 出现 3 次,两词各含一次 e s。 |
| 第一次更新 | e s → es | e s 属于最高频对;若与其他频次为 9 的对并列,训练器按固定规则破除平局。 |
| $t=1$ | $C_1(es,t)=6+3=9$ | 上一轮使两个词都出现 es t,加权次数仍是 $6+3$。 |
| 第二次更新 | es t → est | 新符号 est 同时进入 newest 与 widest,成为可跨词复用的片段。 |
| 后续分支 | $C(l,o)=5+2=7$ | low 与 lower 各含一次 l o,故加权次数为 $5+2$,随后可形成 lo 与 low。 |
完整状态流见图 2。图中每一行把左侧符号状态与右侧计数或更新公式对齐,读者可以从输入逐轮复算输出。
继续迭代:下一轮可合并
est + </w> → est</w>;另一条高频链会执行l + o → lo、lo + w → low。词尾标记使词内est与词尾est</w>保持不同身份。
适用边界:同一字符串按同一张 merge 表得到唯一切分,Unigram 则支持按概率采样多种切分。合并顺序赋予早期规则更高优先级,因此训练语料差异会产生不同的 BPE 切分结果。
三、字节级 BPE:从根本上消除编码失败#
第二节中的从字符起步存在一个问题:Unicode 包含十余万个码位(涵盖各国文字、emoji、生僻字),全部纳入初始词表既浪费,遗漏者又会退化为 OOV。GPT-2(Radford et al. 2019)为此提出了字节级 BPE(byte-level BPE, BBPE)2。
字节覆盖的后果是空格与换行也参与合并,因此同一个词会因前导空格不同而获得不同编号。
空格前缀 token 的成因:BBPE 直接在字节上运行,但空格(字节 32)、换行(字节 10)等控制字符不便显示。GPT-2 将空格映射为
Ġ、换行映射为Ċ,再在处理后的字节上执行 BPE[^hfcourse]。句首与句中的切分不同:
"cat"与" cat"分别成为"cat"和"Ġcat"两个 token。工程边界:行首或结尾空格可能改变 token 序列并影响输出。BBPE 中的空格构成词的一部分,同时承担边界信号。
四、三条路线的切分准则:BPE / WordPiece / SentencePiece#
BPE、WordPiece 与 Unigram的差异在于词表搜索准则;SentencePiece则是可以承载 BPE 或 Unigram 的语言无关训练框架。
| 路线 | 代表模型 | 合并 / 切分准则 | 特点 |
|---|---|---|---|
| BPE | GPT-2、Llama 3、RoBERTa | 合并最高频的相邻对 | 贪心、确定、实现简单 |
| WordPiece | BERT | 按合并后的语料似然增益选择符号对 | 更统计最优,切分带 ## 前缀标续接 |
| Unigram LM | ALBERT、T5(经 SentencePiece) | 从一个大词表出发,按似然裁剪掉贡献小的子词 | 能给出多种切分的概率、可采样(子词正则化) |
WordPiece随 BERT 广泛使用;Unigram 与 SentencePiece的系统定义见 Kudo 与 Richardson 201834。
选型取决于所需性质:追求确定、简单实现时常用 BPE;需要概率切分与子词正则化时可用 Unigram;无空格语言可借助 SentencePiece 直接训练原始字符流。
主流模型如何落地这些路线#
完整复现分词器需要算法与配置共同参与。实际实现参数包括初始字母表、规范化规则、预分词规则、词表大小、特殊 token 和编码时的规则顺序;下表列出来源公开且可核验的设置。
| 模型家族 | 分词技术与关键参数 | 特殊设置 | 在架构中的位置与来源 | 对应示例 |
|---|---|---|---|---|
| BERT Base / Large | WordPiece,英文 uncased 词表 30,522 | ## 标记词内续接,并使用 [CLS]、[SEP]、[MASK] | token id 先进入 token、segment 与 position 三类嵌入之和,再送入编码器;见 BERT 图 2 与官方词表5。 | 单句分类形如 [CLS] a dog runs [SEP];掩码预测把目标位置写成 [MASK]。 |
| T5 | SentencePiece Unigram,基础词表约 32K,配置维度为 32,128 | 文本到文本任务使用额外 sentinel token 表示被遮盖片段 | token id 进入共享输入嵌入,编码器、解码器与输出投影复用词表接口;见 T5 与官方配置6。 | 翻译输入形如 translate English to German: house;跨度去噪用 <extra_id_0> 占据被遮盖片段。 |
| Llama 3 | tiktoken 风格 byte-level BPE,词表 128,256 | 对话模板增加 BOS、EOS、EOT 与角色头 token | token id 经 128256 × d 输入嵌入进入 decoder-only Transformer;输出语言模型头使用独立权重78。 | 对话从 <|begin_of_text|> 开始;每轮消息以角色头开场并由 <|eot_id|> 收束。 |
| Qwen2 / Qwen2.5 | byte-level BPE,151,643 个常规 token 加 3 个控制 token,总计 151,646 | 全系列共用词表;Qwen2 小模型共享输入输出嵌入,7B 及以上使用独立输出权重 | 输入嵌入位于 decoder 主干之前,输出 LM head 位于其后;参数表见 Qwen2 技术报告 表 19。 | Qwen2-0.5B 与 1.5B 复用输入输出嵌入;Qwen2-7B 与 72B 为输入嵌入和 LM head 分配独立参数。 |
| Gemma 2 | SentencePiece,词表 256K | 保留 Gemma 词表以覆盖多语言和代码 | 输入与输出嵌入共享,嵌入向量在进入 Transformer 前乘以 $\sqrt d$;见 Gemma 2 与官方实现10。 | 一个 256K × d 权重矩阵同时承担输入查表与输出分类;查表向量乘 $\sqrt d$ 后进入首个 Transformer 层。 |
| DeepSeek-V3 | byte-level BPE,技术报告记为扩展 128K 词表 | 使用专用特殊 token;公开配置的 vocab_size 为 129,280,包含实现层保留项 | token id 经输入嵌入进入 MLA 与 DeepSeekMoE 主干;分词器设置见 DeepSeek-V3 技术报告11。 | 加载公开权重时按 129,280 行创建词表相关张量;中文、英文与代码统一先编码为 byte-level BPE id。 |
架构上的共同点是分词器运行在神经网络之外,输出整数 id;嵌入层才是模型参数的一部分。完整输入协议由算法、词表、控制 token 与共享权重策略共同确定。
五、词表大小:序列长度与嵌入参数量的权衡#
词表大小 $V$ 是离散 token 集合的基数,它在序列压缩率与 $V\times d$ 的嵌入和输出参数之间形成权衡。
词表像一本快捷短语表。条目数量的权衡是条目越多,句子越短,但词典占用的存储和训练样本越多。
模型演进持续重估这项权衡,具体规模如下表。
| 模型 | 年份 | 分词器 | 词表大小 |
|---|---|---|---|
| GPT-2 | 2019 | byte-level BPE | 50,257 |
| Llama 1 / 2 | 2023 | SentencePiece (BPE) | 32,000 |
| Llama 3 | 2024 | tiktoken 风格 BPE | 128,256 |
| GPT-4 / 3.5 | 2023 | tiktoken cl100k_base | ≈ 100,000 |
| GPT-4o | 2024 | tiktoken o200k_base | ≈ 200,000 |
Llama 3 的词表从 Llama 2 的 32K 提升至 128K,并改用 tiktoken 风格 BPE,主要目的是改善压缩率,详见Llama 3 技术报告7。
多语言实例:OpenAI 从约 10 万的 cl100k_base 升级到约 20 万的 o200k_base12。更高压缩率使中文、阿拉伯语和印地语通常消耗更少 token,因此成本降低、可用上下文增加。
tiktoken 说明:tiktoken 是 OpenAI 开源的高速 BPE 分词库,cl100k_base与o200k_base是其内置的两套词表(后缀_base指基础词表)。Llama 3 的tiktoken 风格指其采用了同一套高效字节级 BPE 的实现思路,而非直接使用 OpenAI 的词表;各家词表仍为各自独立训练。
六、分词的结构性限制:一个根源与四类失败#
Token 是模型直接观测的最小离散单位。凡任务依赖 token 内部的字符、数位或空白结构,分词都会引入结构性困难。
论文证据:Tokenization counts 使用逗号强制从右向左切分同一道加法题,使数位边界与 token 边界重新对齐,结果见图 3。

实验结论:分词会向模型注入归纳偏置,边界对齐方式直接改变任务难度。
四类失败共享一个观测边界,只是分别显现在数位、字符、语言成本和代码空白符上。
共同根源:模型直接观测 token 级表示,字符与数位结构需要额外展开。计数字母、计数位、反转字符串、押韵或字谜等任务应先建立字符级表示。有效路径是显式拆分输入或调用精确工具。
规避方法有两种:在 prompt 中逐个分开字符,例如
s-t-r-a-w-b-e-r-r-y;或者调用代码执行、计算器等外部工具。工具调用路径见 Agent 主线。
七、从 token 到嵌入向量:嵌入矩阵的查表机制#
嵌入是从离散词表索引到连续向量空间的可学习映射 $E:\{0,\ldots,V-1\}\rightarrow\mathbb{R}^{d}$。
语义相似性对应几何距离#
几何性质由训练目标塑造:
语义相近的 token,其向量距离也相近。例如猫与狗距离较近,猫与汽车距离较远。
论文定义:word2vec最早系统展示了嵌入空间的线性正则性13:
$$ \mathrm{vec}(\text{国王}) - \mathrm{vec}(\text{男人}) + \mathrm{vec}(\text{女人}) \approx \mathrm{vec}(\text{王后}) $$向量类比表现为从男人到国王与从女人到王后的方向近似平行。几何解释是性别与王室身份等属性被编码为方向向量。工程结果是相似度、类比与检索可转化为夹角和距离计算。
嵌入作为独立工具的意义:嵌入不仅是模型内部的一个步骤,其本身即是一项独立且实用的工具。将文档与查询同时转为向量、检索距离最近的文档并输入模型,构成了语义搜索与 RAG(检索增强生成)的基础(详见 RAG 主线);相似内容向量相近这一性质,还可直接用于聚类、推荐与去重。概括而言,嵌入将语义映射为坐标,一旦语义成为坐标,诸多语言问题即退化为几何问题。
静态嵌入与上下文嵌入的分野#
静态嵌入的边界是一个词始终使用固定向量,上下文嵌入则根据整句生成动态词义表示。
八、分词器与模型的解耦、特殊 token 与多模态趋势#
分词器规定离散输入协议,嵌入层解释 token id,特殊 token 则把文档边界、角色和轮次编码进同一序列。
部署时三者共同组成输入协议:词表定义编号,嵌入表解释编号,聊天模板组织角色与轮次;多模态方法进一步把协议扩展到视觉码本。
多模态 tokenizer 趋势(2024–2026):文本通过离散 token + 嵌入表进入模型,图像、音频和视频也可离散为 token,与文本同域处理。
具体做法是使用 VQ-VAE / VQ-GAN 等向量量化方法,把图像压缩成一串视觉 token id,相当于为图像构建视觉码本。统一序列再把视觉 token 与文本 token 拼接,由同一个 Transformer 理解与生成。
代表工作包括 Emu3(2024)、TokenFlow(2024)[^tokenflow],以及 2025 年的 SemHiTok、DualToken。统一目标是用同一个下一个 token 预测框架处理文本、图像与音频,并把压缩即智能推广到跨模态。技术细节见 多模态主线。
TokenFlow 使用语义码本和像素码本共享索引,使同一视觉 token 同时保留高层语义与低层细节。原论文方法总览见图 4。

多模态约束是离散索引既要压缩输入,又要保留不同粒度的信息,才能同时支持理解与生成。
小结#
- 文本进入模型前先被切分为 subword token,兼顾了词级切分会产生 OOV 与字符级切分序列过长的两种失效
- BPE 从字符或字节起步、贪心合并最高频对以学习词表,字节级 BPE 消除了编码失败,并使空格成为词的组成部分
- 词表大小是序列长度与嵌入矩阵参数量之间的权衡,其规模从 GPT-2 的 50K 增至 GPT-4o 的 200K
- 由于 token 是模型的最小观测粒度,数字算术、字符计数、多语言成本与代码缩进等需要看清 token 内部的任务会系统性失败
- 每个 token id 经嵌入矩阵查表得到向量,语义相似对应几何距离,但查表仅给出静态起点,真正的上下文理解由下一节的注意力机制完成
上一节:1.1 · 什么是大语言模型 | 下一节:1.3 · 注意力与 Transformer | 本章总览:第 1 章 · 大模型基础
参考文献#
Sennrich, Haddow, Birch, Neural Machine Translation of Rare Words with Subword Units (ACL 2016, arXiv:1508.07909):首次把 BPE 引入 NMT 开放词表,英德 / 英俄各提升约 1.1 / 1.3 BLEU。外部原文:https://arxiv.org/abs/1508.07909 / https://aclanthology.org/P16-1162/ ↩︎
Radford et al., Language Models are Unsupervised Multitask Learners (GPT-2, 2019) 引入 byte-level BPE:基础词表恰为 256 字节,任意语言经 UTF-8 编码零 UNK;GPT-2 最终词表 50,257 = 256 字节 + 50,000 合并 + 1 个
<|endoftext|>。参见 Hugging Face 分词器综述:https://huggingface.co/docs/transformers/en/tokenizer_summary ↩︎Devlin et al., BERT 使用 WordPiece;Kudo, Subword Regularization 系统定义 Unigram LM 与概率切分。算法对照:https://huggingface.co/docs/transformers/en/tokenizer_summary ↩︎
Kudo & Richardson, SentencePiece (EMNLP 2018):直接训练原始字符流,语言无关且可逆。外部原文:https://arxiv.org/abs/1808.06226 ↩︎
Devlin et al., BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding (2018),图 2 给出输入表示相加结构;Google 官方
bert-base-uncased词表含 30,522 项。外部原文:https://arxiv.org/abs/1810.04805 / https://huggingface.co/google-bert/bert-base-uncased/blob/main/config.json ↩︎Raffel et al., Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer (JMLR 2020):T5 使用约 32K SentencePiece 词表与 sentinel token;官方配置的
vocab_size为 32,128,并共享词嵌入。外部原文:https://arxiv.org/abs/1910.10683 / https://huggingface.co/google-t5/t5-base/blob/main/config.json ↩︎Dubey et al., The Llama 3 Herd of Models;词表实现为 128,256 项,从 SentencePiece 改用 tiktoken 风格 BPE。https://arxiv.org/abs/2407.21783 ↩︎ ↩︎
Meta Llama 3 官方模型配置:
vocab_size=128256且tie_word_embeddings=false。https://huggingface.co/meta-llama/Meta-Llama-3-8B/blob/main/config.json ↩︎Yang et al., Qwen2 Technical Report (2024):byte-level BPE 含 151,643 个常规 token 与 3 个控制 token;表 1 列出各规模的词表与嵌入共享设置。外部原文:https://arxiv.org/abs/2407.10671 ↩︎
Gemma Team, Gemma 2: Improving Open Language Models at a Practical Size (2024):沿用 256K SentencePiece 词表;Google 官方 Gemma 实现记录共享嵌入与 $\sqrt d$ 缩放。外部原文:https://arxiv.org/abs/2408.00118 / https://github.com/google-deepmind/gemma ↩︎
DeepSeek-AI, DeepSeek-V3 Technical Report (2024):使用扩展 128K byte-level BPE;官方发布配置记录
vocab_size=129280。外部原文:https://arxiv.org/abs/2412.19437 / https://huggingface.co/deepseek-ai/DeepSeek-V3-Base/blob/main/config.json ↩︎OpenAI tiktoken 词表对照(kaisugi/gpt4_vocab_list):
cl100k_base(GPT-4/3.5,约 10 万)演进为o200k_base(GPT-4o,约 20 万),更大词表让中文、阿拉伯语等多语言文本用更少 token。https://github.com/kaisugi/gpt4_vocab_list ↩︎Mikolov et al., Efficient Estimation of Word Representations in Vector Space (2013):向量空间呈现线性正则性。https://arxiv.org/abs/1301.3781 ↩︎