目录
BPE(Byte Pair Encoding) 字节对编码
/  

BPE(Byte Pair Encoding) 字节对编码

BPE(Byte Pair Encoding) 字节对编码

大模型领域“出镜率”最高的算法。

BPE的核心思想:“以此类推,见缝插针” 。它通过不断合并出现牌频率最高的相邻字符,把零散的字母逐渐拼接成有意义的词根。

核心工作流程

1. BPE 的核心工作流程

假设我们有一段非常简单的语料库,里面只有几个单词(后面的数字代表这个词出现的次数):

  • hug: 10次
  • pug: 5次
  • pun: 12次
  • bun: 4次

第一步:准备基础词表

首先,把所有单词拆成最小的字符,并加上一个特殊的结束符(比如 </w>)。 此时我们的初始词表是:{h, u, g, p, n, b}

第二步:寻找“最强邻居”

我们统计所有相邻字符对出现的次数:

  • ug 组合在一起出现了:10 (hug) + 5 (pug) = 15次
  • un 组合在一起出现了:12 (pun) + 4 (bun) = 16次

结果显示,un 是最默契的邻居。

第三步:合并 (Merge)

我们将词表里的 un 合并为一个新的 Token:un。 此时词表更新为:{h, u, g, p, n, b, un}

第四步:重复迭代

重复上面的逻辑。下一次可能会发现 ug 最频繁,于是合并出 ug。再下一次,可能发现 pun 经常在一起,合并出 pun

这个过程会一直持续,直到达到你预设的词表大小(例如 50,000 个 Token)为止。


2. 为什么 BPE 这么强?

你可能会问,费这么大劲合并它们干嘛?

  1. 它能处理从未见过的词: 假设模型在训练时见过 lower,但没见过 lower。由于 BPE 把 lower 拆成了 low + er,模型依然能通过这两个零件猜出它的意思。
  2. 效率极高: 常用的词(如 "the", "of")会被合并成一个 Token,节省计算资源;不常用的词被拆分,保证不丢信息。

3. BPE 的一个进阶变体:BBPE (Byte-level BPE)

你在看论文或文档时,可能会看到 BBPE(如 GPT-2/3, Llama 使用的)。

  • 普通 BPE: 基于 Unicode 字符。但全世界字符太多了(各种表情包、各国语言),词表还是会很大。

  • BBPE: 直接在 字节(Byte) 级别上运行。任何文本在计算机里都是 256 个基础字节中的组合。

  • 优势: 词表底座更小(只需 256 个字节起步),却能极其完美地覆盖全球所有语言,甚至包括代码里的特殊符号,而且绝对不会出现无法识别的符号 ([UNK])

    OOV 问题 Out Of Vocabulary 如果用户输入一个字典里没有的新词,模型会直接报错,标记为 [UNK](未知词)


标题:BPE(Byte Pair Encoding) 字节对编码
作者:gitsilence
地址:https://blog.lacknb.cn/articles/2025/12/27/1766812241447.html