在大语言模型(LLM)日益普及的今天,我们往往关注模型的参数、结构和预训练数据,但实际上,支撑这些模型顺利理解和生成语言的一个重要环节——Tokenizer,常常被人忽视。本文将带你了解大模型中 Tokenizer 的基本概念、常见技术以及它在模型性能和效率中的关键作用,同时力求既不流于表面,也不陷入晦涩难懂的技术细节。

token 和 Tokenizer 是什么?

简单来说,Tokenizer 就是将连续的文本拆分成模型能处理的基本单位——Token 的工具,而 “token” 是模型理解和生成文本的最小单位。对于计算机来说,处理原始文本是非常困难的,因此我们需要一个中间层,把文字转换为一系列的数字序列(即,一个个离散的 token),这些 token 既可以是单个字符、词语,也可以是子词(subword)。而这个转换过程正是由 Tokenizer 完成的。

在传统的自然语言处理中,我们可能直接按照单词或字符来分割文本;而在大模型中,常见的方法则是采用子词级别(subword-level)的分割方式。这种方式既能保证足够细致(能够捕捉到拼写变化、罕见词等信息),又不会使得词表过大,进而影响模型的效率和泛化能力。

在中文中,token 通常是单个汉字(或者在某些情况下是常见词汇)。

在英文中,token 通常是一个词或单词的一部分,平均而言大约 4 个字符或 0.75 个单词,但具体拆分方式依赖于采用的 tokenizer 算法。

Tokenizer 的主要方法

目前大模型常用的 Tokenizer 方法主要包括:

Byte-Pair Encoding (BPE)

BPE 是目前最流行的子词分词算法之一。其核心思想是:从最基本的字符开始,不断将在训练语料中频繁共现的字符或子串合并为一个新的 Token,直到达到预设的词表大小。这种方式能够灵活处理词汇稀缺问题,同时对英文这种单词之间有明显分隔的语言效果很好。

SentencePiece

SentencePiece 算法则不依赖于空格分词,适合处理中文、日文等没有明显分词边界的语言。它同样采用子词或字节级别的编码方式,保证了不同语言之间的一致性。由于其不依赖传统分词规则,因此在多语种模型中得到了广泛应用。

其他创新方法

近年来,随着大模型规模的不断扩大和应用领域的拓展,关于如何更好地进行 Tokenization 的研究也不断涌现。例如,有学者提出结合认知科学“最省力原则”构建更高效的 Tokenizer;也有工作探讨利用自适应的“Learn Your Tokens”策略,根据输入自动学习最优的分词单元。尽管这些方法尚处于探索阶段,但都表明 Tokenizer 的设计对模型的最终性能具有不容忽视的影响。

Tokenizer 对大模型的影响

模型训练效率

在大模型的训练过程中,Tokenizer 决定了输入序列的长度和词表大小。分词粒度过细(例如仅按字符分割)虽然能覆盖所有细节,但会导致序列变得冗长,使得 Transformer 中自注意力机制的计算复杂度呈平方级增长,从而大大增加训练时间和资源消耗;而分词粒度过粗(直接按单词分割)又可能无法有效处理罕见词或新词。因此,子词分词方法(如 BPE 和 SentencePiece)正好在二者之间取得了平衡,不仅能减少序列长度,还能保持语义信息。

模型效果与泛化能力

一个精心设计的 Tokenizer 不仅有助于训练速度,还能提升模型在下游任务中的表现。良好的 Tokenizer 能够保证同一语义在不同上下文下尽量映射到相似的 Token 序列,从而使模型更容易捕捉到语言中的规律和细微差别。反之,不合理的分词方式可能会使模型“误解”文本信息,导致输出不连贯甚至产生幻觉。

多语言和特殊场景

对于多语言大模型来说,如何构造一个既能覆盖英文又能适应中文、日文等其他语言的 Tokenizer,是一个具有挑战性的问题。研究表明,多语种 Tokenizer 往往需要更大的词表来处理不同语言的字符和词汇,但词表过大又可能影响模型效率。因此,如何在覆盖率与高效性之间取得平衡,是 Tokenizer 设计的重要课题。

此外,在特定领域(如医疗、金融等)的应用中,预先调整或扩充特定领域的词汇也能显著提升模型的领域适应性。这一做法在微调阶段非常常见,也是 Tokenizer 定制化的重要方向。

当前顶尖大模型所采用的 Tokenizer 方法与词典大小

闭源模型

ModelTokenizer 方法词典大小备注
GPT‑3修改版 BPE~50,000采用类似 GPT‑2 的 Byte‑Pair Encoding(BPE);具体细节未全面公开。
GPT‑4修改版 BPE(推测)~50,000?内部实现与 GPT‑3 类似,但细节未公开。
Claude可能采用 SentencePiece未公开Anthropic 未公开具体细节,词典规模可能在 40k~60k 范围。
Google Bard可能采用 SentencePiece未公开细节未公开,词典规模及分词策略目前仅有推测。
  • 通常采用改良版的 BPE(Byte-Pair Encoding)或 SentencePiece 技术。
  • 对于英语文本,这类模型的词汇表一般在 40k~50k 左右,因为英语单词结构相对简单,使用较小词表即可有效覆盖。
  • 闭源模型细节不公开,但业内普遍认为这种设计可以在保证生成流畅度的同时,兼顾计算效率。

注:闭源模型的具体分词细节往往属于商业机密,上述数字仅为业界普遍猜测。

开源模型

ModelTokenizer 方法词典大小备注
LLaMA 1/2Byte-level BPE(类似 GPT‑2 的分词方案)32,000LLaMA 系列采用标准的 byte‑level BPE。
LLaMA 3Byte-level BPE(大概率延续 LLaMA 系列策略)~32,000*具体数字未全面公开,设计上与前代保持一致。
ChatGLM定制分词器(基于 SentencePiece 改进)~64,000针对中英混合场景优化,词表较大以覆盖中文细粒度信息。
Baichuan‑7B典型 SentencePiece(或类似 BPE 算法)~32,000多数开源中文大模型常用 32k 左右的词表。
Qwen2SentencePiece 为主(支持多语种)151,643社区调研数据显示,Qwen2 采用了较大词表以覆盖多语种。
GLMSentencePiece(或基于 BPE 的改进方案)151,329与 Qwen2 类似,词表规模较大,适合中文及多语种训练。
MistralBPE(标准实现)32,000词典规模较小,侧重于高效轻量。
LLaMA 3 (另一个版本)Byte-level BPE128,000部分社区版本中有报道 LLaMA 3 的词表扩充到 128k(设计多样化)
Yi(未公开详细方法,但通常基于 SentencePiece)64,000社区整理数据中显示 Yi 模型词典约 64k。
MiniMind自定义 Tokenizer(为了极致轻量化设计)6,400为降低整体模型参数量,MiniMind 选择了较小词表。
  • LLaMA 系列:常采用 byte-level BPE,词汇表规模大多为 32k 或 32k 左右。这种方法能够处理未知词(out-of-vocabulary)问题,同时保留低级字节信息。
  • ChatGLM 与 Qwen/GLM:为了更好地适应中文以及多语种场景,这些模型往往选择更大的词汇表(有时超过 150k),以细粒度捕捉中文字符和子词信息,确保语义表达更准确。
  • 轻量化模型(如 MiniMind):为了降低模型整体参数量和内存占用,部分模型可能采用较小的词汇表(如 6,400),这种设计在特定应用场景下能够达到较高的效率,但也可能导致对生僻词的覆盖不足。

*备注:LLaMA 3 词典大小在不同版本中可能有所差异。

最后

Tokenizer 和 token 是大语言模型中一块不可或缺的基石。Tokenizer 不仅影响着模型训练的速度和资源消耗,更对模型的理解和生成能力起到了至关重要的作用。通过采用子词分词技术,合理平衡分词粒度与词表大小,大模型能够更高效地捕捉语言规律,提高下游任务的效果。