大模型组件:分词器(tokenizer)
最后,我们再用通俗的话总结一下它的流程:1)输入语言文本给分词器;2)分词器拿到文本信息,根据具体的分词算法(例如:BPE)将文本划分为单个的词元(token);3)根据对应的词汇表将每个词元对应唯一编码(token ID);4)分词器输出这些唯一编码给Embeding词嵌入模型;到这里分词器的输入任务就完成了5)词嵌入模型将token ID映射到固定维度的语义空间,生成语义特征张量;6)将语义特

大家在刚开始接触大模型的时候会不会有一个疑惑,为什么在部署各大厂开发的大模型的时候都需要在创建model类之前先创建一个tokenizer;还有就是从modelscope和huggingface上下载下载的模型权重文件中为什么会包含tokenizer.json\covab.json这样的文件呢?
其实,创建的tokenizer这个对象就是分词器,而tokenizer.json\covab.json文件就是创建分词器对象的配置文件(包括分词规则定义和词汇表);那分词器是什么?它是做什么用的呢?接下来我们就一起认识一下分词器工具。
一、介绍
分词器(Tokenizer)是自然语言处理(NLP)中的一项关键技术,主要用于将文本分割成更小的单元(称为“token”)。这些单元可以是单词、子词、字符甚至单个字。分词器在大语言模型(LLM)中起着至关重要的作用,因为它是将原始文本转换为模型可理解的输入形式的第一步;简单一句话,分词器就是将输入的文本信息进行数字编码,方便机器识别。
二、分词过程
分词器的核心任务是将一段连续的文本拆分为离散的单元序列。具体过程如下:
- 预处理:对输入文本进行清理,例如去除标点符号、转小写等。
- 分词规则匹配:根据预先训练好的词汇表(vocabulary),将文本划分为一系列token。
- 映射到ID:将每个token映射为一个唯一的整数ID,用于模型的输入。
三、分词器的算法类别
3.1 BPE(Byte Pair Encoding)
1. 核心思想
BPE 是一种无监督的子词分割算法,其核心思想是通过统计字符对的频率,逐步合并高频字符对来生成词汇表。它能够在单词级别和字符级别之间找到一个平衡点,从而有效地处理未知词汇(out-of-vocabulary, OOV)问题。
2. 原理
- 初始化:将文本中的每个单词拆分为单个字符,并在单词末尾添加一个特殊标记(如
</w>)表示单词边界。 - 统计频率:计算所有相邻字符对的出现频率。
- 合并操作:选择频率最高的字符对进行合并,并更新词汇表。
- 迭代:重复上述步骤,直到达到预设的词汇表大小或满足其他终止条件。
3. 示例
假设输入文本为 "low lowest newer newest":
- 初始化为字符级序列:
['l', 'o', 'w', '</w>', 'l', 'o', 'w', 'e', 's', 't', '</w>', ...] - 统计字符对频率,发现
('l', 'o')出现最频繁,于是将其合并为'lo'。 - 更新词汇表并重新拆分文本,继续迭代。
最终生成的词汇表可能包含:['lo', 'w', 'e', 'st', 'ne', 'r', '</w>']。
4. 优点
- 能够动态扩展词汇表,适应新词汇。
- 在字符和单词之间找到平衡,减少词汇表大小。
5. 缺点
- 对于低频字符对,可能会生成不必要的合并规则。
- 需要手动调整词汇表大小。
3.2 WordPiece
1. 核心思想
WordPiece 是 BPE 的改进版本,广泛应用于 Google 的 BERT 模型中。它的核心思想与 BPE 类似,但引入了“最大化词汇表覆盖率”的优化目标,使得每次合并时优先选择能够覆盖更多数据的字符对。
2. 原理
- 初始化:与 BPE 相同,将文本拆分为字符级序列。
- 统计频率:计算字符对的出现频率。
- 合并操作:选择能够最大化词汇表覆盖率的字符对进行合并。
- 迭代:重复上述步骤,直到达到预设的词汇表大小。
3. 示例
假设输入文本为 "playing plays played playing":
- 初始化为字符级序列:
['p', 'l', 'a', 'y', '##i', '##n', '##g', '</w>', ...] - 统计字符对频率,发现
('p', 'l')出现最频繁,且能覆盖更多数据,于是将其合并为'pl'。 - 更新词汇表并重新拆分文本,继续迭代。
最终生成的词汇表可能包含:['play', '##ing', '##ed', '</w>']。
4. 优点
- 更加高效地利用词汇表空间。
- 更好地处理未知词汇。
5. 缺点
- 训练过程较复杂,需要额外的优化目标。
- 仍然依赖预定义的词汇表大小。
3.3 SentencePiece
1. 核心思想
SentencePiece 是一种更通用的分词方法,支持跨语言和多语言场景。它的核心思想是将分词任务视为一种无监督学习问题,直接从原始文本中学习子词单元,而无需区分单词边界。
2. 原理
- 无监督学习:基于 BPE 或 Unigram Language Model(ULM)算法,直接从字符级序列中学习子词单元。
- 跨语言支持:不依赖特定语言的单词边界标记(如空格),适用于多种语言混合的场景。
- 训练过程:
- 将文本拆分为字符级序列。
- 使用 BPE 或 ULM 算法生成子词单元。
- 构建统一的词汇表。
3. 优点
- 支持多语言和跨语言场景。
- 不依赖单词边界标记,灵活性更高。
- 适合构建统一的语言模型。
4. 缺点
- 训练时间较长,尤其在多语言场景下。
- 可能会生成较多冗余的子词单元。
3.4 对比总结
| 特性/算法 | BPE | WordPiece | SentencePiece |
|---|---|---|---|
| 核心思想 | 字符对合并 | 最大化词汇表覆盖率 | 无监督学习,跨语言支持 |
| 应用场景 | 单语言任务 | BERT 等预训练模型 | 多语言任务 |
| 优点 | 动态扩展词汇表 | 更高效利用词汇表 | 支持多语言,灵活性高 |
| 缺点 | 低频字符对可能导致冗余 | 训练复杂 | 训练时间长 |
四、分词器作用
- 文本结构化:将非结构化的文本数据转化为结构化的token序列。
- 降低复杂度:通过将文本分解为较小单元,减少模型处理的难度。
- 支持多语言:一些高级分词器能够支持多种语言的混合处理。
- 提升效率:优化模型输入,使其更适合神经网络的计算需求。
五、总结
最后,我们再用通俗的话总结一下它的流程:
1)输入语言文本给分词器;
2)分词器拿到文本信息,根据具体的分词算法(例如:BPE)将文本划分为单个的词元(token);
3)根据对应的词汇表将每个词元对应唯一编码(token ID);
4)分词器输出这些唯一编码给Embeding词嵌入模型;(到这里分词器的输入任务就完成了)
5)词嵌入模型将token ID映射到固定维度的语义空间,生成语义特征张量;
6)将语义特征张量添加位置索引等信息后送入transformer模块进行推理;
7)大模型推理输出预测token的概率分布,反向映射回token ID;
8)根据词汇表找到token ID对应的词元;
9)根据词分割算法规则进行词元拼接,返回输出的语言文本;(到这里分词器的输出任务就完成了,整个一轮推理也就结束了)
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐

所有评论(0)