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

文本先被切成 token,再经编号与嵌入查表成为 Transformer 可计算的向量序列。
图 1 文本的离散化与向量化链路。教程综合图;分词器确定序列粒度与编号,嵌入矩阵再把离散 id 映射为 Transformer 可计算的连续向量。

一、问题的提出:以什么为单位切分文本#

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 × 5lower × 2newest × 6widest × 3词尾记号 </w> 使初始化后的 low 写作 l o w </w>;乘数记录词频,并与符号重复次数区分。

状态本轮计算为什么得到该结果
$t=0$$C_0(e,s)=6+3=9$newest 出现 6 次、widest 出现 3 次,两词各含一次 e s
第一次更新e s → ese s 属于最高频对;若与其他频次为 9 的对并列,训练器按固定规则破除平局。
$t=1$$C_1(es,t)=6+3=9$上一轮使两个词都出现 es t,加权次数仍是 $6+3$。
第二次更新es t → est新符号 est 同时进入 newestwidest,成为可跨词复用的片段。
后续分支$C(l,o)=5+2=7$lowlower 各含一次 l o,故加权次数为 $5+2$,随后可形成 lolow

完整状态流图 2图中每一行把左侧符号状态与右侧计数或更新公式对齐,读者可以从输入逐轮复算输出。

BPE 反复合并最高频相邻单元,最终得到可跨词复用的子词。
图 2 BPE 的迭代合并过程。教程综合图;左侧自上而下展示语料、频次、两轮合并与跨词复用,右侧同行给出定义、公式和结果。

继续迭代:下一轮可合并 est + </w> → est</w>;另一条高频链会执行 l + o → lolo + 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 的语言无关训练框架。

路线代表模型合并 / 切分准则特点
BPEGPT-2、Llama 3、RoBERTa合并最高频的相邻对贪心、确定、实现简单
WordPieceBERT按合并后的语料似然增益选择符号对统计最优,切分带 ## 前缀标续接
Unigram LMALBERT、T5(经 SentencePiece)从一个大词表出发,按似然裁剪掉贡献小的子词能给出多种切分的概率、可采样(子词正则化)

WordPieceBERT 广泛使用;Unigram 与 SentencePiece的系统定义见 Kudo 与 Richardson 201834

选型取决于所需性质:追求确定、简单实现时常用 BPE;需要概率切分与子词正则化时可用 Unigram;无空格语言可借助 SentencePiece 直接训练原始字符流。

主流模型如何落地这些路线#

完整复现分词器需要算法与配置共同参与实际实现参数包括初始字母表、规范化规则、预分词规则、词表大小、特殊 token 和编码时的规则顺序;下表列出来源公开且可核验的设置。

模型家族分词技术与关键参数特殊设置在架构中的位置与来源对应示例
BERT Base / LargeWordPiece,英文 uncased 词表 30,522## 标记词内续接,并使用 [CLS][SEP][MASK]token id 先进入 token、segment 与 position 三类嵌入之和,再送入编码器;见 BERT 图 2 与官方词表5单句分类形如 [CLS] a dog runs [SEP];掩码预测把目标位置写成 [MASK]
T5SentencePiece Unigram,基础词表约 32K,配置维度为 32,128文本到文本任务使用额外 sentinel token 表示被遮盖片段token id 进入共享输入嵌入,编码器、解码器与输出投影复用词表接口;见 T5 与官方配置6翻译输入形如 translate English to German: house;跨度去噪用 <extra_id_0> 占据被遮盖片段。
Llama 3tiktoken 风格 byte-level BPE,词表 128,256对话模板增加 BOS、EOS、EOT 与角色头 tokentoken id 经 128256 × d 输入嵌入进入 decoder-only Transformer;输出语言模型头使用独立权重78对话从 <|begin_of_text|> 开始;每轮消息以角色头开场并由 <|eot_id|> 收束。
Qwen2 / Qwen2.5byte-level BPE,151,643 个常规 token 加 3 个控制 token,总计 151,646全系列共用词表;Qwen2 小模型共享输入输出嵌入,7B 及以上使用独立输出权重输入嵌入位于 decoder 主干之前,输出 LM head 位于其后;参数表见 Qwen2 技术报告 表 19Qwen2-0.5B 与 1.5B 复用输入输出嵌入;Qwen2-7B 与 72B 为输入嵌入和 LM head 分配独立参数。
Gemma 2SentencePiece,词表 256K保留 Gemma 词表以覆盖多语言和代码输入与输出嵌入共享,嵌入向量在进入 Transformer 前乘以 $\sqrt d$;见 Gemma 2 与官方实现10一个 256K × d 权重矩阵同时承担输入查表与输出分类;查表向量乘 $\sqrt d$ 后进入首个 Transformer 层。
DeepSeek-V3byte-level BPE,技术报告记为扩展 128K 词表使用专用特殊 token;公开配置的 vocab_size129,280,包含实现层保留项token id 经输入嵌入进入 MLA 与 DeepSeekMoE 主干;分词器设置见 DeepSeek-V3 技术报告11加载公开权重时按 129,280 行创建词表相关张量;中文、英文与代码统一先编码为 byte-level BPE id。

架构上的共同点是分词器运行在神经网络之外,输出整数 id;嵌入层才是模型参数的一部分。完整输入协议由算法、词表、控制 token 与共享权重策略共同确定。

五、词表大小:序列长度与嵌入参数量的权衡#

词表大小 $V$ 是离散 token 集合的基数,它在序列压缩率与 $V\times d$ 的嵌入和输出参数之间形成权衡。

词表像一本快捷短语表条目数量的权衡是条目越多,句子越短,但词典占用的存储和训练样本越多。

模型演进持续重估这项权衡,具体规模如下表。

模型年份分词器词表大小
GPT-22019byte-level BPE50,257
Llama 1 / 22023SentencePiece (BPE)32,000
Llama 32024tiktoken 风格 BPE128,256
GPT-4 / 3.52023tiktoken cl100k_base≈ 100,000
GPT-4o2024tiktoken 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_baseo200k_base 是其内置的两套词表(后缀 _base 指基础词表)。Llama 3 的tiktoken 风格指其采用了同一套高效字节级 BPE 的实现思路,而非直接使用 OpenAI 的词表;各家词表仍为各自独立训练。

六、分词的结构性限制:一个根源与四类失败#

Token 是模型直接观测的最小离散单位。凡任务依赖 token 内部的字符、数位或空白结构,分词都会引入结构性困难。

论文证据Tokenization counts 使用逗号强制从右向左切分同一道加法题,使数位边界与 token 边界重新对齐,结果见图 3

同一道加法题采用从左到右和逗号强制从右到左两种分词方式时,GPT-3.5 与 GPT-4 的准确率对比。
图 3 数位对齐改变算术准确率。引自 Singh 与 Strouse 2024 年《Tokenization counts》图 1,CC BY 4.0;从右向左分词使 GPT-3.5 与 GPT-4 在该实验中的准确率分别由 75.6% 和 84.4% 提升至 97.8% 和 98.9%。

实验结论:分词会向模型注入归纳偏置,边界对齐方式直接改变任务难度。

四类失败共享一个观测边界,只是分别显现在数位、字符、语言成本和代码空白符上。

共同根源:模型直接观测 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

TokenFlow 通过语义编码器与像素编码器、双码本和共享映射生成统一视觉 token,再分别支持语义对齐、图像重建与下游任务。
图 4 统一视觉 tokenizer 的双码本结构。引自 Qu 等 2025 年《TokenFlow》图 2,CC BY 4.0;共享映射让语义码本与像素码本使用同一索引,同时服务理解与生成。

多模态约束是离散索引既要压缩输入,又要保留不同粒度的信息,才能同时支持理解与生成。

小结#

  • 文本进入模型前先被切分为 subword token,兼顾了词级切分会产生 OOV 与字符级切分序列过长的两种失效
  • BPE 从字符或字节起步、贪心合并最高频对以学习词表,字节级 BPE 消除了编码失败,并使空格成为词的组成部分
  • 词表大小是序列长度与嵌入矩阵参数量之间的权衡,其规模从 GPT-2 的 50K 增至 GPT-4o 的 200K
  • 由于 token 是模型的最小观测粒度,数字算术、字符计数、多语言成本与代码缩进等需要看清 token 内部的任务会系统性失败
  • 每个 token id 经嵌入矩阵查表得到向量,语义相似对应几何距离,但查表仅给出静态起点,真正的上下文理解由下一节的注意力机制完成

上一节1.1 · 什么是大语言模型下一节1.3 · 注意力与 Transformer本章总览第 1 章 · 大模型基础

参考文献#


  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.07909https://aclanthology.org/P16-1162/ ↩︎

  2. 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 ↩︎

  3. Devlin et al., BERT 使用 WordPiece;Kudo, Subword Regularization 系统定义 Unigram LM 与概率切分。算法对照:https://huggingface.co/docs/transformers/en/tokenizer_summary ↩︎

  4. Kudo & Richardson, SentencePiece (EMNLP 2018):直接训练原始字符流,语言无关且可逆。外部原文:https://arxiv.org/abs/1808.06226 ↩︎

  5. 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.04805https://huggingface.co/google-bert/bert-base-uncased/blob/main/config.json ↩︎

  6. 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.10683https://huggingface.co/google-t5/t5-base/blob/main/config.json ↩︎

  7. Dubey et al., The Llama 3 Herd of Models;词表实现为 128,256 项,从 SentencePiece 改用 tiktoken 风格 BPE。https://arxiv.org/abs/2407.21783 ↩︎ ↩︎

  8. Meta Llama 3 官方模型配置:vocab_size=128256tie_word_embeddings=falsehttps://huggingface.co/meta-llama/Meta-Llama-3-8B/blob/main/config.json ↩︎

  9. Yang et al., Qwen2 Technical Report (2024):byte-level BPE 含 151,643 个常规 token 与 3 个控制 token;表 1 列出各规模的词表与嵌入共享设置。外部原文:https://arxiv.org/abs/2407.10671 ↩︎

  10. Gemma Team, Gemma 2: Improving Open Language Models at a Practical Size (2024):沿用 256K SentencePiece 词表;Google 官方 Gemma 实现记录共享嵌入与 $\sqrt d$ 缩放。外部原文:https://arxiv.org/abs/2408.00118https://github.com/google-deepmind/gemma ↩︎

  11. DeepSeek-AI, DeepSeek-V3 Technical Report (2024):使用扩展 128K byte-level BPE;官方发布配置记录 vocab_size=129280。外部原文:https://arxiv.org/abs/2412.19437https://huggingface.co/deepseek-ai/DeepSeek-V3-Base/blob/main/config.json ↩︎

  12. 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 ↩︎

  13. Mikolov et al., Efficient Estimation of Word Representations in Vector Space (2013):向量空间呈现线性正则性。https://arxiv.org/abs/1301.3781 ↩︎