大家在刚开始接触大模型的时候会不会有一个疑惑,为什么在部署各大厂开发的大模型的时候都需要在创建model类之前先创建一个tokenizer;还有就是从modelscope和huggingface上下载下载的模型权重文件中为什么会包含tokenizer.json\covab.json这样的文件呢?

       其实,创建的tokenizer这个对象就是分词器,而tokenizer.json\covab.json文件就是创建分词器对象的配置文件(包括分词规则定义和词汇表);那分词器是什么?它是做什么用的呢?接下来我们就一起认识一下分词器工具。

一、介绍

       分词器(Tokenizer)是自然语言处理(NLP)中的一项关键技术,主要用于将文本分割成更小的单元(称为“token”)。这些单元可以是单词、子词、字符甚至单个字。分词器在大语言模型(LLM)中起着至关重要的作用,因为它是将原始文本转换为模型可理解的输入形式的第一步;简单一句话,分词器就是将输入的文本信息进行数字编码,方便机器识别。

二、分词过程

       分词器的核心任务是将一段连续的文本拆分为离散的单元序列。具体过程如下:

  1. 预处理:对输入文本进行清理,例如去除标点符号、转小写等。
  2. 分词规则匹配:根据预先训练好的词汇表(vocabulary),将文本划分为一系列token。
  3. 映射到ID:将每个token映射为一个唯一的整数ID,用于模型的输入。

三、分词器的算法类别

3.1 BPE(Byte Pair Encoding)

1. 核心思想

BPE 是一种无监督的子词分割算法,其核心思想是通过统计字符对的频率,逐步合并高频字符对来生成词汇表。它能够在单词级别和字符级别之间找到一个平衡点,从而有效地处理未知词汇(out-of-vocabulary, OOV)问题。

2. 原理
  • 初始化:将文本中的每个单词拆分为单个字符,并在单词末尾添加一个特殊标记(如 </w>)表示单词边界。
  • 统计频率:计算所有相邻字符对的出现频率。
  • 合并操作:选择频率最高的字符对进行合并,并更新词汇表。
  • 迭代:重复上述步骤,直到达到预设的词汇表大小或满足其他终止条件。
3. 示例

假设输入文本为 "low lowest newer newest"

  1. 初始化为字符级序列:['l', 'o', 'w', '</w>', 'l', 'o', 'w', 'e', 's', 't', '</w>', ...]
  2. 统计字符对频率,发现 ('l', 'o') 出现最频繁,于是将其合并为 'lo'
  3. 更新词汇表并重新拆分文本,继续迭代。

最终生成的词汇表可能包含:['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"

  1. 初始化为字符级序列:['p', 'l', 'a', 'y', '##i', '##n', '##g', '</w>', ...]
  2. 统计字符对频率,发现 ('p', 'l') 出现最频繁,且能覆盖更多数据,于是将其合并为 'pl'
  3. 更新词汇表并重新拆分文本,继续迭代。

最终生成的词汇表可能包含:['play', '##ing', '##ed', '</w>']

4. 优点
  • 更加高效地利用词汇表空间。
  • 更好地处理未知词汇。
5. 缺点
  • 训练过程较复杂,需要额外的优化目标。
  • 仍然依赖预定义的词汇表大小。

3.3 SentencePiece

1. 核心思想

SentencePiece 是一种更通用的分词方法,支持跨语言和多语言场景。它的核心思想是将分词任务视为一种无监督学习问题,直接从原始文本中学习子词单元,而无需区分单词边界。

2. 原理
  • 无监督学习:基于 BPE 或 Unigram Language Model(ULM)算法,直接从字符级序列中学习子词单元。
  • 跨语言支持:不依赖特定语言的单词边界标记(如空格),适用于多种语言混合的场景。
  • 训练过程
    1. 将文本拆分为字符级序列。
    2. 使用 BPE 或 ULM 算法生成子词单元。
    3. 构建统一的词汇表。
3. 优点
  • 支持多语言和跨语言场景。
  • 不依赖单词边界标记,灵活性更高。
  • 适合构建统一的语言模型。
4. 缺点
  • 训练时间较长,尤其在多语言场景下。
  • 可能会生成较多冗余的子词单元。

3.4 对比总结

特性/算法 BPE WordPiece SentencePiece
核心思想 字符对合并 最大化词汇表覆盖率 无监督学习,跨语言支持
应用场景 单语言任务 BERT 等预训练模型 多语言任务
优点 动态扩展词汇表 更高效利用词汇表 支持多语言,灵活性高
缺点 低频字符对可能导致冗余 训练复杂 训练时间长

四、分词器作用 

  1. 文本结构化:将非结构化的文本数据转化为结构化的token序列。
  2. 降低复杂度:通过将文本分解为较小单元,减少模型处理的难度。
  3. 支持多语言:一些高级分词器能够支持多种语言的混合处理。
  4. 提升效率:优化模型输入,使其更适合神经网络的计算需求。

五、总结

       最后,我们再用通俗的话总结一下它的流程:

       1)输入语言文本给分词器;

       2)分词器拿到文本信息,根据具体的分词算法(例如:BPE)将文本划分为单个的词元(token);

       3)根据对应的词汇表将每个词元对应唯一编码(token ID);

       4)分词器输出这些唯一编码给Embeding词嵌入模型;(到这里分词器的输入任务就完成了

       5)词嵌入模型将token ID映射到固定维度的语义空间,生成语义特征张量;

       6)将语义特征张量添加位置索引等信息后送入transformer模块进行推理;

       7)大模型推理输出预测token的概率分布,反向映射回token ID;

       8)根据词汇表找到token ID对应的词元;

       9)根据词分割算法规则进行词元拼接,返回输出的语言文本;(到这里分词器的输出任务就完成了,整个一轮推理也就结束了

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐