分词与 Token
# 分词与 Token
概念入口见 LLM 基础,模型加载见 Hugging Face。
# Token 是什么
LLM 处理文本的最小单位,不是字也不是词。
- 一个 token 可能是完整单词、单词的一部分、标点或字节片段。
- 同一个词在不同 tokenizer、位置或空白条件下,可能得到不同切分。
- 使用目标模型的 tokenizer 实测,不把固定的“单词/汉字换算比例”当作通用规则。
参考:Transformers 分词算法说明 (opens new window)。
为什么用 token 而不是词:
- 减少词汇表大小
- 能处理未知词(组合子词)
- 跨语言效率高
处理流程:
文本 → 分词(tokenize) → 映射为数字ID → 输入模型
模型输出 → 预测下一个token ID → 转回文本
1
2
2
# BPE 算法
Byte Pair Encoding,基于统计的分词算法,GPT 系列广泛使用。
核心思想:迭代合并高频相邻符号对,构建词汇表。下列字符级例子便于说明合并过程,实际实现还可能使用字节级初始符号和预分词规则。参见 Hugging Face BPE 说明 (opens new window)。
步骤:
- 所有文本分解为单个字符
- 统计相邻字符对频率
- 合并最高频字符对为新子词
- 重复直到达到目标词汇表大小
示例:
初始: 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/10/18, 22:14:48