语言模型与架构模块二 · 基本定义代码约 14 分钟
分词与词元:BPE、词表、tokenization
模型眼里没有「字」,只有 token id
学完这节你能:
- 理解 token / 词表 / token id 的关系
- 说清 BPE 为什么能兼顾「词表大小」与「未登录词」
- 会读一段最简 tokenization 代码
模型不认识汉字或字母,它只认识整数 id。把文本切成一个个「词元(token)」、再查词表映射成 id,这一步叫 tokenization。它决定了序列多长、参数多大。
为什么不用「一个字一个 token」或「一个词一个 token」
- 字级:词表小,但序列变得很长,模型要处理更多步。
- 词级:序列短,但词表爆炸,且遇到没见过的词(未登录词 OOV)就歇菜。
- 子词级(BPE 等):折中——常见词整体成一个 token,罕见词拆成子词片段,既控制词表大小,又能拼出任何词。
🔑 BPE(Byte-Pair Encoding)核心思想:从字符开始,反复把「出现最频繁的相邻符号对」合并成一个新符号,直到词表达到设定大小。高频词被合并成整体,低频词留成碎片。
▪ BPE 合并直觉
初始:l o w e r
「e r」最常见 → 合并成「er」:l o w er
「l o」常见 → 合并:lo w er …
最终常见词整体化,生僻词由子词拼出,不会 OOV。
最简 tokenization 示意(真实用 tiktoken / sentencepiece)
text = "low lower"
# 假设词表:{'low':10, 'er':11, ' ':5}
tokens = ['low', ' ', 'low', 'er'] # 分词
ids = [10, 5, 10, 11] # 查词表 → id
# 模型真正吃进去的是 ids,而不是文字自测BPE 子词分词最主要解决了什么问题?
// 带走一句话
文本 →(分词)token →(查词表)id 才进模型;BPE 用子词兼顾词表大小与未登录词。
独立练习
做到这些,才算完成本节
- 在本地运行代码,打印每个关键张量的 shape。
- 关闭示例后从空文件重写核心部分,并补一个异常或边界测试。
学习记录
记录本节阅读进度
建议先独立回答自测。读完记录不等于已经掌握。