Token是任何NLP神经网络模型接受用户输入的最小颗粒度。
将用户输入的文本转换为 token 序列的过程就叫做 Tokenizer。它包含两部分,一部分是从文字转换为 token(设置在进入 ChatGPT 之前),另一部分是将 token 转换为文字,也就是逆转换(设置在 ChatGPT 模型输出之后)。
Byte-level BPE 算法
是基于字符的BPE算法,为了克服基于字符的token词表其各种特殊字符数量太庞大。
字符在计算机中都是以Unicode编码格式实现,为16进制
Eg: “中”在 Unicode 编码中的码点是U+4E2D,其中 U+ 表示 Unicode 编码,4E2D 是该字符的 16 进制码点。若以 UTF-8 编码为例,汉字“中”被转换为 3 个字节(byte) 的二进制数据:11100100 10111000 10101101。
Byte-level BPE 算法把文本的字节作为直接操作的对象,减少了占用空间
Tokenizer 的好处
1. 克服长尾效应 OOV
直接把极低频的单词和字符当作 token,本身意味着数据量的缺乏,会导致它有可能不在词表中(Out Of Vocabulary,OOV),对 NLP 模型的性能产生很大的影响。因此,引入 Tokenizer,采用 BPE 算法可以避免低频词作为 token。
2. 支持多语言
Byte-level BPE 算法的设计,使得一份词表中包含了多种语言的字符,支持模型的多语言处理功能。
词嵌入(Embedding)
ChatGPT 的输入文字转换为 token 之后,还需要将 token 再转换为张量,这个过程叫做词嵌入( Embedding),同时 embedding 也指被转换后得到的张量本身。
在神经网络中,张量 ( Tensor ) 是指多维数组,它可以存储和处理大量的数据,是神经网络中最基本的数据结构。张量一般都以浮点数作为元素进行填充。token 需要先转换为 浮点 数字,再进入模型中进行计算
向量(vector),就是高中数学中的概念,一般就可以看作是一维张量。
在实际模型当中,一次性输入给模型的 token 数量N输入token数N输入token数 并不是无限大的
ChatGPT 考虑到模型的每个 token 相互之间的顺序不能改变,需要明确地在输入端标识出每个 token 的位置张量(Position Embedding),其大小和 token 的 embedding 是一致的。两者以如下形式融合起来:
在模型中,需要从输入端将输入1(Q1)、输出1(A1)、输入2(Q2)等部分信息区分出来。这几个部分信息分别叫做一个 segment,其中每一个 segment 都包含了多个 token,它们共享了同一个 segment embedding。
Embedding 的好处:
1. Embedding 方便接入大规模神经网络
2. Embedding 建立了自然语言的语义与数学之间的关联关系