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 基本步骤
- 初始化:将所有单个字符添加到词汇表
- 频繁字符组合:将频繁同时出现的字符合并为子词
- 迭代合并:不断合并最频繁的字符对
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的优势
- 灵活处理未知词汇
- 减小词汇表大小
- 捕捉词内部的语义结构
- 提高模型对罕见词和复合词的理解能力
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|>词元来简化其处理流程。