【科普】大模型中常说的 token 和 Tokenizer 是指什么?
在大语言模型(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 设计的重要课题。...