NLP--BPE、WordPiece、ULM、SentencePiece子词分词器总结【原理】

2023-11-16

序言

当我们在做英语文本任务时,机器无法理解文本。当我们将句子序列送入模型时,模型仅仅能看到一串字节,它无法知道一个词从哪里开始,到哪里结束,所以也不知道一个词是怎么组成的。所以,为了帮助机器理解文本,我们需要

  1. 将文本分成一个个小片段
  2. 然后将这些片段表示为一个向量作为模型的输入
  3. 同时,我们需要将一个个小片段(token) 表示为向量,作为词嵌入矩阵, 通过在语料库上训练来优化token的表示,使其蕴含更多有用的信息,用于之后的任务。

分词方法

分词的方法,一般分为3大类

  • 基于空格的分词方法(词级
    • 在训练语料中出现的token才能被训练器学习到,而那些没有出现的token将会被<UNK>等特殊标记代替,这样将影响模型的表现
    • 词典将非常庞大,产生很大的开销。
    • 出现次数很少的词,学习其token的向量表示也非常困难,遇到新词,会变成OOV
  • 基于字母的分词方法(字符级
    • 单个字符本身缺少语义,使得到的词向量缺乏含义
    • 输入序列变长,对于限制最大长度的模型,容易达到最大值
    • 计算复杂度提升
    • 字符级解决了 OOV 问题,但将输入表示为字符序列会增加序列长度,这使得学习字符之间的关系以形成有意义的单词变得具有挑战性。
  • 基于子词的分词方法(子词级
    • 结合了字符级与词级的优点,在<UNK>数目和词向量含义丰富性之间达到平衡
    • 通过一个有限的单词列表来解决所有单词的分词问题,同时将结果中token的数目降到最低

子词分词

子词背后的核心概念是,频繁出现的单词应该在词汇表中,而稀有单词应该被拆分为频繁出现的子词。例如。“refactoring”一词可以分为“re”“factor”“ing”,子词“re”“factor”“ing”“refactoring”更频繁地出现,其整体含义也保持不变。

BPE

Byte Pair Encoding (BPE) tokenisation

使用模型:GPT-2Roberta

  • BPE 的第一步是将所有字符串拆分为单词

  • 再分词后,假设我们有以下单词,其频率如下:

    [(“car”, 5), (“cable”, 3), (“tablet”, 1), (“watch”, 2), (“chair”, 5), (“mouse”, 1)]
    
    • 所需的词汇表大小(vocabulary size)是 BPE 的超参数。在示例中,假设我们想要词汇表中总共 17 (size = 17)个标记。单词中的所有唯一字符和符号都作为基本词汇表。在此,基本词汇表是
    [‘a’, ‘b’, ‘c’, ‘e’, ‘h’, ‘i’, ‘l’, ‘m’, ‘o’, ‘r’, ‘s’ ,’t’, ‘u’, ‘w’] size=14
    
    • 将所有单词拆分为基本词汇字符,如下:

      [(‘c’,’a’,’r’ , 5), (‘c’,’a’,’b’,’l’,’e’, 3),(‘t’,’a’,’b’,’l’,’e’,’t’, 1), (‘w’,’a’,’t’,’c’,’h’, 2), (‘c’,’h’,’a’,’i’,’r’, 5), (‘m’,’o’,’u’,’s’,’e’, 1)]
      
    • BPE 算法计算每个符号对的出现次数,并选择频率最高的符号对。在上面的例子中,“ca”对在car中出现 5 次,在cable中出现 3 次,总共出现 8 次,是所有对中出现的最高的。接下来是 7 次 ch(2 次来自watch,5 次来自chair)等等

      • 最常见的对“ca”被添加到词汇表中,并且所有出现的ca被合并。基本词汇现在变为

        [‘a’, ‘b’, ‘c’, ‘e’, ‘h’, ‘i’, ‘l’, ‘m’, ‘o’, ‘r’, ‘s’ ,’t’, ‘u’, ‘w’, ‘ca’] size=15
        

        token词汇变成了

        [(‘ca’,’r’ , 5), (‘ca’,’b’,’l’,’e’, 3), (‘t’,’a’,’b’,’l’,’e’,’t’, 1), (‘w’,’a’,’t’,’c’,’h’, 2), (‘c’,’h’,’a’,’i’,’r’, 5), (‘m’,’o’,’u’,’s’,’e’, 1)]
        
      • 第二出现次数多的是“ch”,它被添加到词汇表中,所有成对出现的ch 都合并在一起。

        [‘a’, ‘b’, ‘c’, ‘e’, ‘h’, ‘i’, ‘l’, ‘m’, ‘o’, ‘r’, ‘s’ ,’t’, ‘u’, ‘w’, ‘ca’, ‘ch’] size=16
        

        token词汇变成了

        [(‘ca’,’r’ , 5), (‘ca’,’b’,’l’,’e’, 3), (‘t’,’a’,’b’,’l’,’e’,’t’, 1), (‘w’,’a’,’t’,’ch’, 2), (‘ch’,’a’,’i’,’r’, 5), (‘m’,’o’,’u’,’s’,’e’, 1)]
        
      • 目标词汇size = 17BPE 将选择下一个最常见的对“ca”“r”,出现 5 次。它们将被合并,“car”将被添加到词汇表中,最终词汇

        [‘a’, ‘b’, ‘c’, ‘e’, ‘h’, ‘i’, ‘l’, ‘m’, ‘o’, ‘r’, ‘s’ ,’t’, ‘u’, ‘w’, ‘ca’, ‘ch’,’car’] size=17
        

        token词汇变成了

        [(‘car’ , 5), (‘ca’,’b’,’l’,’e’, 3), (‘t’,’a’,’b’,’l’,’e’,’t’, 1), (‘w’,’a’,’t’,’ch’, 2), (‘ch’,’a’,’i’,’r’, 5), (‘m’,’o’,’u’,’s’,’e’, 1)]
        
      • 由于达到词汇限制,因此不会进行进一步的合并。

    • 现在 BPE 已经过训练,相同的标记化合并将应用于新单词。比如说,我们得到一个新词“cab”,它将被标记化为[“ca”,“b”]。但是,如果新单词是“card”,它将被拆分为[“car”,“[UNK]”],因为字母d不在词汇表中。实际上,这永远不会发生,因为所有字符至少在语料库中出现一次。但是,如果标点符号或数字等符号未添加到词汇表中,而是新单词的一部分,则可能会遇到 <UNK>标记。

WordPiece

WordpieceBERTtoken分词器,WordPiece类似于BPE,它首先将所有字符和符号包含到其基本词汇表中。我们定义所需的词汇大小,并不断添加子词,直到达到限制。

BPEWordPiece之间的区别在于选择符号对以添加到词汇表的方式。

BPE选择频数最高的相邻子词合并,而WordPiece选择能够提升语言模型概率最大的相邻子词加入词表

WordPiece不依赖于对的频率,而是选择最大化训练数据可能性最大的一个。这意味着它从基本词汇开始训练语言模型,并选择可能性最高的对(pair=基本词汇字符 + 生成字符的最高概率)。该对被添加到词汇中,语言模型再次在新词汇上训练。重复这些步骤,直到达到所需的词汇量。

例如:"I just got a funky phone case!"
分词为:[“I”, “just”, “got”, “a”, “fun”, “##ky”, “phone”, “case”]
##将这个符号添加到子词前面
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
tokenizer.tokenize("I have a new GPU!")
 
# ["i", "have", "a", "new", "gp", "##u", "!"]
The tokenizer splits "gpu" into known subwords: ["gp" and "##u"]. 

Unigram Language Model (ULM)

ULMWordPiece一样,ULM同样使用语言模型来挑选子词。不同之处在于,BPEWordPiece算法的词表大小都是从小到大变化,属于增量法。而Unigram Language Model则是减量法,即先初始化一个大词表,根据评估准则不断丢弃词表,直到满足限定条件。ULM算法考虑了句子的不同分词可能,因而能够输出带概率的多个子词分段。

ULM在每一步都使用语言模型,并不断删除loss最高的pairx%pair的定义与Wordpiece的定义相同)。loss通常定义为该训练步骤中词汇表的对数似然函数。

Unigram 主要与 SentencePiece 结合使用

以上三种子词分词器的关系

img

SentencePiece

SentencePiece
上面讨论的所有分词器都假设空格分隔单词。除了中文、日语等少数语言外,情况确实如此。SentencePiece不将空格视为分隔符,而是将字符串作为其原始原始格式的输入,即与所有空格一起。它使用 BPE ULM 作为其分词器来构建词汇表。

使用SentencePiece的模型ALBERTXLNetMarianT5

例如:“I just got a funky phone case!”
 [“_I”, “_just”, “_got”, “_a”, “_fun”, “ky”, “_phone”, “_case”]
 token可以连接形成字符串,“_”可以替换为空格
from transformers import XLNetTokenizer
tokenizer = XLNetTokenizer.from_pretrained("xlnet-base-cased")
tokenizer.tokenize("Don't you love 									
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NLP--BPE、WordPiece、ULM、SentencePiece子词分词器总结【原理】 的相关文章

  • druid与mysql连接超时的问题

    背景 公司一个项目使用了druid连接池 mysql数据库 生产环境日志偶尔会打印一个错误如下 com mysql jdbc exceptions jdbc4 CommunicationsException Communications l
  • 入门产品经理的7个实用方法

    关注同名公众号 获得更多产品经理知识干货 每天5分钟 你也可以成为优秀的产品经理 你好 我是郭杉 欢迎来到 郭杉 产品经理50讲 第2讲 正式开始今天的内容之前 我想先问你一个问题 你是不是一直苦于想入门但却没有人带 自己摸索却不知如何开始

随机推荐

  • Grafana如何正确配置数据源

    Grafana配置数据源的步骤如下 1 首先选择设置 点击数据源 再选择添加数据源 2 根据需要选择对应的数据库类型 3 输入对应的数据库信息 4 测试数据是否连接成功 5 若发现出现如上错误 更改Encrypt值为disable后 再次测
  • 大数据课程M1——ELK的概述

    文章作者邮箱 yugongshiye sina cn 地址 广东惠州 本章节目的 了解ELK的定义 掌握ELK的使用 一 什么是ELK 1 简介 ELK 是elastic公司提供的一套完整的日志收集以及展示的解决方案 是三个产品的首字母缩写
  • mybatis,#和$的区别

    与 井号与美元符号使用的区别 占位符 表示列值放在等号的右侧 而且使用的是jdbc的preparedStatement效率高没有sql注入的风险 占位符 是表示字符串的连接 使用的是Statement效率低有sql注入风险
  • 均值极差图控制上下限_统计过程控制(SPC)和休哈特控制图之九XbarR(均值极差)控制图...

    期来介绍一下Xbar R 均值 极差 控制图 希望下面分享的能给朋友们理解和应用统计过程控制带来启发和帮助 统计技术本身不会解决质量过程的各种问题 无论如何还是得实际的过程应用中适时结合相应的产品才能发挥效能 以至于把控制图识别出来的问题解
  • Java常用类 学习记录

    String类 关于Java JDK中内置的一个类 java lang String 1 String表示字符串类型 不属于基本数据类型 2 用双引号括起来的 例如 abc def hello world 这3个是String对象 3 双引
  • JDBC(mysql)显式设置serverTimezone的原因和方法

    TOC设置原因和方法 参 自 设置原因和方法 serverTimezone GMT 2B8 jdbc url jdbc mysql localhost 3306 demo serverTimezone UTC characterEncodi
  • python一共有多少代码_Python项目可以有多大?最多可以有多少行代码?

    导读 总是看到有人说 动态一时爽 重构火葬场 然而这世界上有的是著名的开源项目 也有像 Github Instagram 这样流量巨大的知名网站是基于动态语言开发的 经过了这么多年重构 也未听说哪个作者进了火葬场的 不明白这些人是真的不知道
  • 使用腾讯云DNSPod实现动态域名解析DDNS(测试可以用)

    使用原理 DDNS Dynamic Domain Name Server 是动态域名服务的缩写 是将用户的动态IP地址映射到一个固定的域名解析服务上 用户每次连接网络的时候客户端程序就会通过信息传递把该主机的动态IP地址传送给位于服务商主机
  • Unity中实现退出游戏功能

    我们要实现在编辑器环境下退出编辑器 在非编译器环境下退出游戏 提问 如何判断是否在编辑器环境中 如何退出编辑模式 如何退出程序 回答 使用预处理判断当前的环境 常用的预处理标识符 标识符 解释 UNITY EDITOR 只在编辑器中编译 U
  • mysql根据日期倒序_mysql记录根据日期字段倒序输出

    我们知道倒序输出是很简单的 select from table order by id desc 直接这样就可以 那么现在的问题在于日期字段怎么来倒序输出 这里我们用到cast 来将指定的字段转换为我们需要的类型 如下是实际项目中的sql语
  • C/C++项目:谁都爱玩的4399小游戏黄金矿工教程

    黄金矿工中文版 是一款休闲益智小游戏 游戏中你需要看准时机出钩子勾取金子或者砖石来获得金钱的累加 达到一定的金钱数才能够闯关成功 游戏十分经典 强烈推荐大家学会编写这款游戏 休闲时没网也能自己玩哦 黄金矿工道具说明 金块 按大小区分 越大越
  • Robot Framework 企业级自动化测试实战

    一 Robot Framework 变量使用 1 变量简介 变量是Robot Framework的一个不可或缺的特性 它们可以在测试数据的大多数地方使用 最常见的是 它们用于测试用例表和关键字表中关键字的参数 但所有设置都允许在其值中使用变
  • pthread信号

    信号是典型的异步事件 内核在某个信号出现时有三种处理方式 忽略信号 除了SIGKILL和SIGSTOP信号不能忽略外 其他大部分信号都可以被忽略 捕捉信号 也就是在信号发生时调用一个用户函数 注意不能捕捉SIGKILL和SIGSTOP 执行
  • 【生成模型新方向】score-based generative models

    这里写目录标题 0 前言 1 介绍 2 The score function score based models and score matching 3 Langevin dynamics朗之万动力学 4 朴素的 Naive score
  • blockly for android app 安装闪退

    java lang RuntimeException Unable to start activity ComponentInfo app robo com roboapp app robo com roboapp MainActivity
  • 上海链节科技:企业链改的价值是什么?

    企业链改并不是盲目的 它应该至少满足两个条件 第一 区块链技术是否与该行业真的契合 是否能工利用区块链和互联网的技术 完成自身系统的改造 提高自身的公信力 提供一系列对于企业当前出现的实际问题的必要回答 这样的依托于区块链改造的 基于特定公
  • 使用R语言中的epiDisplay包进行数据分析和可视化是一种常见的方法

    使用R语言中的epiDisplay包进行数据分析和可视化是一种常见的方法 epiDisplay包提供了丰富的函数和工具 用于描述性统计分析和制作各种图形 其中的summ函数可以帮助我们计算数据框中指定变量在不同分组变量下的描述性统计汇总信息
  • java自定义枚举数组转String类型转换器

    代码如下 public class LotteryActivityTypeConverter implements AttributeConverter
  • Windows中杀死占用某个端口的进程

    最近写项目 总是出现端口被占用的问题 原来傻傻的把电脑重启一下 终于有一天受不了了 想要想办法解决 刚开始从网上找了好多教程 发现不行 开始自己尝试 终于 成功的将占用端口的进程杀掉 在此记录下过程 以8080端口为例 第一步 打开cmd命
  • NLP--BPE、WordPiece、ULM、SentencePiece子词分词器总结【原理】

    序言 当我们在做英语文本任务时 机器无法理解文本 当我们将句子序列送入模型时 模型仅仅能看到一串字节 它无法知道一个词从哪里开始 到哪里结束 所以也不知道一个词是怎么组成的 所以 为了帮助机器理解文本 我们需要 将文本分成一个个小片段 然后
Powered by Hwhale