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

news/2024/12/5 7:30:53/

本文我们介绍ChatGPT是如何工作的,以及为什么它能够产生连贯和多样化的对话。分上中下篇为读者们呈现。

微信搜索关注《Java学研大本营》

4 类似人类任务的模型

我们上面举的例子涉及到为数字数据建立模型,这些数据基本上来自于简单的物理学--长时间以来我们一直知道 "简单数学适用"的道理。但是对于ChatGPT来说,我们必须为人脑产生的那种人类语言文本建立一个模型。而对于这样的东西,我们(至少现在)还没有类似 "简单数学 "的东西。那么,它的模型可能是什么样的呢?

在谈论语言之前,我们先谈谈另一项类似人类的任务:图像识别。下面数字的图像是个简单的例子(这是一个经典的机器学习例子):

我们为每个数字获取一堆样本图像:

要想知道作为输入的图像是否对应于某个特定的数字,我们只需与我们拥有的样本进行明确的逐个像素的比较。作为人类,我们似乎可以做得更好--因为我们可以识别数字,即使它们是手写的、且有各种各样的修改和扭曲:

当我们为上面的数字数据建立一个模型时,我们取一个给定的数字值x,然后为特定的a和b计算a+b x。如果我们把这里的每个像素的灰度值当作某个变量xi,那么是否有对所有这些变量的函数,能告诉我们图像是什么数字?事实证明,有可能构建这样一个函数,但它并不特别简单,一个典型的例子可能涉及50万次数学运算。

最终的结果是,如果我们把一幅图像的像素值集合输入这个函数,就会得出一个数字,指定我们的图像是哪个数字。后文中,我们将讨论如何构建这样一个函数,以及神经网络的概念。现在我们暂时把这个函数当作黑匣子,我们把手写数字的图像(作为像素值的数组)输入其中,然后得到对应的数字:

假设我们逐渐模糊一个数字。从下面结果得知,有一段时间我们的函数仍然可 "识别 "它,输出是 "2",但很快它就 "失去 "了,并开始给出 "错误 "的结果:

为什么说这是 "错误 "的结果?在这种情况下,如果我们的目标是制作一个人类图像识别的模型,那么真正要问的问题是,如果遇到这些模糊的图像之一,人类会怎么做。

如果从我们的功能中得到的结果通常与人类会说的话一致,我们就算有了一个 "好的模型"。对于像这样的图像识别任务,我们现在基本上知道如何构建这样的函数。

我们能 "从数学上证明 "它们的作用吗?不能。因为要做到这一点,我们必须有一个关于我们人类正在做什么的数学理论。以 "2 "图像为例,改变几个像素,我们仍然认为这个图像是 "2"。但这应该到什么程度呢?这是一个关于人类视觉感知的问题。而且,对于蜜蜂或章鱼来说,答案是不同的--对于假定的外星人来说,可能完全不同。

5 神经网路

那么我们的典型模型对于像图像识别这样的任务究竟是如何工作的呢?目前最流行、最成功的方法是使用神经网络。在20世纪40年代,神经网络的发明形式与今天的使用非常接近,它可以被认为是对大脑如何工作的简单理想化。

在人类的大脑中,有大约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个。而在我们用来识别猫和狗的网络中,有60,650个。通常情况下,要将相当于60,650个维度的空间可视化是相当困难的。但由于这是一个为处理图像而设置的网络,它的许多神经元层被组织成数组,就像它所看的像素数组一样。

如果我们采取一个典型的猫图像

那么我们就可以通过一组派生图像来表示第一层神经元的状态--其中许多图像我们可以很容易地解释为 "没有背景的猫 "或 "猫的轮廓 "等东西:

到了第10层,就更难解释发生了什么:

但一般来说,我们可以说神经网络是在 "挑选出某些特征"(也许尖耳朵就是其中之一),并利用这些特征来确定图像是什么。但这些特征是我们有名字的特征吗,比如 "尖耳朵"?大多数情况下不是。

我们的大脑在使用类似的特征吗?大多数情况下我们不知道。但值得注意的是,像我们在这里展示的神经网络的前几层可以挑出图像的某些方面(如物体的边缘),这些方面与我们知道的由大脑中第一层视觉处理挑出的特征相似。

但是,假设我们想要一个神经网络的 "猫识别理论"。我们可以说"看,这个特定的网络做到了"--这立即给了我们一些关于 "问题有多难 "的感觉(例如,可能需要多少个神经元或层)。但至少到现在为止,我们还没有办法对网络正在做的事情进行 "叙述性描述"。也许这是因为它在计算上确实是不可简化的,而且除了明确地追踪每一个步骤之外,没有一般的方法可以找到它在做什么。也可能只是因为我们还没有 "弄清科学",确定 "自然法则",使我们能够总结出正在发生的事情。

当我们讨论用ChatGPT生成语言时,我们会遇到同样的问题。而且同样不清楚是否有办法 "总结它在做什么"。但是语言的丰富性和细节(以及我们对它的经验)可能会让我们比图像走得更远。

6 机器学习和神经网路的训练

到目前为止,我们一直在讨论那些 "已经知道 "如何完成特定任务的神经网络。但是,神经网络之所以如此有用,是因为它们不仅在原则上可以完成各种任务,而且可以逐步 "根据实例训练 "来完成这些任务。

当我们制作一个神经网络来区分猫和狗时,我们实际上不需要写一个程序来(比如说)明确地找到胡须;相反,我们只需要展示大量关于什么是猫和什么是狗的例子,然后让网络从这些例子中 进行"机器学习 "如何区分它们。

重点是,训练有素的网络从它所展示的特定例子中 "概括 "出来。正如我们在上面看到的,这并不是简单地让网络识别它所看到的猫咪图像的特定像素模式;而是让神经网络以某种方式设法在我们认为是某种 "一般猫性 "的基础上区分图像。

那么,神经网络的训练究竟是如何进行的呢?从本质上讲,我们一直在努力寻找能使神经网络成功再现我们所给的例子的权重,然后,我们依靠神经网络以 "合理 "的方式在这些例子之间进行 "插值"(或 "概括")。

我们看一个比上面的最近点的问题更简单的问题,我们试着让神经网络来学习这个函数:

对于这项任务,我们将需要一个只有一个输入和一个输出的网络,比如:

我们应该使用什么权重?对于每一组可能的权重,神经网络都会计算出一些函数。例如,下面是它用几组随机选择的权重所做的:

而且,我们可以清楚地看到,在这些情况下,它甚至没有接近再现我们想要的函数。那么,我们如何找到能够重现该函数的权重呢?

基本的想法是提供大量的 "输入-输出 "的例子来 "学习",然后尝试找到能重现这些例子的权重。下面是用逐渐增多的例子来做的结果:

在这个 "训练 "的每个阶段,网络中的权重被逐步调整--最终我们得到了一个能成功再现我们想要的功能的网络。那么,我们是如何调整权重的呢?基本的想法是在每个阶段看看我们离得到我们想要的功能 "有多远",然后以这样的方式更新权重,使之更接近。

为了找出 "我们有多远",我们计算通常被称为 "损失函数"(或有时称为 "成本函数")的东西。这里我们使用的是一个简单的(L2)损失函数,它只是我们得到的值与真实值之间的差异的平方之和。我们看到的是,随着我们训练过程的进展,损失函数逐渐减少(遵循一定的 "学习曲线",对于不同的任务是不同的)--直到我们达到一个点,网络(至少是一个很好的近似值)成功再现了我们想要的函数:

最后要解释的重要部分是如何调整权重以减少损失函数。正如我们所说,损失函数给我们提供了我们得到的值和真实值之间的 "距离"。但是 "我们得到的值 "在每个阶段都是由当前版本的神经网络和其中的权重决定的。但现在想象一下,这些权重是变量--比如说wi。我们想找出如何调整这些变量的值,使取决于它们的损失最小化。

例如,想象一下(对实践中使用的典型神经网络进行了简化),我们只有两个权重w1和w2。那么我们可能有一个损失,作为w1和w2的函数,看起来像这样:

数值分析提供了在这种情况下寻找最小值的各种技术。典型的方法是,从之前的w1、w2开始,逐步遵循最陡峭的下降路径:

就像水从山上流下来一样,所能保证的是这个程序最终会在地表的某个局部最小值("山湖");它很可能达不到最终的全球最小值。

在 "重量景观 "上找到最陡峭的下降路径并不明显,这是不可行的。但是,微积分可以帮助我们。正如上文提到的,我们总是可以把神经网看作是在计算一个数学函数--它取决于它的输入和权重。但现在考虑对这些权重进行微分。事实证明,微积分的连锁法则实际上可以让我们 "解开 "神经网中连续几层所做的运算。其结果是,我们可以--至少在某些局部近似中--"反转 "神经网的操作,并逐步找到使与输出相关的损失最小的权重。

上图显示了在只有2个权重的简单情况下,我们可能需要做的最小化工作。但事实证明,即使有更多的权重(ChatGPT使用了1750亿个),仍有可能做到最小化,至少在某种程度上是近似的。2011年左右发生的 "深度学习 "的重大突破与以下发现有关:从某种意义上说,当有很多权重时,做(至少是近似的)最小化比有相当少的权重时要容易。

换句话说--有点反直觉--用神经网络解决更复杂的问题比简单的问题更容易。其大致原因是当一个人有很多 "权重变量 "时,他有一个高维空间,有 "很多不同的方向 "可以把他引向最小值--而在变量较少的情况下,它更容易最终陷入一个局部最小值("山湖"),没有 "方向可以出去"。

值得指出的是,在典型的情况下,有许多不同的权重集合,它们都会使神经网络具有几乎相同的性能。而在实际的神经网络训练中,通常会有很多随机的选择,从而导致 "不同但相等的解决方案",比如这些:

每一个这样的 "不同的解决方案 "至少会有稍微不同的行为。而且,如果我们要求,比如说,在我们提供训练实例的区域之外进行 "外推",我们会得到截然不同的结果:

但其中哪一个是 "正确的"?真的没办法说。它们都 "与观察到的数据一致"。但它们都对应着不同的 "先天 "方式来 "思考 "如何在 "匣子之外 "行事。对我们人类来说,有些可能比其他的看起来 "更合理"。

7 神经网络训练的实践与理论

有几个关键部分。首先,对于一个特定的任务,应该使用何种架构的神经网络。然后,还有一个关键问题,即如何获得训练神经网络的数据。人们现在越来越多地不是在处理从头开始训练一个网络的问题,相反,一个新的网络可以直接纳入另一个已经训练好的网络,或者至少可以使用该网络为自己产生更多的训练实例。

人们认为,对于每一种特定的任务都需要一个不同的神经网络结构。但事实发现,即使是对于明显不同的任务,相同的架构也能发挥作用。在某种程度上,这让人想起了通用计算的想法,但是,正如我后文要讨论的,我认为这更多地反映了这样一个事实,即我们通常试图让神经网络做的任务是 "类似人类 "的,而神经网络可以捕获相当普遍的 "类似人类的过程"。

在早期的神经网络中,人们倾向于认为应该 "让神经网络尽可能地少做"。例如,在将语音转换为文本时,人们认为应该首先分析语音的音频,将其分解为音素等等。但发现,至少对于 "类似人类的任务 "来说,通常更好的做法是尝试在 "端到端问题 "上训练神经网络,让它自己 "发现 "必要的中间特征、编码等。

还有一个想法是,我们应该在神经网络中引入复杂的单独组件,让它实际上 "明确地实现特定的算法想法"。但是,这又一次被证明是不值得的;相反,最好只是处理非常简单的组件,让它们 "自我组织"(尽管通常是以我们无法理解的方式)来实现(大概)那些算法想法的等价物。

这并不是说没有与神经网络相关的 "结构化思想"。例如,具有局部连接的二维神经元阵列至少在处理图像的早期阶段非常有用。而拥有专注于 "回顾序列 "的连接模式似乎很有用--我们将在后面看到--在处理人类语言等事物时,例如在ChatGPT中。

神经网络的一个重要特点是,像一般的计算机一样,它们最终只是在处理数据。而目前的神经网络--目前的神经网络训练方法--是专门处理数字阵列的。但在处理过程中,这些数组可以被完全重新排列和重塑。举个例子,我们上面用来识别数字的网络从一个二维的 "图像 "阵列开始,迅速 "增厚 "到许多通道,但随后 "浓缩 "成一维阵列,最终将包含代表不同可能输出数字的元素:

但是,怎么能知道一个特定的任务需要多大的神经网?这是一门艺术。关键是要知道 "这个任务有多难"。但对于类似人类的任务来说,这通常是很难估计的。可能有一种系统的方法可以通过计算机非常 "机械 "地完成任务。但很难知道是否存在人们认为的技巧或捷径,使人们至少在 "类似人类的水平 "上更容易地完成这项任务。可能需要列举一个巨大的游戏树来 "机械地 "玩某个游戏;但可能有一个更容易("启发式")的方法来实现 "人类水平的游戏"。

当我们在处理微小的神经网络和简单的任务时,有时可以明确地看到 "从这里不能到达那里"。例如,在上一节的任务中,用几个小的神经网络能做到最好:

我们看到的是,如果网太小,它就不能再现我们想要的功能。但如果超过一定的规模,它就没有问题了--至少如果我们对它进行足够长的训练,有足够多的例子。顺便说一下,这些图片说明了一个神经网络的传说:如果中间有一个 "挤压",迫使所有的东西都通过一个较小的中间神经元数量,那么我们往往可以用一个较小的网络来解决。(值得一提的是,"无中间层"--或所谓的 "感知器"--网络只能学习本质上的线性函数--但只要有一个中间层,原则上就可以任意很好地近似任何函数,至少如果有足够的神经元,尽管为了使其可行地训练,通常需要某种正则化或规范化)。

我们假设我们已经确定了某种神经网络架构。现在有一个问题,就是如何获得数据来训练网络。围绕着神经网络和一般机器学习的许多实际挑战都集中在获取或准备必要的训练数据上。在许多情况下("监督学习"),我们希望获得明确的输入和期望的输出的例子。举例来说,我们可能希望通过图像中的内容或一些其他属性来标记图像。也许我们必须明确地去做--通常是费尽心机地去做标记。但是很多时候,我们可以利用已经完成的东西,或者把它作为某种代理。比如我们可以使用网络上已经提供的图片的alt标签。或者,在另一个领域,我们可以使用为视频创建的封闭式字幕。或者在语言翻译训练中,可以使用不同语言的网页或其他文件的平行版本。

你需要向神经网络展示多少数据来训练它完成一项特定任务?同样,这很难从第一原理上估计。当然,通过使用 "转移学习 "来 "转移 "诸如已经在另一个网络中学习过的重要特征列表的东西,可以极大地降低要求。但一般来说,神经网络需要 "看到大量的例子 "才能训练好。而至少对于某些任务来说,神经网络的一个重要传说是,这些例子可以是难以置信的重复性。事实上,向神经网络展示所有的例子是一个标准的策略,一遍又一遍。在每个 "训练回合"(或 "epochs")中,神经网络至少会处于一个稍微不同的状态,而以某种方式 "提醒 "它某个特定的例子对于让它 "记住那个例子 "是很有用的。(是的,也许这类似于人类记忆中的重复的有用性)。

但往往只是反复重复同一个例子是不够的。还需要向神经网络展示这个例子的变化。而神经网络理论的一个特点是,这些 "数据增强 "的变化不一定非要复杂才有用。只要用基本的图像处理方法稍微修改一下图像,就可以使它们在神经网络训练中基本上 "像新的一样好"。同样,当我们没有实际的视频等来训练自动驾驶汽车时,可以继续在一个类似于电视游戏的模型环境中通过运行模拟来获得数据,而没有实际的真实世界场景的所有细节。

像ChatGPT这样的东西如何呢?ChatGPT有一个很好的特点,那就是它可以进行 "无监督学习",这使ChatGPT更容易得到用于训练的例子。回顾一下,ChatGPT的基本任务是找出如何继续它所给的一段文字。因此,为了获得 "训练实例",我们所要做的就是获得一段文本,并将其结尾遮盖起来,然后将其作为 "训练的输入"--"输出 "是完整的、未被遮盖的文本。我们稍后会详细讨论这个问题,但主要的一点是,与学习图片中的内容不同,不需要 "明确的标签";ChatGPT实际上可以直接从它所得到的任何文本例子中学习。

那么神经网络的实际学习过程是怎样的呢?归根结底,它是关于确定什么权重能最好地捕捉所给的训练实例。有各种详细的选择和 "超参数设置"(之所以被称为超参数,是因为可以将权重视为 "参数"),可以用来调整如何完成这一过程。有不同的损失函数选择(平方之和、绝对值之和,等等)。有不同的方法来进行损失最小化(每一步要在权重空间中移动多远,等等)。然后还有一些问题,比如要展示多大的 "批次 "的例子,以获得每一个试图最小化损失的连续估计。而且,我们可以应用机器学习(例如,我们在Wolfram语言中所做的)来实现机器学习的自动化--自动设置超参数等东西。

最终,整个训练过程可以通过观察损失如何逐渐减少来描述(如Wolfram Language的小规模训练的进度监视器):

通常看到的是,损失在一段时间内减少,但最终在某个恒定值上趋于平稳。如果这个值足够小,那么可以认为训练是成功的;否则,这可能是一个应该尝试改变网络结构的信号。

能否告诉我们 "学习曲线 "要花多长时间才能变平?就像其他许多事情一样,似乎有近似的幂律缩放关系,这取决于神经网络的大小和使用的数据量。但一般的结论是,训练一个神经网络是很难的,需要大量的计算努力。作为一个实际问题,这些努力的绝大部分都花在了对数字阵列的操作上,而这正是GPU所擅长的--这就是为什么神经网络训练通常受限于GPU的可用性。

在未来,是否会有从根本上更好的方法来训练神经网络,或者一般地做神经网络的工作?我认为,几乎可以肯定。神经网络的基本理念是用大量简单(本质上相同)的组件创建一个灵活的 "计算结构",并让这个 "结构 "能够被逐步修改,以便从实例中学习。在目前的神经网络中,人们基本上是使用微积分的思想--应用于实数--来做这种增量修改。但越来越清楚的是,拥有高精度的数字并不重要;即使使用目前的方法,8位或更少的数字也足够了。

像蜂窝自动机这样的计算系统,基本上是在许多单独的比特上并行操作的,如何做这种增量修改从来都不清楚,但没有理由认为它不可能。事实上,就像 "2012年深度学习的突破 "一样,这种增量修改在更复杂的情况下可能比简单的情况下更容易。

神经网络--也许有点像大脑--被设定为拥有一个基本固定的神经元网络,被修改的是它们之间连接的强度("重量")。(也许至少在年轻的大脑中,大量的完全新的连接也可以增长。)但是,虽然这对生物学来说可能是一个方便的设置,但并不清楚它是否是实现我们所需功能的最佳方式。而涉及渐进式网络重写的东西(也许让人想起我们的物理项目)最终可能会更好。

但即使在现有的神经网络框架内,目前也有一个关键的限制:现在的神经网络训练从根本上说是连续的,每一批例子的效果都被传播回来以更新权重。事实上,就目前的计算机硬件而言,即使考虑到GPU,神经网络的大部分时间在训练过程中都是 "闲置 "的,每次只有一个部分被更新。从某种意义上说,这是因为我们目前的计算机往往有独立于CPU(或GPU)的内存。但在大脑中,这大概是不同的--每一个 "记忆元素"(即神经元)也是一个潜在的活跃的计算元素。如果我们能够以这种方式设置我们未来的计算机硬件,就有可能更有效地进行训练。

8 "当然,一个足够大的网络可以做任何事情!"

像ChatGPT这样东西的能力令人印象深刻,如果人们能够 "继续下去",训练越来越大的神经网络,那么他们最终将能够 "做一切事情"。如果人们关注的是那些容易被人类直接思考的事物,那就很有可能是这样的。但是,过去几百年科学的教训是,有些东西可以通过形式化的过程计算出来,但并不容易被人类的直接思考所获得。

非琐碎的数学就是一个大例子。但一般的情况其实是计算。而最终的问题是计算的不可还原性现象。有一些计算,人们可能认为需要很多步骤才能完成,但实际上可以 "简化 "为相当直接的东西。但计算的不可简化性的发现意味着这并不总是有效的。相反,有些过程--可能就像下面这个过程--要弄清楚发生了什么,必然需要对每个计算步骤进行追踪:

我们通常用大脑做的那些事情,大概是为了避免计算的不可还原性而特别选择的。在一个人的大脑中做数学运算需要特别的努力。而且,在实践中,仅仅在一个人的大脑中 "想清楚 "任何非微观程序的操作步骤,在很大程度上是不可能的。

当然,为此我们有计算机。有了计算机,我们可以很容易地做很长的、计算上不可简化的事情。而关键的一点是,一般来说这些事情没有捷径。

我们可以记住很多关于在某个特定计算系统中发生的具体例子。也许我们甚至可以看到一些("计算上可还原的")模式,使我们可以做一点概括。但问题是,计算上的不可还原性意味着我们永远无法保证意外不会发生--只有明确地进行计算,你才能知道在任何特定情况下实际会发生什么。

最后,在可学习性和计算的不可重复性之间存在着一种基本的紧张关系。学习实际上是通过利用规则性来压缩数据。但计算上的不可复制性意味着最终对可能存在的规律性有一个限制。

作为一个实际问题,我们可以想象将一些小的计算设备--如蜂窝自动机或图灵机--构建成像神经网络这样的可训练系统。而且,这种设备确实可以作为神经网的好 "工具",就像Wolfram|Alpha可以作为ChatGPT的好工具。但是计算的不可简化性意味着我们不能期望 "进入 "这些设备并让它们学习。

或者换句话说,在能力和可训练性之间有一个最终的权衡:你越想让一个系统 "真正利用 "它的计算能力,它就越会显示出计算的不可复制性,它的可训练性就越低。而它越是从根本上可训练,它就越不能做复杂的计算。

(对于目前的ChatGPT来说,情况实际上要极端得多,因为用于生成每个输出符号的神经网络是一个纯粹的 "前馈 "网络,没有循环,因此没有能力做任何具有非复杂 "控制流 "的计算)。

当然,你可能会问,能够做不可还原的计算是否真的很重要。事实上,在人类历史的大部分时间里,这并不特别重要。但我们的现代技术世界是建立在至少使用数学计算的工程之上的,而且越来越多地使用更普遍的计算。如果我们看一下自然界,它充满了不可简化的计算--我们正在慢慢理解如何模仿并用于我们的技术目的。

一个神经网络当然可以注意到自然世界中的各种规律性,而我们也可能很容易通过 "无助的人类思维 "注意到这些规律性。但是,如果我们想要解决属于数学或计算科学范畴的事情,神经网络是无法做到的--除非它有效地 "作为工具 "使用一个 "普通 "的计算系统。

但是,这一切都有一些潜在的混淆之处。在过去,有很多任务--包括写文章--我们都认为对计算机来说 "根本上太难了"。而现在我们看到这些任务由ChatGPT这样的人完成,我们往往会突然认为计算机一定是变得更加强大了--特别是超越了它们已经基本能够做到的事情(比如逐步计算蜂窝自动机等计算系统的行为)。

但这并不是要得出的正确结论。计算上不可还原的过程仍然是计算上不可还原的,而且对计算机来说仍然是根本性的困难--即使计算机可以轻易地计算它们的各个步骤。相反,我们应该得出的结论是,我们人类可以做的,但我们不认为计算机可以做的任务,比如写文章,实际上在某种意义上比我们想象的更容易计算。

换句话说,神经网络之所以能够成功地写出一篇文章,是因为写文章被证明是一个比我们想象的 "计算上更浅 "的问题。从某种意义上说,这使我们更接近于 "拥有一种理论",即我们人类是如何做到像写文章这样的事情的,或者一般来说是如何处理语言的。

如果你有一个足够大的神经网络,那么,你可能能够做任何人类能够轻易做到的事情。但是,你不会捕捉到自然界一般能做的事情--或者我们从自然界塑造的工具能做的事情。而正是这些工具的使用--无论是实用的还是概念性的--使我们在近几个世纪里能够超越 "纯粹的无助的人类思维 "所能达到的界限,并为人类的目的捕获更多的物理和计算宇宙中的东西。

推荐书单

《Java从入门到精通(第6版)》

《Java从入门到精通(第6版)》从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细讲解了使用Java语言进行程序开发需要掌握的知识。全书分为23章,内容包括初识Java,熟悉Eclipse开发工具,Java语言基础,流程控制,数组,类和对象,继承、多态、抽象类与接口,包和内部类,异常处理,字符串,常用类库,集合类,枚举类型与泛型,lambda表达式与流处理,I/O(输入/输出),反射与注释,数据库操作,Swing程序设计,Java绘图,多线程,网络通信,奔跑吧小恐龙,MR人脸识别打卡系统。书中所有知识都结合具体实例进行讲解,涉及的程序代码都给出了详细的注释,可以使读者轻松领会Java程序开发的精髓,快速提高开发技能。

《Java从入门到精通(第6版)(软件开发视频大讲堂)》(明日科技)【摘要 书评 试读】- 京东图书京东JD.COM图书频道为您提供《Java从入门到精通(第6版)(软件开发视频大讲堂)》在线选购,本书作者:明日科技,出版社:清华大学出版社。买图书,到京东。网购图书,享受最低优惠折扣!icon-default.png?t=N658https://item.jd.com/13284888.html

精彩回顾

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

Netty和原生Java的性能比较

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

10个强大的IntelliJ IDEA插件

Spring boot使用gRPC 的详细教程

微信搜索关注《Java学研大本营》

访问【IT今日热榜】,发现每日技术热点


http://www.ppmy.cn/news/962839.html

相关文章

开源布道师适兕访谈录

「 没有人会理解一个中年男人为什么会在四十岁这个压力最大的年纪,放弃稳定的技术主管生活,去坚持做“开源布道”这件看起来没有名,也没有利,甚至前路漫漫的事情。」 李建盛,1982年生,在临近35岁危机做出了…

2023四川省赛-题解合集

#题目题解链接A (1)旷野之息https://blog.csdn.net/qq_62899367/article/details/131807904B (2)希卡之石https://blog.csdn.net/qq_62899367/article/details/131808297C (3)神庙挑战D (4)光鱗之枪E (5)怪物商店F (6)自建一始G (7)沃托里村H (8)王国之泪I (9)究极之手J (10)余…

超越ChatGpt,最近爆火的AutoGPT 究竟是什么

一、AutoGPT是什么 最近几天,一款基于GPT-4的最强语言模型AutoGPT火遍了整个AI圈。众所周知,此前爆火AI圈的ChatGPT,唯一不太好用的地方就是需要人类不断的prompt。因此,如果你想要ChatGPT帮你去做一件复杂的事情,那么…

首批 ChatGPT 应用将打响 To B 的编程应用争夺战!

整理 | 王启隆 何苗 出品 | CSDN(ID:CSDNnews) “ChatGPT 爆发意味着 AI 的 iPhone 时刻来了,下一步就是应用时刻,新应用时代将来临。那程序员怎么办呢?会被替代吗?我认为不会,但程序…

ChatBI- ChatGPT的垂直领域思考

声明:本文将从技术角度对比几款商用BI产品的AI辅助功能。鉴于个人的认知水平,所描述的内容,若有不妥,请斧正。 BI之痛 从事大数据工作十余年,近两年负责制造业BI工作,总结了一些痛点问题: 技术…

横向滚动日期显示对应周几

common.js: //获取当前时间&#xff0c;格式YYYY-MM-DD HH:MM:SS const GetNowTime time > {var date time,year date.getFullYear(),month date.getMonth() 1,day date.getDate(),hour date.getHours() < 10 ? "0" date.getHours() : date.getHours…

【Java】Java核心类 之 字符串和编码

1.String 在Java中&#xff0c;String是一个引用类型&#xff0c;它本身也是一个class。但是&#xff0c;Java编译器对String有特殊处理&#xff0c;即可以直接用"…"来表示一个字符串&#xff1a; String s1 "Hello!";实际上字符串在String内部是通过一…

JSEncrypt组件报错

问题并解决办法 JSEncrypt 原因&#xff1a;该组件版本不兼容引起 的 向上升级 解决&#xff1a;去掉^&#xff0c;指定版本&#xff08;暂不更改&#xff0c;怕该组件不更新使用不了&#xff09; cnpm install的时候&#xff0c;默认jsencrypt升级2、查看node_modules里的js…