当前位置: 首页 > ds >正文

BPE(Byte Pair Encoding)分词算法

下面是对 BPE(Byte Pair Encoding)分词算法的深入介绍,涵盖其背景、原理、实现细节、数学机制、优缺点以及在自然语言处理中的实际应用。


一、背景与动机

在自然语言处理中,模型输入通常需要被转换为数值序列,而这首先需要将文本拆分为可处理的最小单元。传统的分词策略有三类:

  1. 词级分词(Word-level Tokenization):容易出现 OOV(Out-of-Vocabulary)问题;

  2. 字符级分词(Character-level Tokenization):过于细碎,序列长度太长;

  3. 子词级分词(Subword-level Tokenization):在这两者之间取得平衡,BPE 就属于这一类。

BPE 分词的核心思想是:通过数据驱动的方法找出最常见的字符组合,以此构建词汇表,使模型既能处理高频词,又能组合出低频词或新词。


二、BPE 的起源

最早的 BPE 是一种用于数据压缩的算法,由 Philip Gage 在 1994 年提出。它的原始用途是用频繁的字节对替换为一个新符号,从而减少文件大小。

2016 年,Sennrich 等人将其引入自然语言处理,用于构建子词单元,从而提升神经机器翻译的效果(论文标题为 "Neural Machine Translation of Rare Words with Subword Units")。


三、BPE 分词算法的核心思想

BPE 是一个基于统计的、贪心的合并策略,其核心思想是:

不断合并训练语料中出现频率最高的符号对(symbol pair)为新符号,直到达到预定词表大小或合并次数。

这些“符号”最初是字符,随着合并的进行,可能变成字符组合。


四、BPE 的详细算法流程

输入:

  • 语料(文本数据)

  • 目标词汇表大小(或最大合并次数)

步骤:

第一步:初始化

将所有词语按字符划分,每个词结尾添加一个特殊终止符,如 </w>,以区分词边界。例如:

"low"    → l o w </w>
"lower"  → l o w e r </w>
"newest" → n e w e s t </w>

每个词都被拆成字符序列,并统计出现频率。


第二步:统计字符对频率

遍历整个词表,统计每个相邻字符(或子词)对出现的总次数。

例如:

"l o w </w>":字符对 ("l", "o")、("o", "w")、("w", "</w>")

将这些字符对及其频率记录下来。


第三步:合并频率最高的字符对

找出出现频率最高的字符对(如 "o w"),并将其视为一个新子词 "ow"。

例如:

"l o w </w>" → "l ow </w>"
"l o w e r </w>" → "l ow e r </w>"

更新词表,替换所有出现该字符对的地方。


第四步:重复步骤 2~3

继续统计新的子词对频率,并合并频率最高的一对,直到达到指定的合并次数或词表大小为止。


第五步:构建最终词表

在所有合并步骤中出现过的子词都可以构成词表(vocabulary),用于编码文本。


举个简化例子:

给定词频如下:

low: 5
lowest: 2
newest: 6
newer: 3

初始化分词(添加 </w>):

l o w </w>      ×5
l o w e s t </w>×2
n e w e s t </w>×6
n e w e r </w>  ×3

第一轮统计所有字符对频率,如 ("e", "s") 出现频率最高 → 合并为 "es"

继续合并 → ("es", "t") → "est" → ("n", "e") → "ne"……

直到构建出子词如:

"low", "new", "est", "er", "ne", "er", "lowest", "newest"

这样,无论是高频词(如 newest)还是低频词(如 newer),都能被拆解成已知子词。


五、BPE 分词的编码与解码

编码:

编码时,BPE 会根据训练生成的子词词表,用最长匹配的策略将输入词切分为子词组合。

比如输入词 newer

  • 子词词表有:newer

  • 输出:new er

若词表没有 newer 但有 newer,则输出:n e w er

解码:

将子词逐个拼接回原始词,如果有 </w> 终止符,就表示到一个词的结尾。


六、BPE 的优点与缺点

优点:

  1. 处理 OOV(未登录词)能力强:所有词都可以拆成子词,模型不会因不认识词而出错。

  2. 词表大小可控:相比整词级分词,词表更小,占用内存更少。

  3. 训练速度快,易于实现

  4. 子词建模兼顾精细性与语义性,保留了一定的语言结构信息。

缺点:

  1. 合并操作是贪心策略,非全局最优

  2. 同一个词可能被拆分成不同子词序列,影响一致性(尤其在跨语料中)

  3. 不会考虑上下文:合并是基于频率的,无法根据语境灵活调整。


七、BPE 与其他分词算法对比

方法OOV处理词表大小序列长度是否上下文相关
Word-level
Char-level
BPE
Unigram LM更灵活
SentencePiece更健壮


八、在实际系统中的应用

1. HuggingFace Transformers

HuggingFace 的 tokenizers 库中提供了 ByteLevelBPETokenizer,被 GPT-2 和 RoBERTa 等模型使用。

2. SentencePiece + BPE 模式

Google 的 BERT 和 T5 使用 SentencePiece,它支持 BPE 和 Unigram 模型。

3. GPT 系列

OpenAI GPT 系列(包括 GPT-2、GPT-3)使用了一种改进版的 BPE,称为 Byte-Level BPE,对输入进行字节级别处理,能处理任意 UTF-8 字符。


九、小结

BPE 是一种高效的分词算法,介于词级和字符级之间。通过频率驱动的合并策略,构建出对语言有表达能力的子词单元,有效减少词表大小,提升模型泛化能力。如今,它已成为现代 NLP 模型(如 Transformer 系列)的基础技术之一。

http://www.xdnf.cn/news/15275.html

相关文章:

  • flutter鸿蒙版 环境配置
  • 在前端项目中是如何解决跨域的
  • 解决Vue页面黑底红字遮罩层报错:Unknown promise rejection reason (webpack-internal)
  • CSP-J/S 参赛选手注册报名流程
  • 智能文本抽取在合同管理实战应用
  • AIC8800M40低功耗wifi在ARM-LINUX开发板上做OTA的调试经验
  • 借助 Wisdom SSH AI 助手,轻松安装 CentOS 8 LNMP 环境
  • 2025前端面试真题以及答案-不断整理中,问题来源于牛客真题
  • CMU15445-2024fall-project1踩坑经历
  • hive/spark sql中unix_timestamp 函数的坑以及时间戳相关的转换
  • 串行数据检测器,检测到011,Y输出1,否则为0.
  • RabbitMQ 之顺序性保障
  • 从零实现一个GPT 【React + Express】--- 【4】实现文生图的功能
  • uniapp-在windows上IOS真机运行(含开发证书申请流程)
  • 重振索尼复古微型电脑——计划以OrangePi CM5 作为主板升级
  • uniapp小程序tabbar跳转拦截与弹窗控制
  • 学习笔记(34):matplotlib绘制图表-房价数据分析与可视化
  • 【数据结构与算法】203.移除链表元素(LeetCode)图文详解
  • 05 唤醒词检测:让语音助手随时待命
  • 平板柔光屏与镜面屏的区别有哪些?技术原理与适用场景全解析
  • Kotlin 常用语法糖完整整理
  • 如何准确查看服务器网络的利用率?
  • 云防火墙有什么用?
  • SoC程序如何使用单例模式运行
  • 企业网络安全的“金字塔”策略:构建全方位防护体系的核心思路
  • OSCP官方靶场-Solstice WP
  • AI驱动的业务系统智能化转型:从静态配置到动态认知的范式革命
  • 【办公类-107-01】20250710视频慢速与视频截图
  • mysql join语句、全表扫描 执行优化与访问冷数据对内存命中率的影响
  • MySQL索引:数据库的超级目录