查看原文
其他

ChatGPT是如何运行起来的?(上)

学研妹 Java学研大本营 2024-01-02

在这篇文章中,我们将解释ChatGPT是如何工作的,以及为什么它能够产生连贯和多样化的对话。

长按关注《Java学研大本营》

1 每次增加一个词

ChatGPT能够自动生成一些看起来像人类写的文字,这很了不起并且出乎意料。但ChatGPT是如何做到的呢?为什么它能发挥作用?本文我大致介绍一下ChatGPT的内部情况,然后探讨一下为什么ChatGPT能很好地生成我们认为是有意义的文本。我把重点放在正在发生的事情的大画面上,虽然我会提到一些工程细节,但我不会深入研究它们。

首先要解释的是,ChatGPT从根本上说一直在努力做的是对它目前得到的任何文本进行 "合理的延续",这里的 "合理 "是指 "在看到人们在数十亿个网页上写的东西之后,人们可能期望某人写的东西。"

假设我们已经有了 "人工智能最好的东西是它的能力 "的文本。想象一下,扫描数十亿页人类书写的文本(例如在网络上和数字化书籍中),并找到这个文本的所有实例,然后看什么词在接下来的时间里出现了多少。ChatGPT有效地做了类似的事情,除了它不看字面文本;它寻找在某种意义上 "意义相符 "的东西。最终的结果是,ChatGPT产生了一个可能紧随其后的词的排序列表,以及 "概率":

值得注意的是,当ChatGPT做一些事情,比如写一篇文章时,它所做的基本上只是一遍又一遍地问:"鉴于目前的文本,下一个词应该是什么?"每次都会添加一个词。(更准确地说,它在添加一个 "标记",这可能只是一个词的一部分,这就是为什么它有时可以 "编造新词 "的原因)。

ChatGPT得到一个带有概率的单词列表。但是,它究竟应该选择哪一个来添加到它正在写的文章(或其他什么)中呢?人们可能认为应该是 "排名最高 "的词(即被分配到最高 "概率 "的那个)。但是,这时就会有一点巫术开始悄悄出现。因为如果我们总是挑选排名最高的词,我们通常会得到一篇非常 "平淡 "的文章,似乎从来没有 "显示出任何创造力"。但是,如果我们有时(随机地)挑选排名较低的词,我们会得到一篇 "更有趣 "的文章。

这种随机性意味着如果我们多次使用相同的提示,基本每次都得到不同的文章。为了与巫术的想法保持一致,这里有一个特定的所谓 "温度 "参数,它决定了多长时间会使用排名较低的词。对于生成论文,事实证明,选择0.8的 "温度 "参数似乎是最好的。(需要强调的是,这里没有使用任何 "理论",这只是一个在实践中被发现的可行问题。例如,"温度 "的概念之所以存在,是因为恰好使用了统计物理学中熟悉的指数分布,但没有 "物理 "联系。)

在我继续之前,我解释一下,为了论述的目的,我几乎不会使用ChatGPT中的完整系统;相反,我通常会使用更简单的GPT-2系统,它有一个很好的特点,即它足够小,可以在标准的台式电脑上运行。因此,对于我展示的所有内容,我能够包括明确的Wolfram Language代码,你可以立即在你的计算机上运行。

例如,这里是如何获得上述概率表的。首先,我们必须检索底层的 "语言模型 "神经网络:

在后文中我们将看看这个神经网的内部,并介绍它是如何工作的。但现在我们只把这个 "网络模型 "作为一个黑匣子应用到我们得到的文本中,并要求模型按概率计算出前五个词:

这就把这个结果变成了一个明确的格式化的 "数据集":

下面是重复 "应用模型 "的情况--在每一步中加入概率最高的词(在此代码中指定为模型的 " decision"):

如果再继续下去会怎样?在这种("零温度")情况下,很快就会出现相当混乱和重复的情况:

如果不总是挑选 "顶级 "词,而是有时随机挑选 "非顶级 "词("随机性 "对应 "温度 "为0.8)呢?可以建立起文本:

每次这样做,都会有不同的随机选择,文本也会不同--如这5个例子:

即使在第一步,也有很多可能的 "下一个词 "可供选择(温度为0.8),尽管它们的概率下降得相当快(这个对数图上的直线对应于n-1 的 "幂律 "衰减,这是语言的一般统计中非常有特点的):

那么,如果时间更长会发生什么?这里有个随机的例子。它比"顶级 "词(零温度)的情况要好,但还是有点奇怪:

这是用最简单的GPT-2模型(来自2019年)完成的。如果使用更新的GPT-3模型,结果会更好。下面是用同样的 "提示 "产生的"顶级 "词(零温度)文本,用的最大的GPT-3模型:

![](https://files.mdnice.com/user/43644/6deab632-37b1-43f9-a9cd-ddf56106bcf3.png =70%x)

下面是在 "温度0.8 "参数的随机例子:

2 概率从何而来?

ChatGPT总是根据概率来选择下一个词,但这些概率从何而来?我们从一个更简单的问题开始:我们先考虑一次生成一个字母(而不是单词)的英语文本。我们怎样才能算出每个字母的概率呢?我们可以取一个英语文本的样本,然后计算不同字母在其中出现的频率。举例来说,下面对维基百科上关于 " cats "的文章中字母的统计:

同样也统计 "dogs "文章中的字母:

结果是相似的,但也不一样("o "在 "dogs "文章中无疑更常见,因为毕竟它出现在 "dog "这个词本身)。尽管如此,如果我们采取足够大的英语文本样本,可以期待最终得到相当一致的结果:

下面是一个样本,如果我们只是用这些概率生成一个字母序列,我们会得到什么:

我们可以通过添加空格来将其分解成 "单词",就好像它们是具有一定概率的字母一样:

我们可以把 "字长 "的分布与英语中的分布相一致,在制造 "单词 "方面做得稍微好一些:

这里我们没有碰巧得到任何 "真实的单词",但结果看起来稍微好一些。不过,要想更进一步,我们需要做的不仅仅是随机地分别挑选每个字母。例如,我们知道,如果我们有一个 "q",下一个字母基本上必须是 "u"。

这里有一个字母本身的概率图:

下图显示了典型英语文本中成对的字母("2-grams")的概率。可能的第一个字母显示在页面上,第二个字母显示在页面下:

例如,我们可以看到,"q "列是空白的(概率为零)除了 "u "行。现在我们不再一次生成一个字母的 "单词",而是一次生成两个字母,使用这些 "2-gram "概率。下面是一个结果的样本--其中恰好包括一些 "真实的词":

有了足够多的英语文本,我们不仅可以对单个字母或成对字母(2-grams)的概率进行相当好的估计,而且还可以对较长的字母运行进行估计。如果我们用逐渐变长的n-gram概率生成 "随机词",我们会发现它们逐渐变得 "更真实":

我们现在假设--像ChatGPT那样--我们是在处理整个单词,而不是字母。英语中大约有40,000个合理的常用词。通过查看大型英语文本语料库(比如几百万本书,总共有几千亿个单词),我们可以估算出每个单词的常用程度。利用这一点,我们可以开始生成 "句子",其中每个词都是独立随机抽取的,其出现的概率与语料库中的相同。下面是我们得到的一个样本:

从结果看,毫无意义。那么,我们如何才能做得更好呢?就像对待字母一样,我们可以考虑的不仅仅是单个词的概率,还有成对的或更长的词的n-grams的概率。在成对的情况下,以下是我们得到的5个例子,所有情况都是从 "cat "这个词开始的:

它正在变得稍微 "看起来很合理"。可以想象,如果我们能够使用足够长的n-grams,我们基本上会 "得到一个ChatGPT"。在这个意义上,我们会得到一些东西,可以生成具有 "正确的整篇论文概率 "的论文长度的单词序列。但问题是:从来没有足够的英语文本能够推导出这些概率。

在对网络的抓取中,可能有几千亿字;在已经数字化的书籍中,可能还有几千亿字。但是有了4万个常用词,即使是可能的2-grams的数量也已经是16亿了,可能的3-grams的数量是60万亿。所以我们没有办法从现有的文本中估计出所有这些的概率。而当我们达到20个字的 "文章片段 "时,可能性的数量比宇宙中的粒子数量还要多,所以从某种意义上说,它们永远不可能全部被写下来。

那么我们能做什么呢?最大的想法是建立一个模型,让我们估计序列出现的概率--尽管在所看的文本语料库中我们还从未明确见过这些序列。而ChatGPT的核心正是一个所谓的 "大型语言模型"(LLM),它的建立可以很好地估计这些概率。

3 什么是模型?

假设你想知道(就像伽利略在15世纪末所做的那样),从比萨塔的每一层落下的炮弹需要多长时间才能落地。你可以在每一种情况下测量它,并将结果制成一个表格。或者你可以做理论科学的精髓:建立一个模型,给出某种计算答案的程序,而不是仅仅测量和记住每个案例。

想象一下我们有数据(有点理想化),说明炮弹从不同楼层落下需要多长时间:

我们如何计算出炮弹从一个我们没有明确相关数据的楼层坠落需要多长时间?在这种特殊情况下,我们可以用已知的物理学定律来计算。但是,如果说我们所得到的只是数据,而我们不知道有什么基本定律在支配它,那么我们可以做一个数学上的猜测,比如我们应该用一条直线作为模型:

我们可以选择不同的直线。但这是平均来说最接近我们所得到的数据的一条。根据这条直线,我们可以估计出任何楼层的下降时间。

我们怎么知道要在这里尝试使用一条直线呢?在某种程度上,我们并不知道。这只是数学上简单的东西,而我们已经习惯了这样的事实:我们测量的很多数据都被数学上简单的东西很好地拟合。我们可以尝试一些数学上更复杂的东西--比如a+b x+cx2--在这种情况下可以更好:

不过,事情可能会出大错。比如这里是我们对a+b/x+c sin(x)所能做到的最好结果:

需要理解的是,从来没有一个 "无模型的模型"。你使用的任何模型都有一些特定的基础结构,同时有一组 "你可以转动的旋钮"(即你可以设置的参数)来适应你的数据。在ChatGPT的案例中,使用了很多这样的 "旋钮"--实际上有1750亿个。

令人瞩目的是,ChatGPT的基本结构足以使一个计算下一个单词概率的模型足够好,从而为我们提供合理的文章长度的文本。

推荐书单

《Java编程讲义》

《Java编程讲义》根据目前Java开发领域的实际需求,从初学者角度出发,详细讲解了Java技术的基础知识。全书共15章,包括Java开发入门,Java语言基础,Java控制结构,数组,面向对象编程,继承和多态,抽象类、接口和内部类,异常处理,Java常用类库,集合与泛型,Lambda表达式,输入-输出流,多线程,JDBC数据库技术,网络编程等内容。内容全面覆盖.1ava开发必备的基础知识点,结合生活化案例展开讲解,程序代码给出了详细的注释,能够使初学者轻松领会Java技术精髓,快速掌握Java开发技能。  《Java编程讲义》适合作为高等院校相关专业的教材及教学参考书,也适合作为Java开发入门者的自学用书,还可供开发人员查阅、参考。

购买链接:https://item.jd.com/13495830.html

精彩回顾

Java对比Python,谁才是编程王者?

10个强大的IntelliJ IDEA插件

Spring boot使用gRPC 的详细教程

使用JMH提升Java程序的性能

Java中的继承与多态

长按关注《Java学研大本营》
长按访问【IT今日热榜】,发现每日技术热点
继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存