揭秘 GPT 的“识字”老师:一文读懂 BPE 分词算法 🧩

在当今的大模型时代,GPT、Llama 等 AI 模型似乎无所不知。但你是否好奇过:机器究竟是怎么“读”懂人类语言的? 其实,机器并不像我们一样按“单词”来阅读。在 AI 眼里,文本是由一个个 Token(词元) 组成的。而把文本切分成 Token 的过程,就是 分词 (Tokenization)。 今天,我们就来聊聊目前最主流、最经典的分词算法——字节对编码 (Byte-Pair Encoding, BPE)。它是如何平衡效率与灵活性的?它又是如何像搭乐高一样理解语言的? ----- 🔍 痛点:为什么要发明 BPE? 在 BPE 一统江湖之前,分词主要走两个极端,但都有明显的硬伤: ## 1. 按单词分词 (Word-level) 简单粗暴,把 "I love coding" 切分为 ['I', 'love', 'coding']。 ❌ 缺点: 英语单词千变万化(run, running, ran, runner...),词表会变得无比巨大,消耗大量内存。而且,一旦遇到没见过的词(比如 "codability"),机器就傻眼了,这就是著名的未登录词 (OOV) 问题。 ## 2. 按字符分词 (Character-level) 把 "love" 切分为 ['l', 'o', 'v', 'e']。 ❌ 缺点: 虽然词表很小(只有字母和标点),但单个字母没有语义。模型需要处理非常长的序列才能理解一个简单的词,计算负担极重。 ![](https://upload-images.jianshu.io/upload_images/25758833-60a91b32f6ac68b2.png) ## 👉 BPE 的出现,就是为了找到这两个极端中间的“黄金平衡点”。 💡 核心理念:像玩乐高一样学语言 BPE 是一种 子词 (Subword) 分词算法。它的核心思想非常朴素: ![](https://upload-images.jianshu.io/upload_images/25758833-08c04767800b355e.png) 不要死记硬背几十万个单词,也不要只看单个字母。我们要找出那些最常在一起出现的“字母组合”,把它们当成一个“新整体”。 打个比方,BPE 就像在玩 乐高积木 🧱: 一开始,我们只有最小的单块积木(基础字母)。 如果不合并,搭房子太累。 我们发现,每次搭房子都要用两个特定的单块拼在一起,用得特别频繁(比如 i 和 n 经常拼成 in)。 于是,聪明的 BPE 决定把这两个单块直接粘死,变成一个“新积木块”。 下次再用,直接拿这个新积木块就行,效率大大提高! ![](https://upload-images.jianshu.io/upload_images/25758833-eff47be47e69d269.png) 通过这种方式,BPE 构建了一个既包含基础字符,又包含常见词缀(如 "ing", "tion"),甚至完整高频词(如 "the")的词表。 --- ## 🛠️ 硬核拆解:BPE 是怎么实现的? BPE 的算法逻辑其实就是一个非常简洁的**“贪心”合并过程**。我们可以分为三步走: ![](https://upload-images.jianshu.io/upload_images/25758833-45c634b0aabcb88f.png) 第一步:初始化 (Initialization) 我们将词表初始化为语料库中所有出现过的基本字符。此时,每个单词都是被切碎的字母。 第二步:迭代合并 (The Loop) —— 这是核心! 这是一个循环过程: 统计频率: 看看哪些相邻的“字符对” (pair) 同时出现的次数最多。 找出最佳: 选出频率最高的那一对。 合并更新: 把这一对合并成一个新 Token,加入词表,并替换语料库中所有的旧组合。 第三步:重复 (Repetition) 重复第二步,一次粘合一对,直到词表大小达到我们预设的阈值。 ## 📝 案例演示:手把手教你合并 假设我们有一个迷你语料库,里面只有 4 个单词(括号内为出现次数): {"hug": 1, "pug": 1, "pun": 1, "bun": 1} 我们想构建一个大小为 10 的词表。 ![](https://upload-images.jianshu.io/upload_images/25758833-3b441d49e3b21fcd.png) 1. 初始状态 语料库切分: h u g p u g p u n b u n 初始词表(6个): ['b', 'g', 'h', 'n', 'p', 'u'] 2. 训练(合并)过程 (注:Round 3 中,由于此时语料变成了 p ug 和 p un,虽然u已经被合并进后缀了,但在具体的实现变种中,统计逻辑略有不同,这里为了演示逻辑简化处理) 🏁 最终词表 (Size 10): ['b', 'g', 'h', 'n', 'p', 'u', 'ug', 'un', 'pu', 'pug'] ## ✨ BPE 的魔力:处理没见过的词 现在,如果来了一个训练时完全没见过的词:"bug" 🐛。 ![](https://upload-images.jianshu.io/upload_images/25758833-9d1dc9a1014563c1.png) 传统 Word-level 模型会报错“Unknown Word”,但 BPE 分词器会这样处理(遵循最长匹配优先原则): 查词表:有 "bug" 吗? -> 没有。 切分尝试:有 "bu" 吗? -> 没有。 退而求其次:有 "b" 吗? -> 有! ✅ 切出 ['b'],剩余 "ug"。 查剩余部分:有 "ug" 吗? -> 有! ✅ 切出 ['ug']。 结果: "bug" 被成功切分为 ['b', 'ug']。 虽然机器没见过 "bug",但它认识 "b" 和 "ug",通过组合,它依然能理解这个词的含义!这就是 BPE 强大的泛化能力。 --- ## 总结 BPE 之所以能成为 GPT 等大模型的标配,是因为它做到了: 高效: 把常见词当成整体,序列短,算得快。 全能: 利用基础字符兜底,再生僻的词也能拼出来,彻底消灭了“不认识字”的尴尬。 下次当你和 ChatGPT 聊天时,记得它的背后,有无数个这样的积木块在飞速拼装哦!🤖 本文由[mdnice](https://mdnice.com/?platform=6)多平台发布
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容