产品沉思录 产品沉思录 产品沉思录 产品沉思录
ChatGPT 是怎么工作的?

ChatGPT 是怎么工作的?

Stephen wolfram

ChatGPT 的工作原理基于统计概率,通过神经网络模型进行文本处理。它利用 n-grams 计算词语出现的概率,并通过 embedding 将文本转化为数字,以便在神经网络中流通。ChatGPT 的运作过程包括生成 embedding 数组、通过神经网络处理并预测下一个 token 的概率,体现了深度学习的复杂性和有效性。

本期我们回归一下 AI 相关的话题,聊一聊 ChatGPT 的工作原理。本文内容编译自科学搜索引擎 WolframAlpha 的作者 Stephen Wolfram 的文章。

▎一切都是统计概率

人工智能历史的发展,大致可以分为几个阶段:

在符号阶段,早期的科学家试图找出人类推理的法则,并且让机器学会这些逻辑。我们怎么思考计算的,机器也要怎么思考计算。这一阶段当然也有成果,但科学家们发现了最大的问题:我们无法把世间万物的知识和法则都灌输给机器,很多信息是无法良好抽象的(被称为形式主义),也很难批量地输入。因此早期的人工智能往往解决确定性的问题,比如下棋,棋谱的输入是可控的,下棋的规则也是可控的。

当科学家们发觉这点困难后,机器需要自我学习就提上了日程。起初,科学家们还是想让机器通过归纳演绎这种推理的手段学习,比如使用决策树算法,发现依然很难(这被称为基于规则的机器学习)。有一派的科学家,就致力于统计学习的方法了(基于统计的机器学习)。

统计学习的原理,就是把所有信息掰开揉碎了,塞给机器。机器在做判断时,更多是预测下一个元素出现的概率。如果是语句,那就是预测单词;如果是绘图,那就是预测像素。

比如,机器手里有半句话:The best thing about AI is its ability to

它会搜寻所有的预料库,查阅接下来出现哪个单词的概率更高。

然后写出来。这是一个极简的例子,实际操作,当然要复杂得多,有时未必会选择概率最高的词汇。

那么深度学习是什么意思呢?它引入了神经网络的算法,让机器学习可以接受的概率预测的复杂度提升了,也可以说同样效果的计算和存储成本大大降低了。这是一个黑盒,跟符号派是南辕北辙的两种范式。但它很有效果,也是如今所有大模型所采用的方法。

再回到开始说的四大阶段,也可以简化为两大阶段:

说到 ChatGPT,没错,哪怕很多人恐惧于它是否有意识、惊叹于它多么聪明和耐心,但它的运作原理,依然还是「靠猜」。就像一个经典的比喻,它就像一个读遍了世间所有信息的三岁小孩,不懂任何道理和规则,但它可以谈吐如流。

▎计算概率

预测是要看当前的内容为前提条件下,各种内容的概率,那这个概率怎么计算呢?

这里我们就要引入一个概念 n-grams。

如果是 Bi-grams/2-grams,意思就是我们只关心词对出现的概率。比如:

当 to 出现时, be 出现的概率。

如果是 Tri-grams/3-grams,意思就是我们关心3个词同时出现的概率。比如:

当 to be 出现时,or 出现的概率。

像这个句子:

The cat is running away。

2-grams 的方式是计算以下词对的概率:

The 出现时,cat 出现的概率

cat 出现时,is 出现的概率

is 出现时,running 出现的概率

running 出现时,away 出现的概率

3-grams 的方式是计算以下词对的概率:

The 和 cat 出现时,is 出现的概率

cat 和 is 出现时,running 出现的概率

is 和 running 出现时,away 出现的概率

很显然,n-grams 中的 n 足够长的话,预测出来的句子的可靠性就会更高。

但是,他们遇到了符号派当年试图把知识塞进机器同样的问题:数据量过于庞大。

如今互联网上流传的信息里,已经有大约千亿级的单词量,在数字化的书籍里,也有至少 1000 亿的单词。而哪怕我们退而求其次,只计算 40000 个常用单词(英文),所需的 2-gram 的概率统计量是多少呢?16 亿。

如果是 3-gram,则会变成 600000 亿。如果是 20-gram,这个统计量会比宇宙中的所有物理粒子加起来还要多。这是永远不可能被机器记录的。

所以,机器并不能直接「查表」。而是通过「搭建模型」来对概率本身进行预测,也可以说是预测之上的预测了。

▎神经网络模型

在中学物理里,我们就体会过最简易的模型搭建。比如,一个炮弹从不同的高度落下所需要的时间,根据统计数据,我们能得到一张图:

我们如果用一条线拟合的话,大概是这样:

看起来不够准确。于是我们可以用更复杂一些的公式拟合,比如

而神经网络的逻辑,与此相通。

我们拿最简单的一个课题来举例,机器识别图像中出现的数字。记录世界上每个手写数字的像素分布,显然是不可能也不高效的。于是机器可以训练着记住大概的「规律」,也就是对于每个位置的像素来说,给哪个数字加「权重」。

当整个画面中央没有像素点时,就可以考虑给「0」加个权重,因为大多数 0 中间就是空的;同时可以给很多数字减权重。每个像素点的权重情况,加总起来就可以预测数字。

要达成这个数字识别的效果的神经元,大约需要 2160 个。最原始的数字识别机器叫做「感知机」,早在 1957 年就被制造出来了。

为什么到这些年神经网络才能再次焕发新春?简单粗暴地说,就是计算机性能随着产业发展,而达到了全新的层次。体会下上图中最早的感知机的连线,若是没有如今的 GPU,根本是无法想象的。

区分猫和狗是对人来说无比轻松的课题,对于机器来说,则需要 60650 个神经元。神经元与神经元之间在多个层次上需要形成网络,是一个根本画不出来的多维复杂矩阵,因为维度就有 60650 个。

而且到这个程度,你会发现我们是无法解释过程中发生了什么的(科学家和工程师们也无法解释)。因为神经网络是一个完全的黑盒,且机器并不像人一样去理解事物。

设想一下,我们分辨猫和狗,可能的流程是:先看到是动物 - 判断出是小型动物 - 看到五官或者毛皮的样子 - 判断出是狗或者猫。

机器并非如此,它关注的点是当前人类无法理解的。

而我们做的,就是把一堆猫和狗的图片给机器看,并且告诉它哪些是猫、哪些是狗。是为训练过程。

在这个过程中,机器整理出了一堆的跟

一样的参数公式。大量的参数公式,就构成了一个模型。

所以常听到说 GPT-3 达到了 1750 亿个参数量,指的就是这个神经网络的公式,具备了 1750 亿个权重。

▎把文本变成数字:Embeddings

我们刚刚讨论的是图像的处理,在图像处理上有效果很好的卷积神经网络(CNN)。而在文本处理上,也需要有特别的处理。道理很简单,神经网络本质上处理的全部都是数字,我们要有一个有效的方法,让文本也能高效地在神经网络里流通。

Embeddings 就是一种表征「附近」的方法。就像前面说的,我们记录不同词语之间共同出现的概率,不如干脆有一个附近的概念,让不同的词语的关系,变成向量距离。

例如,这就是一个简化 2D 版本的词语 embedding 的结果:

这个是为了可视化方便做成了二维的。但很显然,机器可以处理非常大规模的维度的向量,在各个维度上,一个词语和另一个词语,都可以有距离。

那么这个所谓的「距离」该怎么计算呢?

可以还是拿简单的手写数字图像举例,这里是一个真实的 11 层的数字识别神经网络(这里不关心实现细节):

除了最后一层,在每一层我们都可以计算一个数值,该数值大概可以理解为机器关心的不同的特征维度(类比到人类关心的点,就是这个数字是否是闭合的?比划之间有没有交叉?等等)。

当每层特征计算之后,都会有一个数值给每个输入值。于是我们可以用不同的颜色来代表值的大小,这样对不同的手写数字,就有了一个 embedding 的特征:

使用相同的方法,我们就能计算文本在多个维度下的特征值了。单词的特征,明显会比数字要多。这就是 GPT-2 的三个词语的 embedding 的值:

而 ChatGPT 的逻辑是,每次生成的文本(不仅仅是当下的单词,回想下上文提到的 2-grams)都会生成一个 embedding 的向量,去匹配更可能出现的单词。这就是让文本变得可计算的方法。

说个题外话,ChatGPT 严格来说不是处理单词的,而是处理单词的模块(也就是常说的 tokens),比如 pre、ing、ized 等组成部分也会单独处理。

▎ChatGPT 的运转逻辑

如刚刚所说,在 ChatGPT 中,「猜词」的过程是这么运作的:

这里面提到的向量组的长度(前面用案例展示过数字和单词的向量组长度),也就意味着效果的优劣了。GPT-2 的长度是 768,而 GPT-3 直接跃升到了 12288。

在 embedding 的过程中,Transformer 起到了很关键的作用。这是 Bengio 团队在 2014 年提出的算法。

在把当前文本的所有 tokens 用 embedding 算出向量组之后,会有一些 attention blocks 开始工作。在 GPT-2 中有 12 个,在 GPT-3 中有 96 个。

它们的任务,是去寻找之前文本中相对重要的那些部分。回想一下,n-grams 机制是,n 越大,代表可以回想(参考)的部分就越多。attention blocks 可以考虑到全部的文本,不受 n 的限制,甚至它会把词汇之间的距离都默认为 1,可以考虑到距离很远的词汇之间的关联,让整个文本之间都互相产生影响,为词汇加权之后把这些因素也添加进新的向量数组当中。算是非常有效的一种处理长文本特征的方法。

这样得到的向量数组,就是最终的向量数组,用它来得到真正要预测的 tokens 的概率数组。

了解了这种计算逻辑,我们就知道,ChatGPT 在计算时都在做什么了。其实每个输出的 token(有的是单词,有的是单词的模块),都是在对当下的特征向量组进行计算,把当下的 token 加入进去,embedding 形成新的向量组。且由于存在着 1750 亿个权重,接下来出现的这个 token 也必须是完成了 1750 亿次计算才得到的。

所以,下次在用 ChatGPT 认为它太慢时,不妨想一想,它已经在努力了。

推荐阅读: