一文教你读懂GPT模型的工作原理

前言

在AI盛起的当下,各类AI应用不断地出现在人们的视野中,AI正在重塑着各行各业。ChatGPT一直这股AI浪潮的引领者,在各类不断涌现的大模型中,目前还没有出现能与ChatGPT比肩的。笔者前前后后看了很多篇介绍GPT的文章,看到这篇文章时有种眼前一亮的感觉。一篇收获颇多的文章,翻译整理如下,感兴趣的请点赞收藏。

GPT模型的工作原理

在本文中,我们将深入探讨OpenAI的GPT(Generative Pre-trained Transformer)模型的核心概念和工作原理。


介绍

在2021年,我写下了我使用GPT模型的前几行代码,那一刻我意识到文本生成已经达到了一个拐点。在此之前,我在研究生阶段从零开始编写语言模型,并且有使用其他文本生成系统的经验,所以我知道让它们产生有用的结果是多么困难。我很幸运地在Azure OpenAI服务发布GPT-3的公告时提前获得了对GPT-3的使用权限,并在发布之前对其进行了尝试。我让GPT-3总结了一篇长文档,并进行了一些few-shot提示的实验。我可以看到结果比以前的模型要先进得多,让我对这项技术感到兴奋,并渴望了解它的实现方式。现在,后续的GPT-3.5、ChatGPT和GPT-4模型正在迅速得到广泛应用,领域中的更多人也对它们的工作原理感到好奇。虽然它们内部工作的细节是专有且复杂的,但所有的GPT模型都共享一些基本的思想,这些思想并不太难理解。我在这篇文章中的目标是向数据科学家和机器学习工程师解释语言模型的核心概念,特别是GPT模型。

生成式语言模型的工作原理

让我们首先了解生成式语言模型的工作原理。基本的想法是:它们以n个标记作为输入,并生成一个标记作为输出。

这似乎是一个相当直观的概念,但为了真正理解它,我们需要知道什么是标记。

标记是一段文本的片段。在OpenAI的GPT模型中,常见和短的单词通常对应一个标记,例如下面图片中的单词“We”。长且不常用的单词通常被拆分为多个标记。例如下面图片中的单词“anthropomorphizing”被拆分为三个标记。缩写词如“ChatGPT”可以表示为一个标记,也可以拆分为多个标记,这取决于字母组合出现的频率。您可以访问OpenAI的Tokenizer页面[1],输入您的文本,查看它如何被拆分为标记。您可以选择“GPT-3”的分词方式,用于处理文本,或选择“Codex”的分词方式,用于处理代码。我们将保持默认的“GPT-3”设置。

您还可以使用OpenAI的开源tiktoken库[2]以Python代码进行分词。OpenAI提供了几种不同的分词器,每种分词器的行为略有不同。在下面的代码中,我们使用了“davinci”模型的分词器,它是一个GPT-3模型,以匹配您在UI中看到的行为。

import tiktoken


# 获取“davinci” GPT3模型的编码,即“r50k_base”编码。


encoding = tiktoken.encoding_for_model("davinci")


text = "We need to stop anthropomorphizing ChatGPT."  
print(f"text: {text}")


token_integers = encoding.encode(text)  
print(f"total number of tokens: {encoding.n_vocab}")


print(f"token integers: {token_integers}")  
token_strings = [encoding.decode_single_token_bytes(token) for token in token_integers]  
print(f"token strings: {token_strings}")  
print(f"number of tokens in text: {len(token_integers)}")


encoded_decoded_text = encoding.decode(token_integers)  
print(f"encoded-decoded text: {encoded_decoded_text}")

文本:We need to stop anthropomorphizing ChatGPT.

标记的总数:50257 标记的整数表示:[1135, 761, 284, 2245, 17911, 25831, 2890, 24101, 38, 11571, 13]

标记的字符串表示:[b'We', b' need', b' to', b' stop', b' anthrop', b'omorph', b'izing', b' Chat', b'G', b'PT', b'.']

文本中的标记数:11

编码-解码的文本:我们需要停止对ChatGPT进行拟人化。

您可以在代码的输出中看到,该分词器包含50257个不同的标记,并且每个标记在内部映射为一个整数索引。给定一个字符串,我们可以将其拆分为整数标记,并将这些整数转换为它们对应的字符序列。编码和解码一个字符串应该始终能够还原原始字符串。

这给您一个对OpenAI的分词器如何工作的良好直觉,但您可能想知道为什么他们选择了这些标记长度。让我们考虑一些其他的分词选项。假设我们尝试最简单的实现,其中每个字母都是一个标记。这样可以很容易地将文本分割为标记,并且可以保持不同标记的总数较小。然而,与OpenAI的方法相比,我们无法编码 nearly 同样多的信息。如果我们在上面的例子中使用基于字母的标记,11个标记只能编码“We need to”,而11个OpenAI的标记可以编码整个句子。事实证明,当前的语言模型对它们可以接收的标记的最大数量有限制。因此,我们希望在每个标记中尽可能多地包含信息。

现在让我们考虑每个单词作为一个标记的情况。与OpenAI的方法相比,我们只需要七个标记来表示相同的句子,这似乎更高效。而且按单词拆分也很容易实现。然而,语言模型需要拥有可能遇到的所有标记的完整列表,对于整个单词来说这是不可行的,不仅因为词典中有很多单词,而且因为很难跟上特定领域术语和任何新创造的单词。

因此,OpenAI选择了两个极端之间的解决方案也就不足为奇了。其他公司也发布了遵循类似方法的分词器,例如 Google 的 Sentence Piece[3]

现在我们对标记有了更好的理解,让我们回到我们最初的图表,看看我们是否能更好地理解它。生成模型接收n个标记作为输入,这些标记可以是几个单词、几个段落或几页。然后它们生成一个输出标记,可以是一个短单词或一个单词的一部分。

这样现在更有一些意义了。

但是如果你尝试过 OpenAI 的 ChatGPT[4],你会发现它生成的不只是一个标记,而是多个标记。这是因为这个基本思想应用了一个扩展窗口的模式。你将n个标记作为输入,它生成一个标记作为输出,然后将这个输出标记作为下一次迭代的一部分输入,再生成一个新的标记作为输出,依此类推。这个模式一直重复,直到达到停止条件,表示它已经生成了你所需要的所有文本。

例如,如果我将"We need to"作为输入提供给我的模型,算法可能会产生如下的结果:

在使用 ChatGPT 的过程中,你可能还注意到模型不是确定性的:如果你两次询问完全相同的问题,你很可能会得到两个不同的答案。这是因为模型实际上并不产生一个单独的预测标记;相反,它返回了所有可能标记的概率分布。换句话说,它返回一个向量,其中每个条目表示选择某个特定标记的概率。然后模型从该分布中进行采样以生成输出标记。

模型是如何得出那个概率分布的呢?这就是训练阶段的作用。在训练过程中,模型会接触大量的文本,并且通过调整权重来预测给定输入标记序列的良好概率分布。GPT 模型是使用互联网的大量数据进行训练的,因此它们的预测结果反映了它们所见到的信息的混合。

现在,你已经对生成模型的思想有了很好的理解。注意,我只是解释了这个思想,还没有给出具体的算法。事实上,这个思想已经存在了几十年,并且多年来已经使用了几种不同的算法进行实现。接下来,我们将看一些这些算法。

生成语言模型的简要历史

隐马尔可夫模型(Hidden Markov Models,HMM)在20世纪70年代变得流行起来。它们的内部表示编码了句子的语法结构(名词、动词等),并且在预测新词时使用这些知识。然而,由于它们是马尔可夫过程,在生成新词时只考虑最近的标记。因此,它们实现了一个非常简单的“n个标记进入,一个标记输出”的思想,其中n=1。结果是,它们无法生成非常复杂的输出。让我们看下面的例子:

如果我们将“The quick brown fox jumps over the”作为输入提供给语言模型,我们期望它返回“lazy”。然而,HMM只看到最后一个标记“the”,凭借如此少的信息,它很可能无法给出我们期望的预测结果。随着人们对HMM的实验,逐渐明确了语言模型需要支持多个输入标记才能生成良好的输出。

N-gram模型在20世纪90年代变得流行,因为它们通过接受多个标记作为输入解决了HMM的主要限制。对于前面的例子,一个n-gram模型可能很好地预测出单词“lazy”。

n-gram的最简单实现是使用基于字符的标记的二元模型(bi-gram),它可以根据单个字符预测序列中的下一个字符。你可以只用几行代码创建一个这样的模型,我鼓励你试一试。首先,计算训练文本中不同字符的数量(我们称之为n),并创建一个n x n的二维矩阵,并将其初始化为零。每对输入字符可以用来定位该矩阵中的特定条目,通过选择对应于第一个字符的行和对应于第二个字符的列。在解析训练数据时,对于每对字符,只需将一个加到相应的矩阵单元格中。例如,如果你的训练数据包含单词“car”,则会将一个加到“c”行和“a”列的单元格中,然后将一个加到“a”行和“r”列的单元格中。一旦你累积了所有训练数据的计数,通过将每个单元格除以该行的总数,将每行转换为概率分布。

然后,为了进行预测,你需要给模型一个单个字符的起始值,比如“c”。你查找对应于“c”行的概率分布,并从该分布中进行采样以生成下一个字符。然后,你取生成的字符,重复这个过程,直到达到停止条件。高阶n-gram模型遵循相同的基本思想,但它们能够通过使用n维张量来查看更长的输入标记序列。

N-gram模型很容易实现。然而,随着输入标记数量的增加,矩阵的大小呈指数级增长,因此它们在处理更大数量的标记时无法很好地扩展。而且,仅凭几个输入标记,它们无法产生良好的结果。需要一种新的技术来继续在这个领域取得进展。

在2000年代,循环神经网络(Recurrent Neural Networks,RNNs)变得非常流行,因为它们能够接受比之前的技术更大数量的输入标记。特别是LSTM和GRU这两种类型的RNN广泛应用,并且能够生成相当不错的结果。

RNN是一种神经网络,但与传统的前馈神经网络不同,它的架构可以适应接受任意数量的输入和生成任意数量的输出。例如,如果我们给一个RNN输入标记“We”、“need”和“to”,并希望它生成更多的标记直到出现一个完整的句号,该RNN的结构可能如下所示:

在上面的结构中,每个节点具有相同的权重。你可以将其视为一个连接到自身并重复执行的单个节点(因此被称为“循环”),或者可以按照上图所示的展开形式来理解。LSTM和GRU相对于基本的RNN增加了一个关键的能力,即具有内部记忆单元(memory cell),该记忆单元从一个节点传递到下一个节点。这使得后续节点能够记住前面节点的某些方面,这对于进行良好的文本预测至关重要。

然而,RNN在处理非常长的文本序列时存在不稳定性问题。模型中的梯度往往会呈指数增长(称为“梯度爆炸”)或趋近于零(称为“梯度消失”),导致模型无法继续从训练数据中学习。LSTM和GRU可以缓解梯度消失问题,但并不能完全解决。因此,即使从理论上讲它们的架构允许输入任意长度的序列,实际上还是存在长度限制。一次又一次地,文本生成的质量受到算法支持的输入标记数量的限制,需要有一个新的突破。

2017年,Google发布了介绍Transformers的论文[5],我们进入了文本生成的一个新时代。Transformers中使用的架构允许大幅增加输入标记的数量,消除了RNN中出现的梯度不稳定性问题,并且高度可并行化,这意味着它能够充分利用GPU的计算能力。Transformers今天被广泛使用,并且是OpenAI选择用于其最新的GPT文本生成模型的技术。

Transformers基于“注意力机制”(attention mechanism),它使模型能够对一些输入比其他输入更加关注,而不考虑它们在输入序列中的位置。例如,考虑以下句子:

在这种情况下,当模型预测动词“bought”时,它需要匹配动词“went”的过去时态。为了做到这一点,它必须非常关注标记“went”。实际上,尽管“went”在输入序列中出现得更早,但模型可能对标记“went”的关注程度比对标记“and”的关注程度更高。

GPT模型中的这种选择性注意行为是通过2017年论文中的一个新颖思想实现的:使用“掩码多头注意力”(masked multi-head attention)层。让我们对这个术语进行拆解,并深入探讨它的每个子术语:

Attention(注意力):一个“注意力”层包含一个权重矩阵,表示输入句子中所有标记位置之间关系的强度。这些权重在训练过程中被学习到。如果对应于一对位置的权重很大,则这两个位置上的标记会对彼此产生很大影响。这就是使得Transformer能够关注某些标记而不是其他标记的机制,而不考虑它们在句子中的位置。

Masked(掩码):如果注意力层的矩阵被限制在每个标记位置与输入中较早位置之间的关系上,则该注意力层被“掩码”。这是GPT模型用于文本生成的方式,因为输出标记只能依赖于它之前的标记。

Multi-head(多头):Transformer使用掩码的“多头”注意力层,因为它包含多个并行操作的掩码注意力层。

LSTM和GRU的记忆单元还使后续的标记能够记住先前标记的某些方面。然而,如果两个相关的标记相隔很远,梯度问题可能会成为一个障碍。Transformer没有这个问题,因为每个标记与前面的所有标记都有直接连接。

现在您已经理解了Transformer架构在GPT模型中的主要思想,让我们来看看当前可用的各种GPT模型之间的区别。

不同的GPT模型的实现方式

截至撰写本文时,OpenAI发布的最新文本生成模型有GPT-3.5、ChatGPT和GPT-4,它们都基于Transformer架构。实际上,“GPT”代表“生成式预训练Transformer”。

GPT-3.5是一个以补全式模型为基础的Transformer,这意味着如果我们给它几个词作为输入,它能够生成几个在训练数据中可能跟随它们的词语。

ChatGPT则是作为一种会话式模型进行训练,这意味着当我们与它进行交流时,它的表现最佳。它基于与GPT-3.5相同的Transformer基础模型,但使用了对话数据进行了微调。然后,通过人类反馈的强化学习(RLHF)进一步进行微调,这是OpenAI在其《2022 InstructGPT》论文中介绍的一种技术。在这个技术中,我们将相同的输入输入模型两次,得到两个不同的输出,并询问人类评级员它更喜欢哪个输出。这个选择然后用于通过微调改进模型。这种技术能够使模型的输出与人类期望保持一致,这对于OpenAI最新模型的成功至关重要。

另一方面,GPT-4既可以用于补全,也可以用于对话,并且具有全新的基础模型。这个基础模型也使用RLHF进行微调,以更好地与人类期望保持一致。

编写使用GPT模型的代码

您有两种选择来编写使用GPT模型的代码:可以直接使用OpenAI API,也可以使用Azure上的OpenAI API。无论哪种方式,您都可以使用相同的API调用编写代码,您可以在OpenAI的API参考页面上了解这些调用。

两者之间的主要区别在于Azure提供以下额外功能:

•自动负责的AI过滤器,以减轻API的不道德使用

•Azure的安全功能,如私有网络

•区域可用性,以在与API进行交互时获得最佳性能

如果您正在编写使用这些模型的代码,您需要选择要使用的特定版本。以下是目前在Azure OpenAI服务中提供的版本的简要速查表:

•GPT-3.5: text-davinci-002、text-davinci-003

•ChatGPT: gpt-35-turbo

•GPT-4: gpt-4、gpt-4-32k

这两个GPT-4版本的主要区别在于它们支持的标记数:gpt-4支持8,000个标记,而gpt-4-32k支持32,000个标记。相比之下,GPT-3.5模型只支持4,000个标记。

由于GPT-4目前是最昂贵的选择,建议您先使用其他模型开始,并在必要时再升级。有关这些模型的更多详细信息,请查阅文档[6]

结论

在本文中,我们介绍了所有生成式语言模型的基本原理,以及特别是OpenAI最新的GPT模型的独特方面。

在这过程中,我们强调了语言模型的核心思想:“n个标记作为输入,输出一个标记。”我们探讨了标记是如何分割的,以及为什么要以这种方式进行分割。我们追溯了语言模型从早期的隐马尔可夫模型到最近的基于Transformer的模型的几十年演变过程。最后,我们描述了OpenAI最新的基于Transformer的GPT模型,介绍了它们的实现方式,以及如何编写代码来使用它们。

通过阅读本文,您应该已经具备了关于GPT模型的相关知识,并可以开始在自己的编程项目中使用它们。我计划撰写更多关于语言模型的解释性文章,所以请关注我并告诉我您希望了解哪些主题!感谢您的阅读!

声明

本文翻译整理自:https://towardsdatascience.com/how-gpt-models-work-b5f4517d5b5,感兴趣的请点赞、收藏。

References

[1] Tokenizer页面: https://platform.openai.com/tokenizer
[2] tiktoken库:
https://github.com/openai/tiktoken
[3] Sentence Piece:
https://github.com/google/sentencepiece
[4] OpenAI 的 ChatGPT:
https://chat.openai.com/
[5] 论文:
https://arxiv.org/abs/1706.03762
[6] 文档:
https://learn.microsoft.com/en-us/azure/cognitive-services/openai/concepts/models

展开阅读全文

页面更新:2024-05-12

标签:模型   分词   梯度   单词   标记   字符   文本   思想   语言   代码

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top