分词算法

分词算法

BPE

BPE (Byte Pair Encoding) 全称为字节对编码,本质是一种数据压缩方法,来自于一篇发表于 1994 年的论文:“A new algorithm for data compression”。它在数据压缩中原始的核心思路非常简单:每一步都将最常见的一对 相邻数据单位 替换为该数据中没有出现过的一个 新单位,反复迭代直到满足停止条件 。

比如有一段数据是“abbabyabya”,其中相邻字母对的组合中 “ab” 出现 3 次是出现最多,即可以使用一个字母 Z 去代替 “ab”,数据形式压缩成:“ZbZyZya”。以此类推,下一个’Zy’继续被替换成 Y,数据形式变成:“ZbYYa”。

在 NLP 中,2015 年 Sennrich 通过论文 Neural Machine Translation of Rare Words with Subword Units 将这个算法使用在生成 Tokenizer 的词表上,做法是先将每个文本词(Word)拆分成 Char 粒度的字母序列,然后通过迭代地合并最频繁出现的字符或字符序列来实现生成 Tokenizer 最终词表的过程。 之后 OpenAI GPT-2 与 Facebook RoBERTa 均采用此方法进阶版 BBPE 构建 Subword 向量,也是目前最常用的 Tokenizer 方法之一。

BPE 算法步骤:

输入:训练语料; 词表大小 V V V

  1. 准备足够大的训练语料,确定期望的 subword 词表大小;
  2. 准备基础词表:比如英文中 26 个字母加上各种符号;
  3. 基于基础词表将语料中的单词拆分为字符序列并在末尾添加后缀“ </ w>”;本阶段的 subword 的粒度是字符。例如单词“ low”的频率为 5,那么我们将其改写为“ l o w </ w>”:5;
  4. 统计每一个连续字节对的出现频率,选择最高频的字符对合并成新的 subword;
  5. 重复第 4 步直到达到第 1 步设定的 subword 词表大小,或下一个最高频的字节对出现频率为 1;

BBPE

2019 年 12 月,论文:Neural Machine Translation with Byte-Level Subwords 在基于 BPE 基础上提出以 Byte-level 为粒度的分词算法 Byte-level BPE,即 BBPE。

对于英文、拉美体系的语言来说使用 BPE 分词足以在可接受的词表大小下解决 OOV 的问题,但面对中文、日文等语言时,其稀有的字符可能会不必要的占用词汇表,因此考虑使用字节级别 byte-level 解决不同语言进行分词时 OOV 的问题。

具体的,BBPE 考虑将一段文本的 UTF-8 编码 (UTF-8 保证任何语言都可以通用) 中的一个字节 256 位不同的编码作为词表的初始化基础 Subword。

UTF-8 使用 1~4 字节为每个字符编码:

  • 一个 US-ASCII 字符只需 1 字节编码(Unicode 范围由 U+0000 ~ U+007F)

  • 带有变音符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文等字母则需要 2 字节编码(Unicode 范围由 U+0080 ~ U+07FF)。

  • 其他语言的字符(包括中日韩文字、东南亚文字、中东文字等)包含了大部分常用字,使用 3 字节编码。

  • 其他极少使用的语言字符使用 4 字节编码。

BBPE 算法在基于字节(Byte)进行合并过程和 BPE 一致、也是选取出现频数最高的字符对进行合并。

LLaMa 模型的 Tokenizer 采用的就是 BBPE。

总结

总的来说,BBPE 效果与 BPE 相当,从发明时即为了解决中文、日本编码词表过大的问题,因此在多语言编码上天然具有 词表小的优势,但同时导致每种语言不一定是长度最优的编码方式,必然从 长度上会增加推理计算的开销。另外 UTF-8 编码可以在不同语言之间字节编码可能具有一定互通性,可以实现即使字符集不重叠,也可以通过子节层面的共享来实现良好的迁移。有利于模型翻译能力提升

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值