关于程序员:GPT-模型的工作原理-你知道吗

5次阅读

共计 6824 个字符,预计需要花费 18 分钟才能阅读完成。

动动发财的小手,点个赞吧!

Source

简介

当我应用 GPT 模型编写我的前几行代码时是 2021 年,那一刻我意识到文本生成曾经到了一个拐点。在此之前,我在研究生院从头开始编写语言模型,并且我有应用其余文本生成零碎的教训,所以我晓得让它们产生有用的后果是如许艰难。作为我在 Azure OpenAI 服务中公布 GPT-3 的布告工作的一部分,我很侥幸可能及早应用 GPT-3,并且我尝试了它以筹备它的公布。我让 GPT-3 总结了一份长文档,并尝试了大量提醒。我能够看到后果比以前的模型先进得多,这让我对这项技术感到兴奋,并渴望理解它是如何施行的。而当初后续的 GPT-3.5、ChatGPT 和 GPT-4 模型正在迅速取得宽泛采纳,该畛域的更多人也对它们的工作原理感到好奇。尽管其外部运作的细节是专有且简单的,但所有 GPT 模型都共享一些不太难了解的根本思维。我这篇文章的指标是解释个别语言模型的外围概念,特地是 GPT 模型,并针对数据科学家和机器学习工程师进行解释。

生成语言模型的工作原理

让咱们从摸索生成语言模型的工作原理开始。最根本的想法如下:他们将 n 个标记作为输出,并产生一个标记作为输入。

这仿佛是一个相当简略的概念,但为了真正了解它,咱们须要晓得 token 是什么。

token是一段文本。在 OpenAI GPT 模型的上下文中,常用词和短词通常对应于单个标记,例如下图中的“咱们”一词。长的和不罕用的词通常被分解成几个标记。例如,下图中的“拟人化”一词被合成为三个标记。像“ChatGPT”这样的缩写能够用单个标记示意,也能够分解成多个,具体取决于字母一起呈现的常见水平。你能够去 OpenAI 的 Tokenizer 页面,输出你的文本,而后看看它是如何被宰割成标记的。您能够在用于文本的“GPT-3”标记化和用于代码的“Codex”标记化之间进行抉择。咱们将保留默认的“GPT-3”设置。

您还能够应用 OpenAI 的开源 tiktoken 库应用 Python 代码进行标记化。OpenAI 提供了一些不同的分词器,每个分词器的行为都略有不同。在上面的代码中,咱们应用“davinci”的分词器(一种 GPT-3 模型)来匹配您应用 UI 看到的行为。

import tiktoken

# Get the encoding for the davinci GPT3 model, which is the "r50k_base" encoding.
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}")
text: We need to stop anthropomorphizing ChatGPT.
total number of tokens: 50257
token integers: [1135, 761, 284, 2245, 17911, 25831, 2890, 24101, 38, 11571, 13]
token strings: [b'We', b'need', b'to', b'stop', b'anthrop', b'omorph', b'izing', b'Chat', b'G', b'PT', b'.']
number of tokens in text: 11
encoded-decoded text: We need to stop anthropomorphizing ChatGPT.

您能够在代码的输入中看到这个分词器蕴含 50,257 个不同的分词,并且每个分词都在外部映射到一个整数索引。给定一个字符串,咱们能够将其拆分为整数标记,而后咱们能够将这些整数转换为它们对应的字符序列。对字符串进行编码和解码应该始终返回原始字符串。

这让您对 OpenAI 的分词器如何工作有一个很好的直觉,但您可能想晓得他们为什么抉择这些分词长度。让咱们思考一些其余的标记化选项。假如咱们尝试最简略的实现,其中每个字母都是一个标记。这使得将文本合成为标记变得容易,并使不同标记的总数放弃较小。然而,咱们无奈像 OpenAI 的办法那样编码尽可能多的信息。如果咱们在下面的例子中应用基于字母的标记,11 个标记只能编码“咱们须要”,而 OpenAI 的 11 个标记能够编码整个句子。事实证明,以后的语言模型对它们能够接管的令牌的最大数量有限度。因而,咱们心愿在每个令牌中包装尽可能多的信息。

当初让咱们思考每个单词都是一个标记的场景。与 OpenAI 的办法相比,咱们只须要七个标记来示意同一个句子,这仿佛更有效率。按词拆分也很容易实现。然而,语言模型须要有一个它们可能遇到的标记的残缺列表,而这对于整个单词来说是不可行的——不仅因为字典中的单词太多,而且很难跟上畛域的步调——特定术语和创造的任何新词。

因而,OpenAI 抉择介于这两个极其之间的解决方案也就难能可贵了。其余公司曾经公布了遵循相似办法的分词器,例如 Google 的 Sentence Piece。

当初咱们对令牌有了更好的了解,让咱们回到咱们原来的图表,看看咱们是否能更好地了解它。生成模型承受 n 个标记,能够是几个词、几段或几页。他们输入一个标记,能够是一个短词或一个词的一部分。

当初这更有意义了。

然而如果你玩过 OpenAI 的 ChatGPT,你就会晓得它会产生很多令牌,而不仅仅是一个令牌。那是因为这个根本思维利用于扩大窗口模式。你给它 n 个令牌,它产生一个令牌输入,而后它将该输入令牌合并为下一次迭代输出的一部分,产生一个新的令牌输入,等等。此模式一直反复,直到达到进行条件,表明它已实现生成您须要的所有文本。

例如,如果我输出“We need to”作为模型的输出,算法可能会产生如下所示的后果:

在玩 ChatGPT 时,您可能还留神到该模型不是确定性的:如果您两次问完全相同的问题,您可能会失去两个不同的答案。那是因为该模型实际上并没有产生单个预测标记;相同,它返回所有可能标记的概率分布。换句话说,它返回一个向量,其中每个条目都示意抉择特定标记的概率。而后模型从该散布中采样以生成输入标记。

该模型如何得出该概率分布?这就是训练阶段的目标。在训练期间,该模型会接触到大量文本,并且在给定输出标记序列的状况下调整其权重以预测良好的概率分布。GPT 模型应用大部分互联网进行训练,因而他们的预测反映了他们所看到的信息的组合。

您当初对生成模型背地的想法有了很好的了解。请留神,尽管我只是解释了这个想法,但我还没有给你一个算法。事实证明,这个想法曾经存在了几十年,并且多年来始终应用几种不同的算法来实现。接下来咱们将看看其中的一些算法。

生成语言模型简史

隐马尔可夫模型 (HMM) 在 1970 年代开始风行。它们的外部示意对句子(名词、动词等)的语法结构进行编码,并在预测新词时应用这些常识。然而,因为它们是马尔可夫过程,所以它们在生成新令牌时只思考最近的令牌。因而,他们实现了一个非常简单的“n 个标记输出,一个标记输入”想法,其中 n = 1。因而,它们不会生成非常复杂的输入。让咱们思考以下示例:

如果咱们将“The quick brown fox jumps over the”输出到语言模型,咱们会冀望它返回“lazy”。然而,HMM 只会看到最初一个标记“the”,并且在信息如此少的状况下,它不太可能给出咱们冀望的预测。随着人们对 HMM 进行试验,很显著语言模型须要反对多个输出标记能力生成良好的输入。

N-gram 在 1990 年代开始风行,因为它们通过将多个标记作为输出来修复 HMM 的次要限度。n-gram 模型可能会很好地预测后面示例中的“懈怠”一词。

n-gram 的最简略实现是具备基于字符的标记的二元语法,给定单个字符,可能预测序列中的下一个字符。您只需几行代码就能够创立其中一个,我激励您尝试一下。首先,计算训练文本中不同字符的数量(咱们称之为 n),并创立一个用零初始化的 n x n 二维矩阵。通过抉择对应于第一个字符的行和对应于第二个字符的列,每对输出字符可用于定位该矩阵中的特定条目。在解析训练数据时,对于每一对字符,只需将一个字符增加到相应的矩阵单元格即可。例如,如果您的训练数据蕴含单词“car”,您能够向“c”行和“a”列中的单元格增加一个,而后向“a”行和“r”列中的单元格增加一个柱子。一旦您累积了所有训练数据的计数,将每一行转换为概率分布,办法是将每个单元格除以该行的总数。

而后要进行预测,您须要给它一个字符作为结尾,例如“c”。您查找对应于“c”行的概率分布,并对该散布进行采样以生成下一个字符。而后你抉择你制作的角色,反复这个过程,直到你达到进行条件。高阶 n-gram 遵循雷同的根本思维,但它们可能通过应用 n 维张量来查看更长的输出标记序列。

N-grams 很容易实现。然而,因为矩阵的大小随着输出标记数量的减少呈指数增长,因而它们不能很好地扩大到更大数量的标记。而且只有几个输出令牌,它们无奈产生好的后果。须要一种新技术来持续在该畛域获得停顿。

在 2000 年代,递归神经网络 (RNN) 变得十分风行,因为它们可能承受比以前的技术多得多的输出标记。特地是作为 RNN 类型的 LSTM 和 GRU,失去了宽泛的利用,并被证实可能产生相当好的后果。

RNN 是一种神经网络,但与传统的前馈神经网络不同,它们的架构能够适应承受任意数量的输出并产生任意数量的输入。例如,如果咱们给 RNN 输出标记“We”、“need”和“to”,并心愿它生成更多标记直到达到一个残缺点,RNN 可能具备以下构造:

下面构造中的每个节点都具备雷同的权重。您能够将其视为连贯到本身并反复执行的单个节点(因而称为“循环”),或者您能够将其视为上图中显示的扩大模式。在根本 RNN 上增加到 LSTM 和 GRU 的一个要害性能是存在一个从一个节点传递到下一个节点的外部存储单元。这使前面的节点可能记住先前节点的某些方面,这对于做出良好的文本预测至关重要。

然而,RNN 在解决十分长的文本序列时存在不稳固问题。模型中的梯度趋向于呈指数增长(称为“爆炸梯度”)或减小为零(称为“隐没梯度”),从而阻止模型持续从训练数据中学习。LSTM 和 GRU 能够缓解梯度隐没问题,但不能齐全阻止它。因而,即便在实践上他们的架构容许任何长度的输出,但实际上对该长度有限度。再次,文本生成的品质受到算法反对的输出令牌数量的限度,须要新的冲破。

2017 年,介绍 Transformers 的论文被谷歌公布,咱们进入了文本生成的新时代。Transformers 中应用的架构容许大幅减少输出令牌的数量,打消了 RNN 中呈现的梯度不稳固问题,并且高度可并行化,这意味着它可能利用 GPU 的弱小性能。Transformers 在明天被宽泛应用,它们是 OpenAI 为其最新的 GPT 文本生成模型抉择的技术。

Transformer 基于“注意力机制”,它容许模型比其余输出更多地关注某些输出,而不论它们呈现在输出序列中的什么地位。例如,让咱们思考以下句子:

在这种状况下,当模型预测动词“bought”时,它须要匹配动词“went”的过来式。为了做到这一点,它必须十分关注“去了”的令牌。事实上,它可能更关注标记“went”而不是标记“and”,只管事实上“went”在输出序列中呈现得更早。

GPT 模型中的这种选择性留神行为是由 2017 年论文中的一个新鲜想法实现的:应用“蒙面多头留神”层。让咱们合成这个术语,并深入研究它的每个子术语:

  • Attention:“留神”层蕴含一个权重矩阵,示意输出句子中所有标记地位对之间的关系强度。这些权重是在训练期间学习的。如果一对仓位对应的权重很大,那么这两个仓位中的 token 相互影响很大。这种机制使 Transfomer 可能比其余标记更多地关注某些标记,而不论它们呈现在句子中的什么地位。
  • Masked:如果矩阵仅限于每个标记地位与输出中较早地位之间的关系,则注意力层被“屏蔽”。这就是 GPT 模型用于文本生成的内容,因为输入标记只能依赖于它之前的标记。
  • Multi-head:Transformer 应用蒙面的“多头”留神层,因为它蕴含多个并行操作的蒙面留神层。

LSTM 和 GRU 的记忆单元还使起初的标记可能记住晚期标记的某些方面。然而,如果两个相干的标记相距很远,梯度问题可能会成为阻碍。变形金刚没有这个问题,因为每个标记都间接连贯到它之前的所有其余标记。

当初您理解了 GPT 模型中应用的 Transformer 架构的次要思维,让咱们看一下以后可用的各种 GPT 模型之间的区别。

不同的 GPT 模型是如何实现的

在撰写本文时,OpenAI 最新公布的三种文本生成模型别离是 GPT-3.5、ChatGPT 和 GPT-4,它们均基于 Transformer 架构。事实上,“GPT”代表“Generative Pre-trained Transformer”。

GPT-3.5 是一个作为实现式模型训练的转换器,这意味着如果咱们给它几个词作为输出,它可能生成更多可能在训练数据中追随它们的词。

另一方面,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 目前是最低廉的抉择,因而最好从其余模型之一开始,并仅在须要时降级。无关这些模型的更多详细信息,请查看文档。

总结

在本文中,咱们介绍了所有生成语言模型共有的根本准则,尤其是来自 OpenAI 的最新 GPT 模型的独特之处。

在此过程中,咱们强调了语言模型的核心思想:“n 个标记输出,一个标记输入”。咱们探讨了代币是如何合成的,以及为什么要以这种形式合成。咱们追溯了语言模型从晚期的隐马尔可夫模型到最近的基于 Transformer 的模型长达数十年的演变。最初,咱们形容了来自 OpenAI 的三个最新的基于 Transformer 的 GPT 模型,每个模型是如何实现的,以及如何编写应用它们的代码。

到当初为止,您应该曾经筹备好就 GPT 模型进行有见地的对话,并开始在您本人的编码我的项目中应用它们。我打算写更多对于语言模型的解释,所以请关注我,让我晓得你心愿看到哪些主题!感谢您的浏览!

本文由 mdnice 多平台公布

正文完
 0