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

《分词算法大揭秘:BPE、BBPE、WordPiece、ULM常见方法介绍》

分词算法是自然语言处理(NLP)中的一个重要预处理步骤,它将文本分割成更小的单元(如单词、子词或字符)。以下是几种常见的分词算法:Byte Pair Encoding (BPE)、Byte-level BPE (BBPE)、WordPiece 和 Unigram Language Model (ULM)


1. Byte Pair Encoding (BPE)

论文摘要

  • 标题:Neural Machine Translation of Rare Words with Subword Units
  • 连接:点击这里阅读论文全文

核心思想

从一个基础小词表开始,通过不断合并最高频的连续token对来产生新的token。
详细可参考BPE 算法原理及使用指南【深入浅出】
在这里插入图片描述

具体做法

  1. 准备基础词表,如英文中26个字母加上各种符号,并初始化ID。
  2. 基于基础词表将准备的语料拆分为最小单元,末尾添加</ w>(示例中使用_)。
  3. 在语料上统计单词内相邻单元对的频率,选择频率最高的单元对进行合并。
  4. 重复第3步直到达到预先设定的subword词表大小或下一个最高频率为1。

优缺点

  • 优点:可以有效地平衡词汇表大小和编码步数。
  • 缺点
    1. 无法提供带概率的多个分词结果。
    2. 局部高频对合并可能破坏全局更有意义的组合。

2. Byte-level BPE (BBPE)

论文信息

  • 标题:Neural Machine Translation with Byte-Level Subwords
  • 链接:https://arxiv.org/pdf/1909.03341

核心思想

该论文提出了一种名为BBPE(Byte-level BPE)的新型机器翻译方法,将传统BPE的字符级操作扩展到字节级别,直接处理UTF-8编码的字节序列。此举有助于避免传统字符级BPE中稀有字符(如生僻汉字)占用词表空间的问题。

具体做法

  • 使用基础词表,采用256的字节集,UTF-8编码。

优点

  1. 与BPE相媲美,但词表大为减小。
  2. 可在多语言间通过字节级别的子词实现更好的共享。
  3. 即使字符集不重叠,也可通过字节层面的共享实现良好的迁移。
  4. 高效的压缩效果,根据文本中的重复模式和常见片段来动态生成词汇表,尤其适用于大量重复内容的文本数据。
  5. 适用于多种类型的数据,包括文本、图像等,因其基于字节级别的编码方法。
  6. 无损压缩,确保压缩后的数据与原始数据无信息损失。
  7. 可解码性,可轻松将编码后的数据解码回原始数据。
  8. 灵活性高,可根据需求调整压缩效果和词汇表大小。

缺点

  1. 编码序列时可能略长于BPE,计算成本更高。
  2. 由byte解码时可能会遇到歧义,需要通过上下文信息和动态规划进行解码,确保输出有效句子。

BBPE和BPE的关键区别

在这里插入图片描述


3. WordPiece

论文:Fast WordPiece Tokenization

  • 链接:https://arxiv.org/pdf/2012.15524

核心思想

与BPE类似,Fast WordPiece Tokenization 从基础小词表出发,通过合并子词来生成最终词表。不同之处在于,WordPiece 选择合并的token对时基于token间的互信息而非频率。这里的互信息衡量的是两个子词同时出现的概率相比于它们各自独立出现的概率。
在这里插入图片描述

具体做法

  1. 输入:训练语料和词表大小 V。

  2. 准备基础词表,如英文字母和符号。

  3. 使用基础词表将语料拆分为最小单元。

  4. 基于拆分后的数据训练语言模型,可以是 unigram 语言模型,通过极大似然估计。
    在这里插入图片描述

  5. 选择能最大程度增加训练数据概率的 token 对进行合并。假设句子由 N 个子词组成 S = ( t 1 , t 2 , . . . , t N ) S = (t_1, t_2, ..., t_N) S=(t1,t2,...,tN),句子的似然值为所有子词概率的乘积:
    log ⁡ P ( s ) = ∑ i = 1 N log ⁡ P ( t i ) \log P(s) = \sum_{i=1}^{N} \log P(t_i) logP(s)=i=1NlogP(ti)
    合并相邻两个子词 x 和 y 产生新的子词 z,句子的似然值变化为两个子词之间的互信息:
    log ⁡ P ( t z ) − ( log ⁡ P ( t x ) + log ⁡ P ( t y ) ) = log ⁡ P ( t z ) P ( t x ) P ( t y ) \log P(t_z) - (\log P(t_x) + \log P(t_y)) = \log \frac{P(t_z)}{P(t_x)P(t_y)} logP(tz)(logP(tx)+logP(ty))=logP(tx)P(ty)P(tz)
    每次选择互信息最大的两个子词合并,基于子词在语言模型上的关联性,得分计算公式为:
    score = P ( t z ) P ( t x ) P ( t y ) \text{score} = \frac{P(t_z)}{P(t_x)P(t_y)} score=P(tx)P(ty)P(tz)

  6. 重复第 5 步直到达到预设的子词表大小或概率增量低于阈值。

优点

  • 能平衡词表大小和 OOV 问题

缺点

  • 可能产生一些不合理的子词或错误划分
  • 拼写错误敏感
  • 对前缀支持不够好

一种解决方案是将复合词和前缀拆开处理。


4. Unigram Language Model (ULM)

核心思想

初始化一个大词表,然后通过unigram语言模型计算删除不同subword造成的损失来代表subword的重要性,保留loss较大或者说重要性较高的subword。ULM会倾向于保留那些以较高频率出现在很多句子的分词结果中的子词,因为这些子词如果被删除,其损失会很大。

具体做法

  1. 输入训练语料和词表大小V

  2. 准备基础词表:初始化一个很大的词表,比如所有字符+高频ngram,也可以通过BPE算法初始化

  3. 针对当前词表,用语言模型(unigram lm)估计每个子词在语料上的概率,比如EM算法,维特比算法寻找最优分割
    在这里插入图片描述

  4. 计算删除每个subword后对总loss的影响,作为该subword的loss

  5. 将子词按照loss大小进行排序,保留前x%的子词;注意,单字符不能被丢弃,以免OOV

  6. 重复步骤2到4,直到词表大小减少到设定值

优点

  1. 使用的训练算法可以利用所有可能的分词结果,这是通过data sampling算法实现的
  2. 提出一种基于语言模型的分词算法,这种语言模型可以给多种分词结果赋予概率,从而可以学到其中的噪声
  3. 使用时也可以给出带概率的多个分词结果

缺点

  1. 效果与初始词表息息相关,初始的大词表要足够好,比如可以通过BPE来初始化
  2. 略显复杂

相关文章:

  • 在原生代码(非webpack)里使用iview的注意事项
  • 回归分析丨基于R语言复杂数据回归与混合效应模型【多水平/分层/嵌套】技术与代码
  • AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年4月30日第68弹
  • mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz的下载安装和使用
  • PostgreSQL Patroni集群组件作用介绍:Patroni、etcd、HAProxy、Keepalived、Watchdog
  • 在Carla中构建自动驾驶:使用PID控制和ROS2进行路径跟踪
  • Android学习总结之自定义view设计模式理解
  • 尼日利亚slot游戏出海赛道借助本土网盟cpi流量广告投放优势
  • 企业数据合规实战:用API+AI构建备案核验系统
  • Python爬虫(11)Python数据存储实战:深入解析NoSQL数据库的核心应用与实战
  • WPF性能优化举例
  • python+echart绘制一个听力图
  • 第六章 QT基础:9、Qt中数据库的操作
  • 【Dify系列教程重置精品版】第四章:实现Dify的 hello world
  • Learning vtkjs之ImageCropFilter
  • C++负载均衡远程调用学习之自定义内存池管理
  • 突破SQL注入字符转义的实战指南:绕过技巧与防御策略
  • RSYSLOG收集深信服log
  • 20250430在ubuntu14.04.6系统上查看系统实时网速
  • 耘想WinNAS:企业级NAS解决方案的终极选择
  • “网约摩托”在部分县城上线:起步价五六元,专家建议纳入监管
  • 此前显示售罄的火车票“五一”前大量放出来了?12306回应
  • 经营业绩持续稳中向好,国铁集团2024年度和2025年一季度财务决算公布
  • 美参议院通过新任美国驻华大使任命,外交部回应
  • 量子传感新技术“攻克”退相干难题
  • 买新房可申领学位,广州南沙出台购房入学政策