1. 大语言模型如何“识字”?——分词器与BPE算法深度解析
作为一名长期从事自然语言处理开发的工程师,我经常遇到这样的困惑:为什么同一个问题,换个问法模型就能给出完全不同的答案?为什么简单的数学运算模型会频频出错?经过多次实践和调试,我发现这些问题的根源往往不在模型本身,而在于一个最基础却最容易被忽视的环节——分词(Tokenization)。
1.1 为什么分词如此重要?
在计算机的世界里,所有信息最终都以数字形式存在。当我们输入"你好"或"Hello"时,大模型看到的其实是一串数字序列。将人类可读的文本转换为模型可理解的数字序列的过程,就是分词。
注意:分词质量直接影响模型的理解能力。一个糟糕的分词方案可能导致模型无法正确理解最简单的指令。
早期的自然语言处理系统主要采用两种简单的分词策略:
-
按词分词(Word-based):直接用空格分割文本。例如"Hello world"会被分成["Hello", "world"]。
问题在于英语有大量词形变化(如run/runs/ran/running),如果每个变体都作为独立token存储,词表会变得极其庞大。更严重的是,遇到训练时没见过的单词(OOV问题),模型将完全无法处理。
-
按字符分词(Character-based):将文本拆分成单个字符。例如"Hello"变成["H","e","l","l","o"]。
这种方式虽然解决了OOV问题,但单个字符通常没有独立语义,模型需要从零学习如何组合字符形成有意义的单词,训练效率极低。
1.2 现代解决方案:子词分词(Subword Tokenization)
现代大模型(如GPT、Llama)普遍采用子词分词,它完美平衡了上述两种方法的优缺点。核心思想是:
- 常见词保留为完整token(如"the"、"apple")
- 生僻词拆分为有意义的子词(如"unhappiness"→"un"+"happy"+"ness")
这种策略既控制了词表大小,又保证了语义完整性。目前主流的子词分词算法有三种:
- BPE(Byte-Pair Encoding):GPT系列采用,基于频率统计的合并策略
- WordPiece:BERT采用,基于语言模型概率的合并策略
- **Se
