token
# Token 是什么
LLM 处理文本的最小单位,不是字也不是词。
- 一个 token 可能是完整单词、单词的一部分、或标点
- 例:
understanding→under+standing(2 个 token) - 英文:1 单词 ≈ 1~1.5 token;中文:1 汉字 ≈ 1~2 token
为什么用 token 而不是词:
- 减少词汇表大小
- 能处理未知词(组合子词)
- 跨语言效率高
处理流程:
文本 → 分词(tokenize) → 映射为数字ID → 输入模型
模型输出 → 预测下一个token ID → 转回文本
1
2
2
# BPE 算法
Byte Pair Encoding,基于统计的分词算法,GPT 系列广泛使用。
核心思想:迭代合并最频繁出现的字符对,构建词汇表。
步骤:
- 所有文本分解为单个字符
- 统计相邻字符对频率
- 合并最高频字符对为新子词
- 重复直到达到目标词汇表大小
示例:
初始: l o w / l o w e r / n e w e s t / w i d e s t
合并 es: l o w / l o w e r / n e w es t / w i d es t
...继续迭代
1
2
3
2
3
优势:
- 处理未知词(子词组合)
- 平衡词汇表大小与语义表示
- 捕捉常见模式(
ing、ed等后缀) - 跨语言适用
# pad_token 报错解决
# 错误信息
Asking to pad but the tokenizer does not have a padding token.
1
# 原因
批量处理时需要把不等长序列填充到相同长度,但 tokenizer 没有设置 pad_token。GPT-2 等模型默认没有 pad_token。
句子A: [Hello, world] → 长度2
句子B: [Hi] → 长度1
需统一: [Hello, world, PAD] / [Hi, PAD, PAD]
1
2
3
2
3
# 解决方法
方法一(推荐):用已有的 eos_token 当 pad_token
tokenizer.pad_token = tokenizer.eos_token
1
方法二:添加新的 pad token
tokenizer.add_special_tokens({'pad_token': '[PAD]'})
model.resize_token_embeddings(len(tokenizer)) # 模型也要 resize
1
2
2
# 检查
print(tokenizer.pad_token) # None 就是没设置
print(tokenizer.special_tokens_map)
1
2
2
上次更新: 2026/09/10, 20:52:09