Tokenization
分词会将文本、图像或音频拆分为模型映射到嵌入向量的词元。内容涵盖 BPE 等子词方法、图像块和词元成本。
分词是将原始输入转换为一系列token的步骤;token 是模型读取的离散单位,每个 token 都会从固定词汇表中获得一个整数 ID。文本分词器会将“The bus stopped.”转换成 4 个 ID,模型会为每个 ID 查找一个嵌入向量,因此分词器决定了大型语言模型(LLM)将什么视为一个单位。token 也是模型上下文窗口、推理延迟、文本生成和 API 定价所使用的单位。同一概念也适用于文本以外的内容:视觉 Transformer(ViT)会将图像分割成图块,而语音模型会将音频分割成短帧。
子词分词的工作原理#
早期自然语言处理(NLP)会按空格和标点拆分文本,这会导致罕见词和新词不在词汇表中;而按字符分词又会让序列变得很长。现代 Transformer使用子词分词器,将常见词保留为完整词,并将罕见词拆分成可重复使用的片段。Sennrich 等人于 2015 年将字节对编码(BPE)改用于机器翻译,这种算法会从训练语料中学习词汇表:它从单个字符或字节开始,不断将出现频率最高的相邻词对合并为新 token,直到词汇表达到目标大小。对新文本进行编码时,则会按顺序重放学习到的合并规则。
自 GPT-2起使用的字节级 BPE 从 256 种可能的字节值开始,因此任何字符串、表情符号或源文件都可以编码,无需使用未知 token。其他算法选择片段的方式有所不同。用于 BERT的 WordPiece 会合并最能提高训练数据似然的词对;Google SentencePiece库中的 Unigram 方法则从大型候选词汇表开始并逐步精简,将空格视为普通符号,因此同一个分词器也能处理不使用空格书写的语言。词汇表规模随着时间推移不断扩大:BERT 使用 30,522 个 token,GPT-2 和 GPT-3使用 50,257 个,Llama 3 使用 128,256 个,而 OpenAI 的 o200k_base 使用约 200,000 个。OpenAI 的 tiktoken库对比了其中最早和最新的两种词汇表:
import tiktoken
# Byte-level BPE vocabularies from GPT-2 (2019) and GPT-4o (2024)
for name in ["gpt2", "o200k_base"]:
encoding = tiktoken.get_encoding(name)
print(f"{name}: {encoding.n_vocab:,} tokens in the vocabulary")
for text in ["Ultralytics YOLO26 detects buses.", "バスが止まった。"]:
ids = encoding.encode(text)
# Decode each ID on its own to see where the tokenizer split the text
pieces = [encoding.decode([i]) for i in ids]
print(f" {len(ids)} tokens: {pieces}")GPT-2 的词汇表需要用 11 个 token 表示这个英文句子,并将“Ultralytics”拆分为 Ult、ral、y和 tics;而 o200k_base 只需要 9 个 token。对于日语句子“the bus stopped”,GPT-2 需要 9 个 token,并将字符 止 拆成两个字节级 token;这两个 token 单独解码时都会变成替换字符 �,而 o200k_base 只需要 7 个 token。
分词与相关术语的区别#
- Token: 分词产生的单位,例如词、子词、字节、图像块或音频帧。
- 嵌入: 模型根据每个 token ID 查找的学习向量;这些向量与网络的其余部分一起训练,而词汇表由分词器预先确定。
- 经典 NLP 中的词语切分: spaCy 和 NLTK 等库会将文本切分成词语和标点,用于句法分析和标注;之后通常还会进行词干提取或词形还原,以便开展语言学分析。
- 数据安全中的令牌化:在支付和数据保护领域,令牌化会用随机替代值替换敏感值(例如银行卡号),并将替代值存储在受保护的保险库中。
令牌数量为何重要#
对于英文文本,OpenAI 的分词器平均每个令牌约对应四个字符,但其他语言和代码所需的令牌可能多得多。Petrov 等人(2023)发现,同一段文本翻译成不同语言后,分词长度最多可相差 15 倍,这会增加 API 成本,并缩小这些语言可用的上下文长度。令牌边界也会影响模型能看到的内容。如果 LLM 将“strawberry”读作几个多字母令牌,它就无法直接看到其中的字母;而 o200k_base 会将“3.14159”拆分为 3、.、141 和 59,这会增加按数字位进行运算的难度。Meta 的 Byte Latent Transformer 等无分词器设计会根据下一个字节的可预测性,将原始字节分组为不同大小的块,从而避免使用固定词汇表。
图像、音频和视频的令牌化#
ViT 会将图像切分为固定大小的图块,因此,使用 16×16 像素图块时,224×224 图像会变成 196 个图块令牌。每个图块会先展平,再线性投影为嵌入,然后进行自注意力计算。视觉语言模型(VLMs)会将图块嵌入与文本令牌一起传给 LLM,因此图像分辨率越高,每个请求包含的令牌就越多。图像生成器通常改用离散视觉令牌:向量量化码本会将每个图块替换为最近代码向量的 ID,使视觉自回归模型能够像生成文本一样逐个令牌生成图像;而令牌合并会合并相似令牌,减少长图像和视频序列中的令牌数量。
视觉模型也会对文本进行令牌化。当 YOLOE-26 通过 set_classes 接收类别名称时,Ultralytics 会使用 CLIP 的字节级 BPE 分词器处理每个名称,将长度填充或截断至 77 个令牌;随后,Apple 的 MobileCLIP2 文本编码器会将结果转换为嵌入,供检测头与图像区域进行匹配。在语音识别中,OpenAI 的 Whisper 会将每个 30 秒音频窗口转换为对数梅尔频谱帧,再由其编码器将这些帧作为包含 1,500 个位置的序列进行处理。










