Lazy loaded image
一个足够大的网络可以做任何的事情
字数 8382阅读时长 21 分钟
2023-12-4
2023-12-4
type
Post
status
Published
date
Dec 4, 2023
slug
summary
ChatGPT 这样的东西的能力似乎如此令人印象深刻,以至于人们可能会想象,如果一个人能够“继续前进”并训练越来越大的神经网络,那么他们最终将能够“做所有事情”。如果一个人关心的是人类直接思维容易理解的事物,那么情况很可能就是这样。但过去数百年科学的教训是,有些事情可以通过形式过程来解决,但人类的直接思维却无法轻易理解。
tags
推荐
AI生活
ChatGPT相关
AI教程
AI知识库
category
ChatGPT
icon
password
Files & media

一个足够大的网络可以做任何事情

像 ChatGPT 这样的东西的能力似乎如此令人印象深刻,以至于人们可能会想象,如果一个人能够“继续前进”并训练越来越大的神经网络,那么他们最终将能够“做所有事情”。如果一个人关心的是人类直接思维容易理解的事物,那么情况很可能就是这样。但过去数百年科学的教训是,有些事情可以通过形式过程来解决,但人类的直接思维却无法轻易理解。
重要的数学就是一个重要的例子。但一般情况实际上是计算。最终的问题是计算不可约性现象。有些计算可能会被认为需要很多步骤才能完成,但实际上可以“简化”为非常直接的事情。但计算不可约性的发现意味着这并不总是有效。相反,有一些过程(可能如下所示),要计算出发生的情况,不可避免地需要跟踪每个计算步骤:
notion image
我们通常用大脑做的事情可能是专门选择的,以避免计算不可约性。在大脑中进行数学运算需要特别的努力。实际上,仅仅在大脑中“思考”任何重要程序的运行步骤基本上是不可能的。
当然,我们有电脑。借助计算机,我们可以轻松地完成长时间的、计算上不可简化的事情。关键是,这些通常没有捷径。
是的,我们可以记住某些特定计算系统中发生的情况的许多具体示例。也许我们甚至可以看到一些(“计算可简化”)模式,使我们能够进行一些概括。但关键是,计算不可约性意味着我们永远无法保证意外情况不会发生,只有通过显式地进行计算,您才能知道在任何特定情况下实际发生的情况。
最终,可学习性和计算不可约性之间存在根本性的紧张关系。学习实际上涉及利用规律来有效压缩数据。但计算不可约性意味着最终可能存在的规律性是有限的。
作为一个实际问题,人们可以想象将小型计算设备(如元胞自动机或图灵机)构建到可训练的系统(如神经网络)中。事实上,这样的设备可以作为神经网络的良好“工具”——就像Wolfram|Alpha 可以成为 ChatGPT 的良好工具一样。但计算不可约性意味着人们不能指望“进入”这些设备并让它们学习。
或者换句话说,能力和可训练性之间存在最终的权衡:你越希望系统“真正利用”其计算能力,它就越会表现出计算不可约性,而可训练性就越差。从根本上来说,它的可训练性越高,它执行复杂计算的能力就越弱。
(对于目前的ChatGPT来说,情况实际上更加极端,因为用于生成每个输出token的神经网络是一个纯粹的“前馈”网络,没有循环,因此没有能力做任何类型的事情使用非平凡的“控制流”进行计算。)
当然,人们可能想知道能够进行不可约计算是否真的很重要。事实上,对于人类历史的大部分时间来说,这并不是特别重要。但我们的现代技术世界是建立在工程基础上的,至少利用了数学计算——而且越来越多地利用了更通用的计算。如果我们观察自然世界,就会发现它充满了不可简化的计算——我们正在慢慢理解如何模拟和使用它们来实现我们的技术目的。
是的,神经网络当然可以注意到自然世界中的各种规律,我们也可以通过“独立的人类思维”轻易地注意到这些规律。但是,如果我们想要解决数学或计算科学范围内的问题,神经网络将无法做到这一点,除非它有效地“用作工具”“普通”计算系统。
但所有这一切都可能存在一些令人困惑的地方。过去,我们认为很多任务(包括写论文)对于计算机来说“从根本上来说太难了”。现在,当我们看到像 ChatGPT 这样的公司完成这些工作时,我们往往会突然认为计算机一定变得更加强大,特别是超越了它们基本上已经能够做到的事情(例如逐步计算细胞自动机等计算系统的行为) 。
但这并不是正确的结论。计算不可约过程仍然是计算不可约的,并且对于计算机来说仍然从根本上来说是困难的——即使计算机可以很容易地计算它们的各个步骤。相反,我们应该得出的结论是,我们人类可以完成但我们不认为计算机可以完成的任务(例如写论文)实际上在某种意义上在计算上比我们想象的更容易。
换句话说,神经网络之所以能够成功地写论文,是因为写论文实际上是一个比我们想象的“计算更浅”的问题。从某种意义上说,这让我们更接近“拥有一个理论”,了解人类如何设法做一些事情,比如写论文,或者一般处理语言。
如果你有一个足够大的神经网络,那么,是的,你也许能够做人类可以轻易做的任何事情。但你无法捕捉到自然世界一般可以做什么,或者我们从自然世界中创造出来的工具可以做什么。正是这些工具的使用——无论是实用的还是概念上的——使我们在近几个世纪中能够超越“纯粹的独立人类思维”的界限,并为人类目的捕获更多物理和计算方面的东西。宇宙。

嵌入的概念

神经网络——至少就目前而言——基本上是基于数字的。因此,如果我们要使用它们来处理文本之类的内容,我们需要一种用数字表示文本的方法。当然,我们可以通过为字典中的每个单词分配一个数字来开始(本质上就像 ChatGPT 所做的那样)。但有一个重要的想法(例如 ChatGPT 的核心)超越了这一点。这就是“嵌入”的想法。人们可以将嵌入视为一种尝试通过数字数组来表示某物的“本质”的方法,其特性是“附近的事物”由附近的数字表示。
因此,例如,我们可以将单词嵌入视为尝试将单词布置在一种“意义空间”中,其中在某种程度上“意义相近”的单词出现在嵌入中附近。实际使用的嵌入(例如在 ChatGPT 中)往往涉及大量数字列表。但如果我们投影到 2D,我们可以展示单词如何通过嵌入进行布局的示例:
notion image
是的,我们所看到的在捕捉典型的日常印象方面表现得非常好。但我们如何构建这样的嵌入呢?大致的想法是查看大量文本(这里是来自网络的 50 亿个单词),然后查看不同单词出现的“环境”“有多相似”。因此,例如,“alligator”和“crocodile”通常在其他类似的句子中几乎可以互换出现,这意味着它们将被放置在嵌入的附近。但“turnip”和“eagle”不会出现在其他相似的句子中,因此它们在嵌入中会被放置得很远。
但如何使用神经网络实际实现这样的事情呢?让我们首先讨论不是针对单词的嵌入,而是针对图像的嵌入。我们希望找到某种方法通过数字列表来表征图像,以便为“我们认为相似的图像”分配相似的数字列表。
我们如何判断是否应该“认为图像相似”?好吧,如果我们的图像是手写数字,如果它们具有相同的数字,我们可能会“认为两个图像相似”。之前我们讨论了一个被训练来识别手写数字的神经网络。我们可以认为这个神经网络的设置是为了在其最终输出中将图像放入 10 个不同的容器中,每个容器对应一个数字。
但是,如果我们在做出最终的“这是‘4’”决定之前“拦截”神经网络内部发生的事情会怎样呢?我们可能期望在神经网络内部有一些数字将图像描述为“大部分是 4,但有点像 2”或类似的图像。我们的想法是选取这些数字作为嵌入中的元素。
这就是这个概念。我们不是直接尝试描述“哪个图像靠近哪个其他图像”,而是考虑一个明确定义的任务(在本例中是数字识别),我们可以为此获得明确的训练数据,然后使用这样一个事实:在执行此任务时神经网络隐含地必须做出“邻近决策”。因此,我们不必明确地讨论“图像的接近度”,而只需讨论图像代表什么数字的具体问题,然后我们“将其留给神经网络”来隐式地确定这意味着什么关于“图像的接近度”。
那么,对于数字识别网络来说,更具体地说,它是如何工作的呢?我们可以将网络视为由 11 个连续层组成,我们可以像这样进行图标性总结(激活函数显示为单独的层):
notion image
首先,我们将输入第一层实际图像,由像素值的二维数组表示。最后,从最后一层,我们得到一个包含 10 个值的数组,我们可以将其视为表示网络“有多确定”该图像对应于 0 到 9 中的每个数字。
输入图像
notion image
,最后一层神经元的值是:
notion image
换句话说,神经网络此时“非常确定”该图像是 4,为了真正获得输出“4”,我们只需找出具有最大值的神经元的位置。
但如果我们早一步看呢?网络中的最后一个操作是所谓的softmax,它试图“强制确定性”。但在应用之前,神经元的值是:
notion image
代表“4”的神经元仍然具有最高的数值。但其他神经元的值也包含信息。我们可以预期,这个数字列表在某种意义上可以用来表征图像的“本质”,从而提供我们可以用作嵌入的东西。因此,例如,这里的每个 4 都有一个稍微不同的“签名”(或“特征嵌入”)——与 8 都非常不同:
notion image
在这里,我们基本上使用 10 个数字来表征我们的图像。但使用更多通常会更好。例如,在我们的数字识别网络中,我们可以通过利用前一层来获取包含 500 个数字的数组。这可能是一个用作“图像嵌入”的合理数组。
如果我们想要对手写数字的“图像空间”进行显式可视化,我们需要“降低维度”,通过将我们进入的 500 维向量有效地投影到 3D 空间中:
notion image
我们刚刚讨论了通过确定(根据我们的训练集)图像是否对应于相同的手写数字来有效地识别图像的相似性,从而为图像创建特征(从而嵌入)。如果我们有一个训练集,可以识别每张图像属于 5000 种常见对象类型(猫、狗、椅子等)中的哪一种,那么我们可以更普遍地对图像执行相同的操作。通过这种方式,我们可以制作一个图像嵌入,该图像嵌入通过我们对常见对象的识别“锚定”,然后根据神经网络的行为“围绕该对象进行概括”。关键是,只要这种行为与我们人类感知和解释图像的方式一致,这最终将成为一种“对我们来说似乎正确”的嵌入,并且在实践中执行“类似人类判断”的任务时很有用。
好的,那么我们如何遵循同样的方法来查找单词的嵌入呢?关键是从我们可以轻松进行训练的单词任务开始。此类任务的标准是“单词预测”。想象一下我们得到了“___ 猫”。基于大量文本(例如网络的文本内容),不同单词“填空”的概率是多少?或者,给定“___ black ___”,不同“侧翼词”的概率是多少?
我们如何为神经网络设置这个问题?最终我们必须用数字来表达一切。实现此目的的一种方法是为 50,000 个左右的英语常用单词中的每一个分配一个唯一的编号。因此,例如,“the”可能是 914,“cat”(前面有一个空格)可能是 3542。(这些是 GPT-2 使用的实际数字。)所以对于“the ___ cat”问题,我们的输入可能是 {914, 3542}。输出应该是什么样的?嗯,它应该是一个包含 50,000 个左右数字的列表,可以有效地给出每个可能“填充”单词的概率。再一次,为了找到嵌入,我们想要在神经网络“得出结论”之前“拦截”神经网络的“内部”,然后选取那里出现的数字列表,我们可以想到这些数字为“描述每个单词的特征”。
好的,那么这些特征是什么样的呢?在过去的 10 年里,开发了一系列不同的系统(word2vecGloVe、BERT、GPT等),每个系统都基于不同的神经网络方法。但最终,它们都采用单词并通过数百到数千个数字的列表来表征它们。
在它们的原始形式中,这些“嵌入向量”的信息量相当少。例如,以下是 GPT-2 生成的三个特定单词的原始嵌入向量:
notion image
如果我们做诸如测量这些向量之间的距离之类的事情,那么我们就可以找到诸如单词的“接近度”之类的东西。稍后我们将更详细地讨论我们可能认为此类嵌入的“认知”意义。但目前的要点是,我们有一种方法可以有效地将单词转化为“神经网络友好”的数字集合。
但实际上,我们不仅可以通过数字集合来表征单词,还可以更进一步。我们也可以对单词序列甚至整个文本块执行此操作。ChatGPT 内部就是这样处理事情的。它获取到目前为止获得的文本,并生成一个嵌入向量来表示它。那么它的目标是找到接下来可能出现的不同单词的概率。它将对此问题的答案表示为一个数字列表,这些数字本质上给出了 50,000 个左右可能单词中每个单词的概率。
(严格来说,ChatGPT 不处理单词,而是处理“标记” ——方便的语言单位,可能是整个单词,也可能只是像“pre”或“ing”或“ized”这样的片段。使用标记使事情变得更容易让 ChatGPT 能够处理罕见的、复合的和非英语单词,有时,无论好坏,还可以发明新单词。)

内部ChatGPT

好的,我们终于准备好讨论 ChatGPT 的内部内容了。是的,归根结底,它是一个巨大的神经网络,目前是所谓的 GPT-3 网络的一个版本,拥有 1750 亿个权重。在很多方面,这是一个神经网络,与我们讨论过的其他神经网络非常相似。但它是一个专门用于处理语言的神经网络。它最显着的特点是一种称为“变压器”的神经网络架构。
在我们上面讨论的第一个神经网络中,任何给定层的每个神经元基本上都与之前层上的每个神经元连接(至少具有一定的权重)。但是,如果处理具有特定已知结构的数据,这种完全连接的网络(大概)就显得有些过分了。因此,例如,在处理图像的早期阶段,通常使用所谓的卷积神经网络(“卷积神经网络”),其中神经元有效地布置在类似于图像中像素的网格上,并连接只针对网格上附近的神经元。
变压器的想法是对组成一段文本的标记序列做一些至少有些相似的事情。但 Transformer 不是仅仅定义序列中可以存在连接的固定区域,而是引入了“注意力”的概念,以及对序列的某些部分比其他部分更多“关注”的想法。也许有一天,启动一个通用神经网络并通过训练进行所有定制是有意义的。但至少到目前为止,在实践中“模块化”事物似乎至关重要——就像变形金刚所做的那样,也可能就像我们的大脑所做的那样。
好的,那么 ChatGPT(或者更确切地说,它所基于的 GPT-3 网络)实际上是做什么的?回想一下,它的总体目标是根据从训练中看到的内容以“合理”的方式继续文本(包括查看来自网络的数十亿页文本等),因此在任何给定点,它有一定数量的文本,其目标是为下一个要添加的标记提供适当的选择。
它分三个基本阶段运行。首先,它获取到目前为止与文本相对应的标记序列,并找到表示这些标记的嵌入(即数字数组)。然后,它以“标准神经网络方式”对这种嵌入进行操作,其中值“穿过”网络中的连续层,以产生新的嵌入(即新的数字数组)。然后,它获取该数组的最后一部分,并从中生成一个包含大约 50,000 个值的数组,这些值将转换为不同可能的下一个标记的概率。(是的,所使用的标记数量与英语中常见单词的数量大致相同,尽管只有大约 3000 个标记是完整单词,其余都是片段。)
关键的一点是,该管道的每个部分都是由神经网络实现的,其权重由网络的端到端训练决定。换句话说,实际上除了整体架构是“明确设计的”之外,没有任何东西。一切都是从训练数据中“学习”的。
然而,该架构的设置方式有很多细节——反映了各种经验和神经网络知识。而且——尽管这肯定会陷入困境——我认为讨论其中一些细节是有用的,尤其是为了了解构建像 ChatGPT 这样的东西需要做什么。
首先是嵌入模块。以下是 GPT-2 的 Wolfram 语言示意表示形式:
notion image
输入是一个由n 个标记组成的向量(如上一节中所示,用 1 到大约 50,000 的整数表示)。这些标记中的每一个都被(通过单层神经网络)转换为嵌入向量(GPT-2 的长度为 768,ChatGPT 的 GPT-3 的长度为 12,288)。同时,还有一条“辅助路径”,它采用标记的(整数)位置序列,并根据这些整数创建另一个嵌入向量。最后,将令牌值和令牌位置的嵌入向量加在一起,以从嵌入模块生成最终的嵌入向量序列。
为什么只是将标记值和标记位置嵌入向量相加呢?我认为这没有什么特别的科学依据。只是已经尝试了各种不同的方法,而这似乎是有效的。这是神经网络知识的一部分,从某种意义上说,只要设置“大致正确”,通常只需进行足够的训练就可以掌握细节,而不需要真正“理解”工程水平”正是神经网络最终如何配置自身的。
以下是嵌入模块的作用,对字符串hello hello hello hello hello hello hello hello hello hello bye bye bye bye bye bye bye bye bye进行操作:
notion image
每个标记的嵌入向量的元素显示在页面下方,在整个页面中,我们首先看到一系列“ hello ”嵌入,然后是一系列“ bye ”嵌入。上面的第二个数组是位置嵌入,其看起来有点随机的结构正是“碰巧学到的”(在本例中是 GPT-2)。
好的,嵌入模块之后就是变压器的“主要事件”:一系列所谓的“注意力块”(GPT-2 为 12 个,ChatGPT 的 GPT-3 为 96 个)。这一切都非常复杂,让人想起典型的大型难以理解的工程系统,或者就此而言,生物系统。但无论如何,这是单个“注意力块”的示意图(针对 GPT-2):
notion image
在每个这样的注意力块中,都有一组“注意力头”(GPT-2 为 12 个,ChatGPT 的 GPT-3 为 96 个)——每个注意力头都独立地对嵌入向量中的不同值块进行操作。(是的,我们不知道为什么分割嵌入向量是个好主意,也不知道它的不同部分“意味着什么”;这只是“被发现有效”的事情之一.)
好的,那么注意力头是做什么的呢?基本上,它们是一种在标记序列中“回顾”(即在迄今为止生成的文本中)的方式,并以有助于查找下一个标记的形式“打包过去”。在上面的第一部分中,我们讨论了使用 2-gram 概率根据其直接前身来选择单词。Transformer 中的“注意力”机制的作用是允许“注意力”甚至更早的单词,从而潜在地捕获动词可以引用在句子中出现在它们之前的许多单词的名词的方式。
在更详细的层面上,注意力头所做的就是用一定的权重重新组合与不同标记相关的嵌入向量中的块。因此,例如,第一个注意力块(在 GPT-2 中)中的 12 个注意力头具有以下内容(“一路回望到序列的开头”) tokens”)上面“ hello , bye ”字符串的“重组权重”模式:
notion image
经过注意力头处理后,生成的“重新加权嵌入向量”(GPT-2 的长度为 768,ChatGPT 的 GPT-3 的长度为 12,288)通过标准的“全连接”神经网络层。很难掌握这一层正在做什么。但这里是它使用的 768×768 权重矩阵的图(这里是 GPT-2):
notion image
采用 64×64 移动平均值,一些(随机游走式)结构开始出现:
notion image
是什么决定了这个结构?最终,它可能是人类语言特征的某种“神经网络编码”。但到目前为止,这些功能可能是什么还不清楚。实际上,我们正在“打开 ChatGPT 的大脑”(或者至少是 GPT-2),并发现,是的,它的内部很复杂,而且我们不理解它——尽管最终它产生了可识别的人类语言。
好的,在经过一个注意力块之后,我们得到了一个新的嵌入向量,然后它依次通过其他注意力块(GPT-2 总共 12 个;GPT-3 总共 96 个)。每个注意力块都有自己特定的“注意力”和“完全连接”权重模式。对于 GPT-2,这是第一个注意力头的“你好,再见”输入的注意力权重序列:
notion image
以下是全连接层的(移动平均)“矩阵”:
notion image
奇怪的是,尽管不同注意力块中的这些“权重矩阵”看起来非常相似,但权重大小的分布可能有些不同(并且并不总是高斯分布):
notion image
那么,在经历了所有这些注意力块之后,变压器的净效应是什么?本质上,它是将令牌序列的原始嵌入集合转换为最终集合。ChatGPT 的特殊工作方式是获取该集合中的最后一个嵌入,并“解码”它以生成接下来应该出现的令牌的概率列表。
这就是 ChatGPT 内部内容的概述。它可能看起来很复杂(尤其是因为它有许多不可避免地有些武断的“工程选择”),但实际上涉及的最终元素非常简单。因为最终我们处理的只是一个由“人工神经元”组成的神经网络,每个神经网络都执行简单的操作,即获取一组数字输入,然后将它们与一定的权重组合起来。
ChatGPT 的原始输入是一个数字数组(到目前为止标记的嵌入向量),当 ChatGPT“运行”生成新标记时所发生的只是这些数字“涟漪”过神经网络的各层,每个神经元“做自己的事情”并将结果传递给下一层的神经元。没有循环或“返回”。一切都只是通过网络“反馈”。
它与典型的计算系统(如图灵机)的设置非常不同,在图灵机中,结果由相同的计算元素重复“重新处理”。这里,至少在生成给定的输出标记时,每个计算元素(即神经元)仅使用一次。
但从某种意义上说,即使在 ChatGPT 中,仍然存在重用计算元素的“外循环”。因为当 ChatGPT 要生成新令牌时,它总是“读取”(即作为输入)之前的整个令牌序列,包括 ChatGPT 本身之前“写入”的令牌。我们可以认为这种设置意味着 ChatGPT 确实(至少在其最外层)涉及“反馈循环”,尽管其中每次迭代都作为出现在其生成的文本中的标记明确可见。
但让我们回到 ChatGPT 的核心:重复用于生成每个令牌的神经网络。在某种程度上,它非常简单:一整套相同的人工神经元。网络的某些部分仅由(“完全连接”)神经元层组成,其中给定层上的每个神经元都与之前层上的每个神经元连接(具有一定的权重)。但特别是凭借其 Transformer 架构,ChatGPT 具有更多结构的部分,其中仅连接不同层上的特定神经元。(当然,人们仍然可以说“所有神经元都是相连的”——但有些神经元的权重为零。)
此外,ChatGPT 中神经网络的某些方面并不是最自然地被认为仅由“同质”层组成的。例如,正如上面的标志性摘要所示,在注意力块内,有一些地方对传入数据进行了“多个副本”,然后每个副本都经过不同的“处理路径”,可能涉及不同数量的层,并且仅后来重新组合。但是,虽然这可能是对正在发生的事情的方便表示,但至少在原则上总是可以考虑“密集填充”层,但只是让一些权重为零。
如果查看通过 ChatGPT 的最长路径,就会发现大约涉及 400 个(核心)层——从某些方面来看,这个数字并不是很大。但神经元有数百万个,总共有 1750 亿个连接,因此权重也有 1750 亿个。需要认识到的一件事是,每次 ChatGPT 生成一个新令牌时,它都必须对这些权重中的每一个权重进行计算。在实现上,这些计算可以在某种程度上“按层”组织成高度并行的数组操作,可以方便地在 GPU 上完成。但对于生成的每个代币,仍然需要完成 1750 亿次计算(最终还要多一点),因此,使用 ChatGPT 生成一长段文本可能需要一段时间,这并不奇怪。
但最终,值得注意的是,所有这些操作(单独而言都很简单)可以以某种方式共同完成如此出色的“类似人类”的文本生成工作。必须再次强调的是(至少就我们所知)没有“最终的理论原因”来解释为什么这样的事情应该起作用。事实上,正如我们将要讨论的,我认为我们必须将其视为一个可能令人惊讶的科学发现:在像 ChatGPT 这样的神经网络中,以某种方式有可能捕捉到人类大脑在生成语言方面的本质。
 
上一篇
机器学习和神经网络的训练
下一篇
ChatGPT的训练办法