大语言模型基础-通俗理解分词
上文介绍了语言,文字和建模(大语言模型基础篇-先搞懂语言、文字及建模是什么),从中可以了解到计算机,包括运行大模型的GPU/CPU,本质上无法直接直接理解和处理人类原始的文本字符串。它们只能处理数字。我们必须找到一种方法,将文本字符串转换为模型能够“消化”的数字序列,而分词在这个过程中起到“编码”作用,是整个自然语言处理流程的基石。
分词(Tokenization)是什么?
分词就是将一段自然语言(如中文、英文)文本,切分成一系列更小的、有意义的单元的过程。这些小的单元被称为令牌(Token)。
- 对于英文:令牌可以是单词(如 "apple" )、子词(如 "un" 、 "##able" ),甚至是标点符号(如 "!" ),具体取决于任务需求。例如, "I don't like apples!" 可能被分词为 ["I", "don", "'", "t", "like", "apples", "!"] 。
- 对于中文:由于中文没有空格分隔,分词更为关键。例如, “我喜欢吃苹果” 可能被分词为 [“我”, “喜欢”, “吃”, “苹果”] 。
这些令牌随后会被模型通过一个“词典”映射成唯一的数字ID,最终变成一串数字向量,模型才能进行处理。
分词为什么至关重要?
分词不仅仅是一个简单的“切词”步骤,它承担着以下几个关键作用:
1. 桥梁作用:连接人类语言与机器数字世界
这是最根本的作用。神经网络和Transformer架构本质上是巨大的数学函数,它们处理的是高维空间中的向量和数字,而不是字符。分词器(Tokenizer)就是将人类可读的文本转换为模型可读的数字序列的翻译官。这样,文本就变成了一个数字序列,可以直接输入给模型的嵌入层,转换为向量进行后续计算。
- 输入: “I love natural language processing!”
- 分词后: [“I”, “love”, “natural”, “language”, “processing”, “!”] (不同的分词器结果可能不同)
- 转换为ID: [101, 2052, 3010, 2651, 100, 102] (示例数字,非真实值)
2. 控制输入维度与计算效率
模型的输入长度是固定的(例如2048个token)。如果以“字符”为单位,序列会变得非常长(尤其对于中文,一个句子就有几十个字符),导致计算量巨大。以“词”或“子词”为单位,可以显著缩短序列长度,提高计算效率。
- 例子:句子 “这是一个强大的模型” 。
- 字符级:会被切成 [“这”, “是”, “一”, “个”, “强”, “大”, “的”, “模”, “型”] → 9个单元。
- 词级:可能被切成 [“这是”, “一个”, “强大”, “的”, “模型”] → 5个单元。序列更短,模型处理更快。
3. 平衡词汇表规模与语义粒度(核心优势)
这是在“词”和“字符”两种极端方案之间的一个完美折衷,也是现代大模型成功的关键之一。
- 词级别分词的问题:
- 词汇表爆炸:语言中的词汇是无限的,新词、专有名词、拼写错误会不断出现。如果每个词都分配一个ID,词汇表会变得无比庞大,难以管理。
- 未知词(OOV)问题:遇到词汇表中没有的词,模型就束手无策了,通常只能用一个 [UNK] (unknown)令牌代替,导致信息丢失。
- 字符级别分词的问题:
- 序列过长:如前所述,计算效率低。
- 语义缺失:单个字符(如英文字母 ‘a’ 或汉字 ‘机’ )通常不携带明确的语义,模型需要从更长的序列中重新学习组合语义,训练难度大大增加。
- 子词分词(Subword Tokenization):现代大模型(如BERT、GPT系列)普遍采用的方案。它完美解决了以上两个问题。
- 原理:将单词拆分成更常见的、有意义的子部分。
- 好处:
- 解决未知词:即使遇到新词 "ChatGPTism" ,模型也可以根据学到的子词将其分解为 ["Chat", "G", "PT", "ism"] 来处理,而不会变成 [UNK] 。
- 共享语义:词根、词缀等子词可以在不同单词间共享。例如, "playing" , "played" , "player" 都可以共享子词 "play" ,这意味着模型学到的 “play” 的语义可以被所有这些词利用,极大地提升了学习效率。
- 控制词汇表大小:我们可以预先设定一个想要的词汇表大小(如50,000),算法(如Byte-Pair Encoding, WordPiece)会自动根据语料库统计信息,选择最常出现的子词组合来构建这个大小的词汇表。
4. 处理多语言和混合文本
- 多语言:对于中文、日文等没有空格分隔的语言,分词是必不可少的。例如,句子“我爱机器学习”需要被正确切分成 [“我”, “爱”, “机器”, “学习”] 而不是错误的 [“我爱”, “机器”, “学习”] 。
- 拼写错误与变体:即使单词有轻微的拼写错误(如“awwwwesome”)或不同形式(如“Tokenizer” vs. “tokenization”),分词器也有可能通过子词分解来近似处理,增强了模型的鲁棒性。
5. 影响模型的计算和内存消耗(性能因素)
- 序列的长度直接决定了模型计算量(注意力机制的计算复杂度是序列长度的平方)。更高效的分词(在相同文本下产生更少的令牌)可以显著加快训练和推理速度,并降低内存占用。
- 例如,一个句子用字符编码可能需要100个令牌,用单词编码可能需要20个,而用子词分词可能只需要15个。子词方案在序列长度和语义丰富度之间取得了最佳平衡。
常用分词方法都有哪些?
不同的分词策略直接影响模型的性能、多语言支持能力与计算效率。本文将介绍几种主流的分词方法,并分别从核心优势、主要局限和典型应用场景三个方面进行解析。
1. 规则分词(Rule-based Tokenization)
基本概念
基于预定义的规则(如空格、标点、换行符等)对文本进行分割。
核心优势
- 简单易实现,无需训练;
- 可解释性强,规则明确。
主要局限
- 无法处理未登录词(OOV);
- 对中文、日文等无空格语言不友好;
- 分词粒度粗糙,语义单元可能被切分。
典型场景
- 早期文本处理系统;
- 预处理阶段的初步分词;
- 配合词典使用的规则增强型分词(如最大匹配法)。
2. 字符分词(Character Tokenization)
基本概念
将每个字符(包括字母、数字、符号等)作为一个独立的 token。
核心优势
- 不存在OOV问题;
- 词汇表极小(通常不超过1000个token);
- 适合形态丰富的语言(如芬兰语、土耳其语)。
主要局限
- 序列长度急剧增长,计算效率低;
- 语义表示稀疏,模型难以捕捉词义;
- 训练和推理速度慢。
典型场景
- 小规模模型或资源受限环境;
- 处理极端多语言或罕见语言;
- 字符级任务(如拼写纠正、命名实体识别),如中文手写识别(需精确到字符)、低资源语言处理(词汇量有限时)。
3.词级分词
词级分词以“单词”为基本单元拆分文本。例如,英语句子“She likes reading”拆分为[“She”, “likes”, “reading”];中文句子“机器学习很有趣”拆分为[“机器”, “学习”, “很”, “有趣”]。
核心优势:
语义完整性:单词是天然的语义单元(如“学习”直接表达动作),模型更容易捕捉词间逻辑关系(如“机器”与“学习”的修饰关系)。
计算效率高:相同文本的词级序列长度通常是字符级的1/3-1/5,显著降低模型运算成本。
主要局限:
OOV问题突出:遇到新词(如网络热词“内卷”)或专业术语(如“Transformer”)时,模型会生成“未知token(UNK)”,丢失关键信息。
词汇表膨胀:英语常用词约10万个,若包含领域术语(如医学、法律),词汇表可能突破百万,增加模型存储压力。
典型场景:
传统机器翻译(依赖固定词表)、关键词检索(需精确匹配单词)。
4. 子词分词(Subword Tokenization)
基本概念
将词拆分为更小的、有意义的子词单元,平衡字符与词级别的表示,是当前大模型的主流选择。
主要算法:
4.1字节对编码(BPE, Byte Pair Encoding)
基本概念:
BPE 是一种数据压缩技术,后被引入自然语言处理中用于分词。其核心思想是逐步合并最频繁出现的字节对(或字符对),直到达到预设的词表大小。
示例:
- 初始词汇: "low", "lower", "newest", "widest"
- 统计字符对频率: lo 、 ow 、 we 、 es 、 st 等
- 合并最频繁的对(如 es → es ),形成新符号
- 重复合并,直到词表达到预定大小
应用场景:
- GPT 系列、RoBERTa 等模型使用 BPE 进行分词
- 适用于英语、德语等字母语言
4.2字节级BPE(Byte-level BPE)
基本概念:
字节级BPE 是 BPE 的一种变体,以字节为单位进行合并,而不是字符。这样可以避免未知字符(UNK)问题,因为所有文本都可以用256个字节表示。
示例:
- 将文本转换为 UTF-8 字节序列
- 对字节序列进行 BPE 合并
- 例如: "hello" → [104, 101, 108, 108, 111] → 进一步合并高频字节对
应用场景:
- GPT-2、GPT-3 使用字节级BPE
- 尤其适合多语言、代码、符号混合的文本
4.3WordPiece 分词
基本概念
WordPiece 是一种子词分词算法,通过逐步合并具有高互信息得分的字符对来构建词表。其核心思想是基于概率紧密程度(而非单纯频率)生成有意义的子词单元,有效平衡词汇粒度与语义表达。
示例
- 输入句子: "playing together"
- 分词结果: ["play", "##ing", "to", "##gether"]
- 处理生僻词(如 "unaffable" ):可能分解为 ["un", "##aff", "##able"] ,避免未知词(OOV)问题。
核心优势
- 显著减少未登录词(OOV);
- 词表大小适中,兼顾效率与语义;
- 擅长捕捉词法结构(如时态、派生词)。
主要局限
- 依赖训练语料质量;
- 可能割裂语义单元;
- 仍需处理极端生僻词。
应用场景
- BERT系列模型(如原始BERT、RoBERTa);
- 多语言文本处理(共享子词跨语言);
- 搜索与问答系统(容错用户输入变体)。
4.4 SentencePiece
基本概念:
SentencePiece 是一个开源分词工具,将文本视为原始字节流,无需预分词(如空格分割),支持 BPE 和 Unigram 两种算法。它可以直接从原始文本学习分词模型。
示例:
- 输入: "Hello world!"
- 输出可能为: ["▁He", "llo", "▁world", "!"]
- ▁ 表示空格(space symbol)
应用场景:
- 多语言模型(如 mBERT、T5)
- 处理没有空格的语言(如中文、日文)
- 语音识别、机器翻译
4.5 单元语法(Unigram Language Model)
基本概念:
Unigram 分词基于统计语言模型,假设每个词的出现是独立的。它通过最大化句子的似然概率来选择最佳分词方式。
示例:
- 给定句子: "我喜欢机器学习"
- 可能的分词:
- ["我", "喜欢", "机器学习"]
- ["我", "喜欢", "机器", "学习"]
- 选择概率最大的分词结果
应用场景:
- 与 SentencePiece 结合使用(如 ALBERT、XLNet)
- 日语、韩语等语言处理
- 信息检索、文本生成
分词算法对比
|
算法 |
特点 |
适用场景 |
|---|---|---|
|
BPE |
合并高频字符对 |
英语、德语等字母语言 |
|
Byte-level BPE |
字节级合并,无UNK |
多语言、代码、符号文本 |
|
SentencePiece |
无需预分词,支持多种算法 |
多语言、无空格语言 |
|
Unigram |
基于概率最大化分词 |
日语、韩语、复杂语言结构 |
总结
分词虽微,却是大模型理解世界的“原子”,其切分方式直接影响着模型的认知边界。
当下之道,在于“适配”而非“最优”:BPE重效率,WordPiece重语义,SentencePiece重通用。
未来已来,下一分词范式将是动态的、有感知的、多模态的。它不再仅仅是拆分文本,而是理解意图的开始。当我们为模型构建更优秀的语言基石时,也是在为通往更通用的人工智能铺设一条更坚实的道路。
更多推荐


所有评论(0)