机器翻译中分词方法--BPE(Byte Pair Encoding)

参考文章:深入理解NLP Subword算法:BPE、WordPiece、ULM
使用API:

前言

Subword算法如今已经成为了一个重要的NLP模型性能提升方法。自从2018年BERT横空出世横扫NLP界各大排行榜之后,各路预训练语言模型如同雨后春笋般涌现,其中Subword算法在其中已经成为标配。所以作为NLP界从业者,有必要了解下Subword算法的原理。

1.与传统空格分隔tokenization技术的对比

  • 传统词表示方法无法很好的处理未知或罕见的词汇(OOV问题)
  • 传统词tokenization方法不利于模型学习词缀之间的关系
    • E.g. 模型学到的“old”, “older”, and “oldest”之间的关系无法泛化到“smart”, “smarter”, and “smartest”。
  • Character embedding作为OOV的解决方法粒度太细
  • Subword粒度在词与字符之间,能够较好的平衡OOV问题

总结:即传统的按空格分词方法对于词的泛化能力不够

2.Byte Pair Encoding (Sennrich et al., 2015)

BPE(字节对)编码或二元编码是一种简单的数据压缩形式,其中最常见的一对连续字节数据被替换为该数据中不存在的字节[2]。 后期使用时需要一个替换表来重建原始数据。OpenAI GPT-2 与Facebook RoBERTa均采用此方法构建subword vector.

  • 优点
    可以有效地平衡词汇表大小和步数(编码句子所需的token数量)。
  • 缺点
    基于贪婪和确定的符号替换,不能提供带概率的多个分片结果。

2.1 算法

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

注意:貌似不采用后缀"</ w>"也可,例如调用的subword api 中使用的方法是在非词尾加上_,只要能区分出词尾和中间词,主要是用于word合并?

每次合并后词表可能出现3种变化:

  • +1,表明加入合并后的新字词,同时原来的2个子词还保留(2个字词不是完全同时连续出现)
  • +0,表明加入合并后的新字词,同时原来的2个子词中一个保留,一个被消解(一个字词完全随着另一个字词的出现而紧跟着出现)
  • -1,表明加入合并后的新字词,同时原来的2个子词都被消解(2个字词同时连续出现)

实际上,随着合并的次数增加,词表大小通常先增加后减小。

例子

输入:

{
   'l o w </w>': 5, 'l o w e r </w>': 2, 'n e w e s t </w>': 6, 'w i d e s t </w>': 3}

Iter 1, 最高频连续字节对"e"和"s"出现了6+3=9次,合并成"es"。输出:

{
   'l o w </w>': 5, 'l o w e r </w>': 2, 'n e w es t </w>': 6, 'w i d es t </w>': 3}
Iter 2, 最高频连续字节对"es""t"出现了6+3=9, 合并成"est"。输出:

Iter 3, 以此类推,最高频连续字节对为"est"和"" 输出:

{
   'l o w </w>': 5, 'l o w e r </w>': 2, 'n e w est</w>': 6, 'w i d est</w>': 3}

2.2 BPE实现

import re, collections

def get_stats(vocab):
    pairs = collections.defaultdict(int)
    for word, freq in vocab.items
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值