明天你会感谢今天奋力拼搏的你。
ヾ(o◕∀◕)ノヾ
通常来说,大模型处理文本的时候会用分词算法,把字词拆分为(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(动态分词)是一种相对创新的分词技术,它打破了传统分词方法(如字节对编码 BPE 等固定分词规则)在分词粒度上的静态性,能够根据具体的输入文本内容、上下文信息以及任务需求,动态地确定分词的方式和粒度,以更灵活、高效地将文本转换为适合模型处理的词元(Token)序列。以 DeepSeek 大模型采用的 Dynamic Tokenization 算法为例,它在训练效率上有显著提升,还结合强化学习与多词元预测等技术同时预测多个未来词元。
特点:
与传统分词算法的对比
| 特性 | 传统方法(BPE/WordPiece) | Dynamic Tokenization |
|---|---|---|
| 分词粒度 | 固定(子词/词级别) | 动态调整(字、词、短语混合) |
| 上下文依赖 | 无(仅依赖统计频率) | 有(结合语义和上下文信息) |
| 多语言处理 | 需独立词表,混合语种易出错 | 自适应切换语言分词策略 |
| 专业领域适配 | 依赖训练数据分布 | 动态识别领域术语(如医学、代码) |
| 实现复杂度 | 简单(基于合并规则) | 复杂(需结合模型推理或规则引擎) |
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"]
BPE 是一种 数据驱动的子词分词算法,核心思想是通过迭代合并高频字节对构建词表。
标准 BPE 流程如下:
OpenAI 在标准 BPE 基础上进行了关键优化:
| 改进方向 | 具体实现 |
|---|---|
| 预分词规则 | 强制拆分空格为单独标记(如 "hello world" → ["hello", " world"]) |
| Unicode 处理 | 将 Unicode 字符按类别分组(如中文、emoji 单独处理),避免跨语言字节对合并 |
| 特殊标记保留 | 显式保留换行符 \n、制表符 \t 等控制符的完整性 |
| 数字处理 | 对连续数字进行合并(如 "123" 可能保留为单个 token,而非拆分为 1,2,3) |
OpenAI 开源了 tiktoken 库,支持不同模型的编码方案(如 cl100k_base 用于 GPT-4)。
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,使文本能够被模型处理。
BPE 是一种分词算法,旨在将输入文本划分为子词单元。以下是其词表映射的关键点:
静态词表:
分词过程:
优点:
动态分词是一种更为灵活的分词方法,其词表映射机制与 BPE 有所不同:
动态词表:
分词过程:
优点:
| 特性 | BPE | Dynamic Tokenization |
|---|---|---|
| 词表示 | 静态词表 | 动态词表 |
| 分词灵活性 | 较低 | 较高 |
| 处理速度 | 较快 | 较慢 |
| 上下文适应性 | 较低 | 较高 |
| 词汇表规模 | 较小 | 较大 |
BPE 适合需要快速处理和稳定结果的场景,适用于实时应用。
Dynamic Tokenization 更适合需要高度灵活性和上下文适应性的场景,适用于处理多样化的文本数据。
两种方法各有优劣,选择时应根据具体需求进行权衡。
全部评论