为什么字节级 BPE 的词汇量小于 Unicode 的词汇量?
Why is the vocab size of Byte level BPE smaller than Unicode's vocab size?
我最近看了 GPT2,论文说:
This would result in a base vocabulary of over 130,000 before any multi-symbol tokens are added. This is prohibitively large compared to the 32,000 to 64,000 token vocabularies often used with BPE. In contrast, a byte-level version of BPE only requires a base vocabulary of size 256.
我真的听不懂这些话。 Unicode 表示的字符数是 130K,但如何减少到 256 个呢?其余大约 129K 个字符在哪里?我错过了什么?字节级 BPE 是否允许不同字符之间的重复表示?
我不明白其中的逻辑。以下是我的问题:
- 为什么词汇量变小了? (从 130K 到 256)
- BBPE(字节级BPE)的逻辑是什么?
详细问题
谢谢你的回答,但我真的不明白。假设我们有 130K 个独特的字符。我们想要的(也是 BBPE 所做的)是减少这个基本的(独特的)词汇。每个 Unicode 字符可以通过使用 UTF-8 编码转换为 1 到 4 个字节。 BBPE的原论文说(Neural Machine Translation with Byte-Level Subwords):
Representing text at the level of bytes and using the 256 bytes set as vocabulary is a potential solution to this issue.
每个字节可以表示256个字符(位,2^8),我们只需要2^17(131072)位来表示唯一的Unicode字符。这样的话,原论文中的256个字节是从哪里来的呢?我不知道逻辑和如何得出这个结果。
我重新整理一下我的问题,比较详细:
- BBPE 是如何工作的?
- 为什么词汇量变小了? (从 130K 到 256 字节)
- 不管怎么说,我们总是需要130K space 一个词汇。将唯一字符表示为 Unicode 和字节有什么区别?
由于我对计算机体系结构和编程知之甚少,如果有遗漏的地方,请告诉我。
此致,谢谢。
Unicode 代码点是 0..1,114,112 范围内的整数,目前大约有 130k 个正在使用。每个Unicode代码点对应一个字符,比如“a”或“λ”或“龙”,在很多情况下使用起来很方便(但有很多复杂的细节,例如组合标记)。
将文本数据保存到文件时,使用其中一种 UTF(UTF-8、UTF-16、UTF-32)将代码点(整数)转换为字节。对于 UTF-8(最流行的文件编码),每个字符由 1、2、3 或 4 个字节表示(有一些内部逻辑来区分单字节和多字节字符)。
所以当基本词汇表是字节时,这意味着稀有字符将使用多个 BPE 段进行编码。
例子
让我们考虑一个简短的例句,例如“That's great”。
有了所有 Unicode 字符的基本词汇表,BPE 模型开始时是这样的:
T 54
h 68
a 61
t 74
’ 2019
s 73
20
g 67
r 72
e 65
a 61
t 74
20
1F44D
(第一列是字符,第二列是十六进制表示法的代码点。)
如果您首先使用 UTF-8 对这个句子进行编码,那么这个字节序列将改为提供给 BPE:
T 54
h 68
a 61
t 74
� e2
� 80
� 99
s 73
20
g 67
r 72
e 65
a 61
t 74
20
� f0
� 9f
� 91
� 8d
印刷撇号“’”和竖起大拇指的表情符号由多个字节表示。
对于任一输入,BPE 分割(训练后)可能会以这样的方式结束:
Th|at|’s|great|
(这是一个假设的细分,但大写的“That”可能太少见,无法表示为单个细分。)
BPE的操作次数不同:要到达段’s
,代码点输入只需要一个合并步骤,而字节输入需要三个步骤。
对于字节输入,BPE 分段很可能以罕见字符的子字符段结束。
下游语言模型将不得不学习处理这种输入。
我最近看了 GPT2,论文说:
This would result in a base vocabulary of over 130,000 before any multi-symbol tokens are added. This is prohibitively large compared to the 32,000 to 64,000 token vocabularies often used with BPE. In contrast, a byte-level version of BPE only requires a base vocabulary of size 256.
我真的听不懂这些话。 Unicode 表示的字符数是 130K,但如何减少到 256 个呢?其余大约 129K 个字符在哪里?我错过了什么?字节级 BPE 是否允许不同字符之间的重复表示?
我不明白其中的逻辑。以下是我的问题:
- 为什么词汇量变小了? (从 130K 到 256)
- BBPE(字节级BPE)的逻辑是什么?
详细问题
谢谢你的回答,但我真的不明白。假设我们有 130K 个独特的字符。我们想要的(也是 BBPE 所做的)是减少这个基本的(独特的)词汇。每个 Unicode 字符可以通过使用 UTF-8 编码转换为 1 到 4 个字节。 BBPE的原论文说(Neural Machine Translation with Byte-Level Subwords):
Representing text at the level of bytes and using the 256 bytes set as vocabulary is a potential solution to this issue.
每个字节可以表示256个字符(位,2^8),我们只需要2^17(131072)位来表示唯一的Unicode字符。这样的话,原论文中的256个字节是从哪里来的呢?我不知道逻辑和如何得出这个结果。
我重新整理一下我的问题,比较详细:
- BBPE 是如何工作的?
- 为什么词汇量变小了? (从 130K 到 256 字节)
- 不管怎么说,我们总是需要130K space 一个词汇。将唯一字符表示为 Unicode 和字节有什么区别?
由于我对计算机体系结构和编程知之甚少,如果有遗漏的地方,请告诉我。
此致,谢谢。
Unicode 代码点是 0..1,114,112 范围内的整数,目前大约有 130k 个正在使用。每个Unicode代码点对应一个字符,比如“a”或“λ”或“龙”,在很多情况下使用起来很方便(但有很多复杂的细节,例如组合标记)。
将文本数据保存到文件时,使用其中一种 UTF(UTF-8、UTF-16、UTF-32)将代码点(整数)转换为字节。对于 UTF-8(最流行的文件编码),每个字符由 1、2、3 或 4 个字节表示(有一些内部逻辑来区分单字节和多字节字符)。
所以当基本词汇表是字节时,这意味着稀有字符将使用多个 BPE 段进行编码。
例子
让我们考虑一个简短的例句,例如“That's great”。
有了所有 Unicode 字符的基本词汇表,BPE 模型开始时是这样的:
T 54
h 68
a 61
t 74
’ 2019
s 73
20
g 67
r 72
e 65
a 61
t 74
20
1F44D
(第一列是字符,第二列是十六进制表示法的代码点。)
如果您首先使用 UTF-8 对这个句子进行编码,那么这个字节序列将改为提供给 BPE:
T 54
h 68
a 61
t 74
� e2
� 80
� 99
s 73
20
g 67
r 72
e 65
a 61
t 74
20
� f0
� 9f
� 91
� 8d
印刷撇号“’”和竖起大拇指的表情符号由多个字节表示。
对于任一输入,BPE 分割(训练后)可能会以这样的方式结束:
Th|at|’s|great|
(这是一个假设的细分,但大写的“That”可能太少见,无法表示为单个细分。)
BPE的操作次数不同:要到达段’s
,代码点输入只需要一个合并步骤,而字节输入需要三个步骤。
对于字节输入,BPE 分段很可能以罕见字符的子字符段结束。 下游语言模型将不得不学习处理这种输入。