为什么字节级 BPE 的词汇大小小于 Unicode 的词汇大小?

Inh*_*Yoo 8 unicode nlp utf-8

我最近读了 GPT2,论文中写道:

在添加任何多符号标记之前,这将导致基础词汇量超过 130,000 个。与 BPE 经常使用的 32,000 到 64,000 个标记词汇表相比,这个数字太大了。相比之下,BPE 的字节级版本仅需要大小为 256 的基本词汇表。

我实在是听不懂这句话。Unicode 表示的字符数是 130K,但是如何将其减少到 256 个呢?剩下的约 129K 个字符在哪里?我缺少什么?字节级 BPE 是否允许在不同字符之间复制表示?

我不明白其中的逻辑。以下是我的问题:

  • 为什么词汇量会减少?(从 130K 到 256)
  • BBPE(字节级BPE)的逻辑是什么?

详细问题

谢谢你的回答,但我真的不明白。假设我们有 13 万个独特的角色。我们想要(也是 BBPE 所做的)是减少这个基本(独特)词汇。每个 Unicode 字符可以利用 UTF-8 编码转换为 1 到 4 个字节。BBPE 的原始论文是这样说的(Neural Machine Translation with Byte-Level Subwords):

以字节级别表示文本并使用 256 字节集作为词汇表是此问题的潜在解决方案。

每个字节可以表示 256 个字符(位,2^8),我们只需要 2^17(131072)位来表示唯一的 Unicode 字符。那么,原论文中的256字节是从哪里来的呢?我不知道逻辑以及如何得出这个结果。

我重新整理一下我的问题,更详细一些:

  • BBPE 如何发挥作用?
  • 为什么词汇量会减少?(从 130K 到 256 字节)
    • 无论如何,我们总是需要 130K 的词汇空间。将唯一字符表示为 Unicode 和字节有什么区别?

由于我对计算机体系结构和编程知之甚少,如果我遗漏了什么,请告诉我。

真诚的,谢谢你。

len*_*enz 7

Unicode 代码点是 0..1,114,112 范围内的整数,目前正在使用其中大约 130k。每个 Unicode 代码点对应一个字符,例如“a”或“\xce\xbb”或“\xe9\xbe\x99”,在许多情况下使用起来很方便(但有很多复杂的细节,例如. 组合标记)。

\n

将文本数据保存到文件时,可以使用 UTF(UTF-8、UTF-16、UTF-32)之一将代码点(整数)转换为字节。对于 UTF-8(最流行的文件编码),每个字符由 1、2、3 或 4 个字节表示(有一些内部逻辑来区分单字节和多字节字符)。

\n

因此,当基本词汇表是字节时,这意味着稀有字符将使用多个 BPE 段进行编码。

\n

例子

\n

让我们考虑一个简短的例句,例如 \xe2\x80\x9cThat\xe2\x80\x99s grand \xe2\x80\x9d。

\n

BPE 模型以所有 Unicode 字符的基本词汇表开始,如下所示:

\n
T      54\nh      68\na      61\nt      74\n\xe2\x80\x99    2019\ns      73\n       20\ng      67\nr      72\ne      65\na      61\nt      74\n       20\n   1F44D\n
Run Code Online (Sandbox Code Playgroud)\n

(第一列是字符,第二列是十六进制表示的代码点。)

\n

如果您首先使用 UTF-8 编码该句子,则该字节序列将被馈送到 BPE:

\n
T      54\nh      68\na      61\nt      74\n\xef\xbf\xbd      e2\n\xef\xbf\xbd      80\n\xef\xbf\xbd      99\ns      73\n       20\ng      67\nr      72\ne      65\na      61\nt      74\n       20\n\xef\xbf\xbd      f0\n\xef\xbf\xbd      9f\n\xef\xbf\xbd      91\n\xef\xbf\xbd      8d\n
Run Code Online (Sandbox Code Playgroud)\n

印刷撇号“\xe2\x80\x99”和竖起大拇指的表情符号由多个字节表示。

\n

对于任一输入,BPE 分割(训练后)可能会以如下方式结束:

\n
Th|at|\xe2\x80\x99s|great|\n
Run Code Online (Sandbox Code Playgroud)\n

(这是一个假设的分段,但大写的 \xe2\x80\x9cThat\xe2\x80\x9c 可能太罕见,无法表示为单个分段。)

\n

但 BPE 操作的数量不同:要到达段\xe2\x80\x99s,代码点输入只需要一个合并步骤,但字节输入需要三个步骤。

\n

对于字节输入,BPE 分段可能最终会出现稀有字符的子字符段。\n下游语言模型将必须学习处理此类输入。

\n