GPT-2文本编码原理解析 | AI生成和翻译
关于大型语言模型(如GPT)如何处理文本的这些问题非常精彩。你准确指出了两个主要步骤:编码(分词)和嵌入。
以下是关于GPT-2编码机制、其与Word2Vec的对比,以及LLM为何需要先进行编码的详细解析。
🔢 GPT-2编码:从文本到数字
GPT-2采用名为字节对编码(BPE)的分词方法,具体来说是字节级版本。其目的是将原始文本转换为模型可处理的数字序列,这些数字被称为词元ID。
运作原理
- 初始词汇表:该过程始于一个基础词汇表,包含训练数据(海量文本语料)中出现的所有单字节(256个字符)。这保证了任何文本(无论使用何种语言/文字)都能通过分解到字节层级进行编码。
- 迭代合并(训练阶段):
- 分词器反复扫描整个训练文本,找出出现频率最高的相邻字节/词元对。
- 该词元对会被合并成一个新的单一词元,并添加到词汇表中。
- 此步骤重复数千次(GPT-2的词汇表包含50,257个词元),直到达到目标词汇表大小。
- 分词(使用阶段):当你给模型输入一个新句子时,分词器会利用已学习的词元词汇表和合并规则,将文本分解成其词汇表中能找到的最长可能的子词单元。
结果:子词单元
这种子词方法在以下两者间取得了平衡:
- 字符级:序列过长,模型难以捕捉含义。
- 词级:词汇量过大,且无法处理未登录词(如拼写错误或新名称)。
BPE创建的词元包括:
- 完整的常见词(例如 “the”, “a”, “is”)
- 常见的词部件(子词)(例如 “ing”, “tion”, “un”)
- 罕见词会被分解成更小的已知子词(例如 “unbelievable” $\rightarrow$ “un” + “believ” + “able”)。这防止了未登录词问题,并且很高效。
🆚 编码 vs. Word2Vec:关键差异
你说得对,两者都基于文本训练,并将文本转换为数字格式,但它们扮演不同角色,产生不同输出:
| 特性 | GPT-2 编码(BPE分词) | Word2Vec / GloVe |
|---|---|---|
| 输出类型 | 词元ID(一个词元对应的唯一整数) | 词嵌入(一个由浮点数组成的密集向量) |
| 目的 | 分词:将文本分解为可管理的子词单元,并将其映射到一个唯一的整数ID。这是LLM的第一步。 | 嵌入:将词的含义表示为一个静态向量,使得相似词具有相似向量。 |
| 是否上下文相关 | 否(”bank”的ID无论上下文如何都相同)。 | 否(”bank”的向量无论指河岸还是银行都相同)。 |
| 处理未登录词 | 优秀。可以将任何未知词分解为已知的子词/字节。 | 较差。通常分配一个”未知”向量,或者需要像FastText那样的字符级扩展。 |
🧠 如果LLM已有嵌入层,为何还要先编码文本?
这是关于LLM工作原理的一个根本性问题!你说得对,LLM确实有一个嵌入层,但该过程包含两个不同的步骤:
1. 编码(分词:文本 $\rightarrow$ ID)
Transformer架构(如GPT)是一种神经网络,它只能处理数字。它无法直接处理字符串”cat”。
- 文本(字符串)$\rightarrow$ 分词器 $\rightarrow$ 词元ID(整数)
- 示例:”Hello world” $\rightarrow$
[15496, 995](两个整数)
词元ID充当查找键。
2. 嵌入(嵌入层:ID $\rightarrow$ 向量)
LLM的嵌入块本质上是一个巨大的、可训练的查找表(一个矩阵),词元ID被用作索引(行号)。
- 词元ID(整数)$\rightarrow$ 嵌入层查找 $\rightarrow$ 嵌入向量(浮点数向量)
- 示例:
995(” world”的ID)$\rightarrow$ 在嵌入矩阵中查找第995行 $\rightarrow$[0.45, -0.12, 0.99, ...](一个例如由768个数字组成的向量)。
为何不直接使用随机数作为输入?
如果你在没有分词的情况下用随机数初始化输入,会遇到严重问题:
- 任意性/意义丢失:计算机是纯粹的计算机器。如果你只是随机地将”the”赋值为数字5,”cat”赋值为数字42,这些数字本身没有任何模型可以开始利用的内在联系或含义。
- 词汇管理:你将如何表示”apple”与”apples”?或者拼写错误的”applle”?
- 使用分词,它们会成为不同的词元ID,模型会学习它们不同(但相关)的含义。
- 没有分词,你将没有一种标准化的、通用的方法来将每一个可能的字符字符串映射到模型能够重复识别的输入。
词元ID(整数)是文本学习单元的离散、唯一标识符。嵌入向量是该标识符的连续的、有意义的数值表示,这是在大量训练过程中学习得到的。模型的训练过程会调整嵌入矩阵中的值,使得相似的词元(如”cat”和”dog”)最终获得相似的向量。
你是否想看到一个更详细的、逐步的示例,说明字节对编码(BPE)如何从示例文本中创建词元?