AI大模型系列:(十二)分词(Tokenization)

2025-02-19 13:37
388
0

一、Tokenization简介

通常来说,大模型处理文本的时候会用分词算法,把字词拆分为(token),这种方式就叫做Tokenization(词元化)。它是将文本分割成更小的单元(称为token,词元或标记)的过程。

目前常用的大模型 Tokenization 算法主要有BPE、WordPiece、SentencePiece,还有Unigram之类的。

常见的大模型 Tokenization 算法:

算法 特点 代表模型
BPE 基于频率合并子词,优先合并高频字节对 GPT 系列、Llama、T5
WordPiece 类似 BPE,但合并策略基于概率(似然最大化) BERT、DistilBERT
SentencePiece 直接对原始文本分词,支持 BPE 和 Unigram,支持 Unicode PaLM、ChatGLM
Unigram 从大词表逐步删除低效词,保留概率最高的分词 XLNet、部分日语/中文模型
Dynamic Tokenization 动态调整分词策略,结合字/词混合或上下文适配 DeepSeek、百度 ERNIE、阿里通义千问、智谱AI GLM

二、Dynamic Tokenization

Dynamic Tokenization(动态分词)是一种相对创新的分词技术,它打破了传统分词方法(如字节对编码 BPE 等固定分词规则)在分词粒度上的静态性,能够根据具体的输入文本内容、上下文信息以及任务需求,动态地确定分词的方式和粒度,以更灵活、高效地将文本转换为适合模型处理的词元(Token)序列。以 DeepSeek 大模型采用的 Dynamic Tokenization 算法为例,它在训练效率上有显著提升,还结合强化学习与多词元预测等技术同时预测多个未来词元。

特点:

  • 混合分词策略:根据语言特性动态切换字(Character)和词(Word)的切分(如中文常用字词混合)。
  • 上下文感知:对同一文本在不同语境下采用不同分词方式(例如区分专业术语和通用词)。
  • 多语言自适应:对混合语种文本(中英混杂)优化分词边界。
  • 增量更新词表:针对用户输入中的新词(如网络流行语)动态扩展词表。
  • 领域自适应:在推理时根据输入文本类型(如医学论文 vs. 社交媒体)调整分词偏好。

与传统分词算法的对比

  • 传统分词算法:像字节对编码(BPE)这类传统方法,在模型训练前会基于大规模语料构建一个固定的词表,分词过程严格按照这个预定义词表进行。例如,无论遇到什么文本,它都会按照既定的规则将文本拆分成词表中的词元。这种方式在处理一些生僻词、特定领域术语或者新出现的词汇时,可能会将其拆分成多个子词元,增加了处理的复杂度和计算量。
  • Dynamic Tokenization:它不需要依赖一个固定的、预先构建好的词表。在处理文本时,会根据输入文本的实时情况动态决定如何分词。例如,对于一些具有明显语义关联的短语或者专业术语,它可以将其作为一个整体词元进行处理,而不是拆分成多个子词元,这样能够更准确地捕捉文本的语义信息,减少不必要的拆分,从而提高模型处理的效率和准确性。
特性 传统方法(BPE/WordPiece) Dynamic Tokenization
分词粒度 固定(子词/词级别) 动态调整(字、词、短语混合)
上下文依赖 无(仅依赖统计频率) 有(结合语义和上下文信息)
多语言处理 需独立词表,混合语种易出错 自适应切换语言分词策略
专业领域适配 依赖训练数据分布 动态识别领域术语(如医学、代码)
实现复杂度 简单(基于合并规则) 复杂(需结合模型推理或规则引擎)

2.1、各场景示例

1、动态粒度调整

中文场景:在字(Character)和词(Word)之间动态选择。

示例:
通用文本:"人工智能" → 拆分为 ["人工", "智能"](词级别)
诗歌/文言文:"明月几时有" → 拆分为 ["明", "月", "几", "时", "有"](字级别保留语义韵律)

混合语言场景:根据语言切换分词策略。

示例:"调用API接口" → 拆分为 ["调用", "API", "接口"](中文按词,英文保留整体)

2、上下文感知分词

基于概率模型:通过轻量级模型预测最佳分词路径。

   # 伪代码示例:上下文感知分词决策
   def dynamic_tokenize(text):
       if contains_technical_term(text):
           return technical_term_split(text)  # 专业术语优先保留
       elif is_casual_language(text):
           return character_split(text)       # 口语化文本拆分为字
       else:
           return hybrid_split(text)          # 混合策略

实体识别联动:与 NER(命名实体识别)结合,优先保留实体完整性。

示例:"在北京的Python开发者" → ["在", "北京", "的", "Python", "开发者"](“北京”作为实体不拆分)

3、混合策略引擎

多分词器并行:同时运行 BPE、WordPiece、字分词等,按置信度选择结果。

规则模板:针对特定模式(如日期、公式)强制保留完整性。

示例:"2023-12-31" → 保留为单个 token,而非拆分为 ["2023", "-", "12", "-", "31"]

三、OpenAI 的 Tokenization 算法

BPE 是一种 数据驱动的子词分词算法,核心思想是通过迭代合并高频字节对构建词表。

标准 BPE 流程如下:

  • 初始化:将文本拆分为基本单元(如 ASCII 字符)。
  • 统计频率:统计所有相邻字节对的出现频率。
  • 迭代合并:选择最高频的字节对合并为新符号,重复直到达到目标词表大小。

OpenAI 在标准 BPE 基础上进行了关键优化:

改进方向 具体实现
预分词规则 强制拆分空格为单独标记(如 "hello world" → ["hello", " world"])
Unicode 处理 将 Unicode 字符按类别分组(如中文、emoji 单独处理),避免跨语言字节对合并
特殊标记保留 显式保留换行符 \n、制表符 \t 等控制符的完整性
数字处理 对连续数字进行合并(如 "123" 可能保留为单个 token,而非拆分为 1,2,3)

OpenAI 开源了 tiktoken 库,支持不同模型的编码方案(如 cl100k_base 用于 GPT-4)。

3.1、关键处理步骤

1、文本规范化:将所有输入文本转换为 NFKC Unicode 规范化形式(兼容性分解 + 组合)。

示例:全角字符 A → 半角 A,连字符 ~ → 标准 ~。

2、预分词(Pre-tokenization):使用正则表达式将文本拆分为 可合并单元。

规则如下:

regex_pattern = r"""'(?i:[sdmt]|ll|ve|re)|[^\r\n\p{L}\p{N}]?+\p{L}+|\p{N}{1,3}| ?[^\s\p{L}\p{N}]++[\r\n]*|\s*[\r\n]|\s+(?!\S)|\s+"""

效果示例:

输入:"Hello, 世界!123"
预分词结果:["Hello", ",", " 世", "界", "!", "123"]

3、BPE 合并:根据预分词结果,按优先级合并高频字节对(优先合并字母、常见符号)。

合并规则通过预训练的词表(如 cl100k_base.tiktoken)直接加载。

4、未知字符处理:对未登录字符(如生僻字)按 字节级回退(Byte Fallback) 拆分。

示例:字符 𫠠(UTF-8 编码 F0 AB A0 A0)→ 拆分为 4 个字节 token:[0xF0, 0xAB, 0xA0, 0xA0]。

四、词表映射

词表映射是自然语言处理模型的基石,它是一个包含所有Token的列表,每个 Token 对应一个唯一的整数标识符,即 ID。ID 作为桥梁连接文本与数值计算。词表映射的过程是将文本中的每个 Token 转换为对应的 ID,使文本能够被模型处理。

4.1、BPE的词表映射

BPE 是一种分词算法,旨在将输入文本划分为子词单元。以下是其词表映射的关键点:

静态词表:

  • BPE 使用预先训练好的词表,该词表由子词单元组成。
  • 词表是静态的,在模型训练完成后不会更改。

分词过程:

  • 输入文本被分割为已知子词单元的组合。
  • 未在词表中出现的词会被分解为更小的子词单元。

优点:

  •  提高了模型对罕见词的处理能力。
  • 静态词表确保了分词过程的高效性和一致性。

4.2、动态分词的词表映射

动态分词是一种更为灵活的分词方法,其词表映射机制与 BPE 有所不同:

动态词表:

  • 动态分词根据输入文本的上下文动态调整分词方式。
  • 词表不是预先固定的,而是在处理文本时实时生成。

分词过程:

  • 模型根据输入文本的上下文信息,决定如何将词分割为子词单元。
  • 同一个词在不同的上下文中可能被分割为不同的子词单元。

优点:

  • 提高了模型的灵活性和表达能力。
  • 能够更好地适应不同上下文的语义需求。

4.3、比较

特性 BPE Dynamic Tokenization
词表示 静态词表 动态词表
分词灵活性 较低 较高
处理速度 较快 较慢
上下文适应性 较低 较高
词汇表规模 较小 较大

BPE 适合需要快速处理和稳定结果的场景,适用于实时应用。

Dynamic Tokenization 更适合需要高度灵活性和上下文适应性的场景,适用于处理多样化的文本数据。

两种方法各有优劣,选择时应根据具体需求进行权衡。

 

全部评论