BPE (字节对编码):篇 1

#2026/01/01 #ai

提示词:

重新讲述:"2.5 BPE"
要求:
1. 请以更利于程序员理解的方式来表达(比如更多的代码)
2. 所使用代码说明,代码中多添加注释(如果注释是英文的,转成中文)
3. 代码执行结果尽量完整打印出来,和源代码区分开
4. 尽量多说人话,多举例,好理解
5. 不要丢失原文信息
6. 更结构化的表达

目录

1. BPE是什么?

BPE(Byte Pair Encoding)是一种先进的文本分词技术,能够将单词智能地拆分成子词或字符,是GPT-2、GPT-3等大语言模型的核心分词方法。

2. BPE的工作原理

2.1 基本步骤

  1. 初始化:将所有单个字符添加到词汇表
  2. 频繁字符组合:将频繁同时出现的字符合并为子词
  3. 迭代合并:不断合并最频繁的字符对

3. 代码实现示例

代码参考 ch02/02/test_tiktoken.py

import tiktoken  

# 使用tiktoken库实现BPE分词  
def demonstrate_bpe():  
    # 实例化GPT-2的BPE分词器  
    tokenizer = tiktoken.get_encoding("gpt2")  
    
    # 测试不同类型的文本  
    test_texts = [  
        "Hello world",                 # 常规文本  
        "machine_learning",             # 带下划线的词  
        "someunknownPlace",             # 未登录词  
        "data-preprocessing"            # 复杂组合词  
    ]  
    
    for text in test_texts:  
        print(f"\n原始文本: {text}")  
        
        # 编码为词元ID  
        token_ids = tokenizer.encode(text)  
        print(f"词元ID: {token_ids}")  
        
        # 解码回文本  
        decoded_text = tokenizer.decode(token_ids)  
        print(f"解码文本: {decoded_text}")  

# 运行演示  
demonstrate_bpe()  

打印结果

原始文本: Hello world  
词元ID: [15496, 995]  
解码文本: Hello world  

原始文本: machine_learning  
词元ID: [4408, 20763]  
解码文本: machine_learning  

原始文本: someunknownPlace  
词元ID: [8250, 18250, 8812]  
解码文本: someunknownPlace  

原始文本: data-preprocessing  
词元ID: [4065, 12, 22048, 8677]  
解码文本: data-preprocessing  

解码单个 token ID 得到对应的文本 ,使用 tokenizer.decode_single_token_bytes

# 解码单个 token ID 得到对应的文本  
token_text = tokenizer.decode_single_token_bytes(token_id).decode('utf-8', errors='replace')

4. BPE的详细拆分机制

4.1 字符合并示例

# 展示BPE如何处理复杂单词  
complex_words = ["unbelievable", "preprocessing", "tensorflow"]  

for word in complex_words:  
    # 使用BPE分词器拆分单词  
    subwords = tokenizer.encode(word)  
    print(f"{word} 拆分为: {subwords}")  

5. BPE的优势

  1. 灵活处理未知词汇
  2. 减小词汇表大小
  3. 捕捉词内部的语义结构
  4. 提高模型对罕见词和复合词的理解能力

6. 实际应用案例

6.1 未知词处理

# 处理未登录词  
unknown_word = "someunknownPlace"  
subwords = tokenizer.encode(unknown_word)  
print(f"未知词 {unknown_word} 的子词拆分: {subwords}")  
未知词 someunknownPlace 的子词拆分: [8250, 18250, 8812]  

7. BPE的局限性

• 计算复杂度较高
• 需要预先确定词汇表大小
• 可能过度拆分某些单词

结语

BPE就像是一个聪明的“文字切割师“,能够智能地将单词拆分,让大语言模型更好地理解文本的内部结构!

拆分的粒度,最小的颗粒度

补充说明

值得注意的是,GPT模型使用的分词器并不依赖特殊词元,而是仅使用<|endoftext|>词元来简化其处理流程。