原标题:能详细讲一下ChatGPT的原理吗?
关键字:chatgpt使用
最佳回答:cffh
回答字数:1262字
ChatGPT的原理,其实说白了就是一个基于transformer的语言生成模型。它通过大量人工标注的数据,学习来预测人类语言的概率分布,从而可以生成连贯的语句和对话。
ChatGPT使用的transformer模型,核心就是self-attention机制。这个机制可以让模型自动学习文本序列中每个词与其他词之间的关系,捕捉上下文语义,预测下一个最可能出现的词。而 transformers 相比 RNN 等其他网络结构也有一定的计算效率优势,所以效果上会更好一些。
在数据方面,ChatGPT使用了开放域问答数据OpenWebText,它包含海量的匿名网络文本和笔记,可以让 ChatGPT 学到很丰富的知识和表达方式。而对于人工标注数据, ChatGPT采用了教师强制方式,让模型学习人类编辑者删减、修改、重构的文本,所以在生成文本时更贴近人类风格。
在训练过程中,ChatGPT的损失函数采用的是交叉熵损失。简单来说,就是输入文本序列,让模型最大限度地预测每一个词的概率分布,如果预测不准确,就调整模型的参数,逐渐提高预测准确度。这样经过大量文本的数据训练,ChatGPT就可以较好地理解语言上下文,进行语言表达。
所以,ChatGPT的原理实际上没有什么神秘的,主要还是典型的NLP任务中使用的transformer结构和语言生成模型。关键是它有较为海量的人工标注数据作为支持,以及比较先进的模型结构,所以在人机对话这一任务上可以达到比较高的生成质量,显得比较智能。但它的理解和知识还是有限的,无法真正达到用语言进行思维的程度。它更像是一个根据语境生成最佳语句的语言模型,而非真正意义上的AI。
联系作者
回答作者:cffh
写在前面
一、什么是模型
假设你想知道(就像伽利略在16世纪后期所做的那样)从比萨斜塔的每一层扔下一颗炮弹需要多长时间才能落地。你可以测量每一种情况,然后把结果做成表格。或者你也可以通过理论科学的方式,建立一个模型,给出某种计算答案的程序,而不仅仅是测量和记住每种情况。
让我们想象一下理想情况,我们有炮弹从不同楼层落下所需时间的数据:
我们如何计算同样的物体从没有明确数据的地板上掉下来需要多长时间? 在这种特殊情况下,我们可以用已知的物理定律来计算。但是假设我们得到的只是数据,我们不知道是什么潜在的规律支配着它。此时我们可以做一个数学上的猜测,比如也许我们可以用一条直线作为模型:
我们可以选择不同的直线。但平均来说,这是最接近我们给出的数据的。从这条直线我们可以估计掉到任何楼层的时间。
我们怎么知道这里应该用直线呢?它只是一些数学上简单的思考方式,我们已经习惯了我们测量的许多数据最终被数学上简单的东西很好地拟合。我们可以尝试一些数学上更复杂的东西,比如a + b x + c x2,在这种情况下我们可以得到更加拟合的曲线:
不过使用曲线a + b/x + csin (x)时,可能会发现没有那么拟合。
值得理解的是,永远不存在“无模型模型”。你使用的任何模型都有一些特定的底层结构——然后是一组特定的“旋钮”(即你可以设置的参数)来适应你的数据。在ChatGPT的例子中,使用了很多这样的“旋钮”——实际上有1750亿个。
但值得注意的是,chatgtp的底层结构——“仅仅”有那么多参数——足以建立一个模型计算下一个单词的概率,并且“足够好”地为我们提供合理的短文长度的文本片段。
二、像人一样思考的模型的建立
我们上面给出的例子是数值数据建立的一个模型,这个模型基本上来自于简单的物理学——几个世纪以来我们都知道“简单的数学适用”。但是对于ChatGPT,我们必须制作一个由人类大脑产生的人类语言文本模型。对于这样的东西,我们(至少现在)还没有任何类似“简单数学”的东西。那么它的模型会是什么样的呢?
在我们谈论语言之前,我们可以先看另一个类似人类的任务:识别图像。作为一个简单的例子,让我们考虑一下数字图像(一个经典的机器学习例子):
我们可以做的一件事是为每个数字获取一堆样本图像:
然后,为了找出我们输入的图像是否对应于一个特定的数字,我们可以用我们已有的样本做一个明确的逐像素比较。但作为人类,我们似乎在某些方面做得更好——因为我们仍然可以识别数字,即使它们是手写的,并且有各种各样的修改和扭曲:
当我们为上面的数值数据建立一个模型时,我们可以取一个给定的数值x,然后计算特定的a和b的a + bx,所以如果我们把这里每个像素的灰度值看作某个变量xi有没有一个所有这些变量的函数,当求值时,告诉我们图像的数字是多少?事实证明,构造这样一个函数是可能的。毫不奇怪,这并不是特别简单,一个典型的例子可能涉及50万个数学运算。
但最终的结果是,如果我们将图像的像素值集合输入到这个函数中,将会得到指定图像的数字。稍后,我们将讨论如何构建这样的函数,以及神经网络的思想。但是现在,让我们把这个函数当作一个黑盒,在这里我们输入图像,比如手写数字(作为像素值数组),然后我们得到这些数字对应的数字:
但这里到底发生了什么?假设我们逐渐模糊一个数字。在一段时间内,我们的函数仍然“识别”它,这里是“2”。但很快它就“失去理智”,开始给出“错误”的结果:
但为什么我们说这是“错误”的结果呢?在这个例子中,我们知道我们通过模糊“2”得到了所有的图像。但如果我们的目标是建立一个人类识别图像的模型,真正要问的问题是,如果一个人看到这些模糊的图像,而不知道它来自哪里,他会怎么做。
如果我们从函数中得到的结果通常与人类所说的一致,我们就有了一个“好模型”。重要的科学事实是,对于像这样的图像识别任务,我们现在基本上知道如何构造函数来完成它。
我们能“从数学上证明”它们是有效的吗?嗯,没有。因为要做到这一点,我们必须有一个关于人类行为的数学理论。以“2”为例,改变几个像素。我们可以想象,只有几个像素“错位”,我们仍然应该认为图像是“2”。但模糊到什么程度我们仍然可以识别出来呢? 这是一个人类视觉感知的问题。对于蜜蜂或章鱼来说,答案可能会不同。
三、神经网络
那么典型的图像识别模型是如何工作的呢?目前最流行也是最成功的方法是使用神经网络。神经网络是在20世纪40年代发明的,其形式与今天的使用非常接近,可以被认为是对大脑工作方式的简单理想化。
在人类的大脑中,大约有1000亿个神经元(神经细胞),每个神经元都能产生每秒1000次的电脉冲。神经元连接在一个复杂的网络中,每个神经元都有树状的分支,使其能够将电信号传递给数千个其他神经元。粗略地说,给定的神经元是否在给定的时刻产生电脉冲取决于它从其他神经元接收到什么脉冲——不同的连接产生不同的“权重”。
当我们“看到图像”时,所发生的事情是,当图像中的光子落在我们眼睛后部的(“感光细胞”)细胞上时,它们在神经细胞中产生电信号。这些神经细胞与其他神经细胞相连,最终信号通过整个神经元层的序列。正是在这个过程中,我们“识别”了这个图像,最终“形成了一个想法”,我们“看到了一个2”(也许最后会做一些事情,比如大声说出“2”这个词)。
上一节的“黑盒”函数是这种神经网络的“数学化”版本。它恰好有11层(尽管只有4个“核心层”):
这个神经网络没有什么特别的“理论推导”;它只是在1998年作为一项工程而建造的东西,并且发现它起作用了。(当然,这与我们描述大脑是在生物进化过程中产生的方式没有太大区别。)
但是像这样的神经网络是如何“识别事物”的呢?关键是“吸引”的概念。假设我们有1和2的手写图像:
我们希望所有的1“被吸引到一个地方”,所有的2“被吸引到另一个地方”。或者,换一种方式,如果一个图像在某种程度上“更接近于1”而不是2,我们希望它最终在“1位”,反之亦然。
作为一个简单的类比,假设我们在平面上有特定的位置,用点表示(在现实生活中,它们可能是咖啡店的位置)。然后我们可以想象,从平面上的任何一点出发,我们总是希望在最近的点结束(例如,我们总是去最近的咖啡店)。我们可以通过将平面划分为由理想的“分水岭”分隔的区域(“吸引子盆地”)来表示这一点:
我们可以把它看作是实现一种“识别任务”,在这个任务中,我们不是在做像识别给定图像中哪个数字“看起来最像”这样的事情,而是直接地看到一个给定点离哪个点最近。(我们在这里展示的“Voronoi图”设置分隔了二维欧几里德空间中的点;数字识别任务可以被认为是在做非常类似的事情——但是是在由每个图像中所有像素的灰度级别组成的784维空间中。)
那么我们如何让神经网络“完成识别任务”呢?让我们考虑这个非常简单的例子:
我们的目标是获取与位置{x,y}对应的“输入”,然后将其“识别”为最接近的三个点中的任何一个。或者,换句话说,我们希望神经网络计算一个{x,y}的函数,如下所示:
那么我们如何用神经网络做到这一点呢?最终,神经网络是理想化的“神经元”的连接集合——通常分层排列——一个简单的例子是:
每个“神经元”被有效地设置为评估一个简单的数值函数。为了“使用”这个网络,我们只需在顶部输入数字(比如我们的坐标x和y),然后让每一层的神经元“评估它们的功能”,并将结果通过网络向前传递——最终在底部产生最终结果:
在传统的(受生物学启发的)设置中,每个神经元都有效地拥有一组来自前一层神经元的“传入连接”,每个连接被赋予一定的“权重”(可以是正数或负数)。给定神经元的值是通过将“前一个神经元”的值乘以它们对应的权重来确定的,然后将它们相加并添加一个常数,最后应用一个“阈值”(或“激活”)函数。用数学术语来说,如果一个神经元有输入x = {x1, x2…},那么我们计算f[w]。X + b],其中权重w和常数b通常对网络中的每个神经元的选择不同;函数f通常是一样的。
计算w。X + b只是矩阵的乘法和加法。“激活函数”f引入非线性(并最终导致非平凡行为)。常用的各种激活函数;这里我们只使用Ramp(或ReLU):
对于我们希望神经网络执行的每个任务(或者,等价地,对于我们希望它评估的每个整体函数),我们将有不同的权重选择。(正如我们稍后将讨论的那样,这些权重通常是通过从我们想要的输出示例中使用机器学习来“训练”神经网络来确定的。)
最终,每个神经网络都对应于一些整体的数学函数——尽管写出来可能会很混乱。对于上面的例子,它将是:
ChatGPT的神经网络也只是对应于这样一个数学函数——但是有效地包含了数十亿个术语。
让我们回到单个神经元。这里有一些函数的例子,一个神经元有两个输入(代表坐标x和y)可以用各种选择的权重和常数(和Ramp作为激活函数)来计算:
但是从上面的更大的网络呢?好吧,这是它的计算结果:
它不是很“正确”,但它接近于我们上面展示的“最近点”函数。
让我们看看其他神经网络会发生什么。在每种情况下,我们将在后面解释,我们使用机器学习来找到权重的最佳选择。然后我们在这里展示了具有这些权重的神经网络的计算结果:
较大的网络通常能更好地逼近我们的目标函数。在“每个吸引子盆地的中间”,我们通常会得到我们想要的答案。但在边界——神经网络“很难下定决心”的地方——事情可能会更混乱。
有了这个简单的数学风格的“识别任务”,“正确答案”就很清楚了。但在识别手写数字的问题上,就不那么清楚了。如果有人把“2”写得很糟糕,看起来像“7”,等等?尽管如此,我们还是可以问神经网络是如何区分数字的——这给了我们一个提示:
我们能说“数学上”网络是如何区分的吗?不是真的。它只是“做神经网络做的事”。但事实证明,这似乎与我们人类所做的区分相当吻合。
让我们举一个更详细的例子。假设我们有猫和狗的图像。我们有一个经过训练的神经网络来区分它们。下面是它在一些例子中的用法:
现在,“正确答案”是什么就更不清楚了。一只狗穿着猫的衣服怎么样?等。无论输入什么,神经网络都会产生一个答案,并且以一种与人类相当一致的方式。正如我上面所说的,这不是一个我们可以“从第一原理推导出来”的事实。它只是经验上被发现是正确的,至少在某些领域是正确的。但这是神经网络有用的一个关键原因:它们以某种方式捕捉到一种“类似人类”的做事方式。
给自己看一张猫的照片,然后问:“为什么那是猫?”也许你会说:“嗯,我看到了它的尖耳朵等等。”但要解释你是如何把这张照片识别为猫并不容易。只是你的大脑不知怎么就明白了。但对于大脑来说,还没有办法(至少现在)“进入”内部,看看它是如何计算出来的。那么(人工)神经网络呢?嗯,当你展示一张猫的照片时,很容易看到每个“神经元”在做什么。但即使是获得一个基本的可视化通常也是非常困难的。
在我们用于“最近点”问题的最终网络中,有17个神经元。在网络上用于识别手写数字的有2190种。在我们用来识别猫和狗的网络中有60650个。通常来说,想象60650维的空间是相当困难的。但因为这是一个用来处理图像的网络,它的许多神经元层都被组织成数组,就像它正在观察的像素数组一样。
如果我们取一张典型的猫的照片
然后,我们可以通过一系列衍生图像来表示第一层神经元的状态——其中许多我们可以很容易地解释为“没有背景的猫”或“猫的轮廓”:
到了第10层,就很难解释发生了什么了
但总的来说,我们可以说神经网络“挑选出某些特征”(也许尖耳朵是其中之一),并使用这些特征来确定图像是什么。但这些特征是我们有名字的特征吗——比如“尖耳朵”?主要是没有。
我们的大脑是否也在使用类似的特征?大多数情况下我们不知道。但值得注意的是,像我们在这里展示的神经网络的前几层似乎可以挑选出图像的某些方面(比如物体的边缘),这些方面似乎与我们所知道的由大脑视觉处理的第一层挑选出来的图像相似。
但假设我们想在神经网络中建立一个“猫识别理论”。我们可以说:“看,这个特殊的网络做到了”——这立即让我们感觉到“这个问题有多难”(例如,可能需要多少神经元或层)。但至少到目前为止,我们还没有一种方法来“描述”该网络正在做什么。也许这是因为它确实是计算上不可约的,而且除了显式地跟踪每一步,没有一般的方法可以找到它的作用。或者,也许只是我们还没有“搞清楚科学”,没有发现让我们总结正在发生的事情的“自然法则”。
在讨论使用ChatGPT生成语言时,我们也会遇到同样的问题。同样,我们也不清楚是否有办法“总结它在做什么”。但是语言的丰富性和细节(以及我们对它的体验)可能会让我们比图像走得更远。