
大模型领域“出镜率”最高的算法。
BPE的核心思想:“以此类推,见缝插针” 。它通过不断合并出现牌频率最高的相邻字符,把零散的字母逐渐拼接成有意义的词根。
假设我们有一段非常简单的语料库,里面只有几个单词(后面的数字代表这个词出现的次数):
hug: 10次pug: 5次pun: 12次bun: 4次首先,把所有单词拆成最小的字符,并加上一个特殊的结束符(比如 </w>)。 此时我们的初始词表是:{h, u, g, p, n, b}。
我们统计所有相邻字符对出现的次数:
u 和 g 组合在一起出现了:10 (hug) + 5 (pug) = 15次u 和 n 组合在一起出现了:12 (pun) + 4 (bun) = 16次结果显示,u 和 n 是最默契的邻居。
我们将词表里的 u 和 n 合并为一个新的 Token:un。 此时词表更新为:{h, u, g, p, n, b, un}。
重复上面的逻辑。下一次可能会发现 u 和 g 最频繁,于是合并出 ug。再下一次,可能发现 p 和 un 经常在一起,合并出 pun。
这个过程会一直持续,直到达到你预设的词表大小(例如 50,000 个 Token)为止。
你可能会问,费这么大劲合并它们干嘛?
low 和 er,但没见过 lower。由于 BPE 把 lower 拆成了 low + er,模型依然能通过这两个零件猜出它的意思。你在看论文或文档时,可能会看到 BBPE(如 GPT-2/3, Llama 使用的)。
普通 BPE: 基于 Unicode 字符。但全世界字符太多了(各种表情包、各国语言),词表还是会很大。
BBPE: 直接在 字节(Byte) 级别上运行。任何文本在计算机里都是 256 个基础字节中的组合。
优势: 词表底座更小(只需 256 个字节起步),却能极其完美地覆盖全球所有语言,甚至包括代码里的特殊符号,而且绝对不会出现无法识别的符号 ([UNK])。
OOV 问题 Out Of Vocabulary 如果用户输入一个字典里没有的新词,模型会直接报错,标记为 [UNK](未知词)