1. 文本分词的底层逻辑与挑战
在大语言模型处理文本时,第一步永远是将原始字符序列转化为模型能够理解的数字表示。这个看似简单的预处理步骤,实际上直接影响着模型处理语义的能力、训练效率和推理性能。为什么我们不能直接用字符或单词作为基本处理单元?这需要从计算语言学和大模型训练的实际需求两个维度来理解。
字符级分词的致命缺陷在于信息密度过低。以英文为例,把"transformer"拆解为12个字母(t-r-a-n-s-f-o-r-m-e-r),模型需要处理12个离散单元才能表达一个完整概念。这不仅使序列长度暴增(导致注意力计算复杂度呈平方级增长),更迫使模型在多个时间步后才能捕获完整语义。中文情况更极端,"自然语言处理"五个字需要拆解为15-20个字节(UTF-8编码),模型必须学习复杂的字节组合模式才能理解基本词汇。
单词级分词则面临词汇表爆炸问题。牛津英语词典收录超过17万个单词,实际语料中的词汇量可能达到百万级。如果为每个单词分配独立token,会导致:
- 嵌入层参数膨胀(假设词向量维度为4096,100万词汇表需要4GB存储)
- 长尾词训练不充分(生僻词可能只在训练集中出现几次)
- 无法处理未登录词(OOV),遇到"ChatGPT"等新词时只能统一映射为[UNK]
关键洞见:好的分词方案应该在信息密度和语义粒度间取得平衡。既不能像字符级那样过于碎片化,也不能像单词级那样僵化。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 子词分词的工程实现
2.1 BPE算法核心原理
字节对编码(BPE)通过统计学习自动发现最优子词组合。其核心是迭代合并高频字符对的过程:
- 初始化词汇表为256个字节(覆盖所有UTF-8字符)
- 扫描全部训练语料,统计所有相邻字节对的出现频率
- 将最高频的字节对合并为新token加入词汇表
- 重复步骤2-3直到词表达到预设大小(如50K)
以"lowest"和"newer"两个词为例:
- 初始状态:l o w e s t / n e w e r
- 第一轮合并:最高频的"e"+"s"→"es"(出现在"lowes+t"和"newe+r")
- 第二轮合并:"es"+"t"→"est"
- 最终可能得到:"low"+"est"和"new"+"er"
这种自底向上的合并策略,能自动识别英语中的常见词缀(如"-ing"
