我最近读了 GPT2,论文中写道:
在添加任何多符号标记之前,这将导致基础词汇量超过 130,000 个。与 BPE 经常使用的 32,000 到 64,000 个标记词汇表相比,这个数字太大了。相比之下,BPE 的字节级版本仅需要大小为 256 的基本词汇表。
我实在是听不懂这句话。Unicode 表示的字符数是 130K,但是如何将其减少到 256 个呢?剩下的约 129K 个字符在哪里?我缺少什么?字节级 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字节是从哪里来的呢?我不知道逻辑以及如何得出这个结果。
我重新整理一下我的问题,更详细一些:
由于我对计算机体系结构和编程知之甚少,如果我遗漏了什么,请告诉我。
真诚的,谢谢你。
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让我们考虑一个简短的例句,例如 \xe2\x80\x9cThat\xe2\x80\x99s grand \xe2\x80\x9d。
\nBPE 模型以所有 Unicode 字符的基本词汇表开始,如下所示:
\nT 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:
\nT 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 分割(训练后)可能会以如下方式结束:
\nTh|at|\xe2\x80\x99s|great|\n
Run Code Online (Sandbox Code Playgroud)\n(这是一个假设的分段,但大写的 \xe2\x80\x9cThat\xe2\x80\x9c 可能太罕见,无法表示为单个分段。)
\n但 BPE 操作的数量不同:要到达段\xe2\x80\x99s
,代码点输入只需要一个合并步骤,但字节输入需要三个步骤。
对于字节输入,BPE 分段可能最终会出现稀有字符的子字符段。\n下游语言模型将必须学习处理此类输入。
\n