Tokenization
Tokenization(分词)
Section titled “Tokenization(分词)”Tokenization 是把原始文本转换成模型能理解的数字序列的过程。看似简单,实则影响模型的一切行为。
为什么重要?
Section titled “为什么重要?”同一个意思,不同切分方式会让模型”看到”完全不同的东西:
"我喜欢吃苹果" → ["我", "喜欢", "吃", "苹果"] # 词级别"unbelievable" → ["un", "believe", "able"] # 子词级别"Hello world!" → ["Hello", " world", "!"] # BPE主流方法:BPE
Section titled “主流方法:BPE”BPE(Byte Pair Encoding)是 GPT 系列使用的分词算法:
- 从字符级别开始
- 统计相邻 token 对的频率
- 合并最高频的 token 对
- 重复直到达到目标词表大小
from transformers import AutoTokenizer
# GPT-2 的分词器tokenizer = AutoTokenizer.from_pretrained("gpt2")
text = "The Transformer architecture revolutionized AI."
# 编码tokens = tokenizer.encode(text)print(f"Token IDs: {tokens}")print(f"Token 数量: {len(tokens)}")
# 解码回文本decoded = tokenizer.decode(tokens)print(f"解码: {decoded}")
# 查看每个 tokenfor tid in tokens: print(f" {tid:>5} → '{tokenizer.decode([tid])}'")输出示例:
Token IDs: [464, 24589, 7352, 20588, 9552, 13]Token 数量: 6解码: The Transformer architecture revolutionized AI.
464 → 'The' 24589 → ' Transformer' 7352 → ' architecture' 20588 → ' revolutionized' 9552 → ' AI' 13 → '.'不同分词器对比
Section titled “不同分词器对比”from transformers import AutoTokenizer
text = "Let's tokenize: AI isn't easy, but it's worth it! 🚀"
for name in ["gpt2", "bert-base-uncased", "t5-small"]: tok = AutoTokenizer.from_pretrained(name) ids = tok.encode(text) print(f"\n{name}: {len(ids)} tokens") print([tok.decode([t]) for t in ids])分词器的”坑”
Section titled “分词器的”坑””# 1. 数字处理不稳定tokenizer = AutoTokenizer.from_pretrained("gpt2")print(tokenizer.encode("2024")) # [3879]print(tokenizer.encode("2025")) # [3879, 362] ← 不同长度!
# 2. 大小写敏感print(tokenizer.encode("hello")) # [31373]print(tokenizer.encode("Hello")) # [15496]
# 3. 空白字符占 tokentext = "Hello world"print(f"字符数: {len(text)}")print(f"Token 数: {len(tokenizer.encode(text))}")- 词表大小:GPT-4 约 100K tokens,Llama 约 32K
- 特殊 token:
<|endoftext|>(分隔)、<|user|>(对话角色) - 中文分词:中文 tokenizer 通常 1-2 个汉字构成一个 token,效率低于英文