文字接龙
LLM从根本上始终要做的是,针对它得到的任何文本产生“合理的延续”。LLM只是在玩一个“文字接龙”的游戏。
当ChatGPT做一些事情,比如写一篇文章时,它实质上只是在一遍又一遍地询问“根据目前的文本,下一个词应该是什么”,并且每次都添加一个词。(这里说的“词”实际上指的是token,它可能只是词的一部分)
每个词的出现有一定的概念,并不会在每次添加词的时候选择概率最高的那个,而是在一定范围内随机选择,否则就像输入法软件那样只能联想,每次都选择第一个词,通常会得到一篇非常“平淡”的文章,完全显示不出任何“创造力”(是时候甚至会产生混乱和重复)。存在随机性意味着,如果我们多次使用相同的提示(prompt),每次都有可能得到不同的文章。使用“温度”参数来确定低排名的词的使用频率。对于文章生成任务,“温度”为0.8似乎最好。
概率从何而来
使用N-gram模型从大型文本语料库中统计连续的N个词出现的概率。可以想象,如何能够使用足够长的n元词,我们基本上会“得到一个ChatGPT”,也就是说我们得到的东西能够生成符合“正确的整体文章概率”且像文章一样长的序列。但问题在于:我们根本没有足够的文本来推断出这些概率。这里存在一个组合爆炸的问题,可能的20元词的数量会大于宇宙中的粒子数量,所以永远无法把它们全部写下来。
改进方案是建立一个模型,让我们能够估计序列出现的概率。这就是“大语言模型”要做的事情。
假设我们要知道从比萨斜塔上掉落的铁球需要多长时间才能落地,我们有两种方法可以运用。第一种是进行多次测量和记录;第二种是根据已知的物理定律直接计算出最终的结果。在某种程度上,N-gram模型类似于第一种方法,而大语言模型类似于第二种方法。
什么是模型
牛顿运动定律并不是“先知”告诉牛顿的,而是牛顿本人经过观察、测量、记录、思考、假设、验证等一系列步骤后总结出来的。这个总结的过程就是建立模型的过程,最后得到的结论就是一个模型。有些模型是有名字的,比如“牛顿第一、第二、第三运动定律”。根据建立的模型,我们可以直接计算出给定条件(输入)下我们关心的问题的结果是什么(输出),这也就是用模型进行“预测”的过程,这一过程有时候也叫做“推理”。
为人类语言文本建立的模型就是语言模型。大语言模型的“大”体现在模型的参数量很多,比如ChatGPT有1750亿个参数。
任何模型都有某种特定的基本结构,以及用于拟合数据的一定数量的“旋钮”(参数),只有当这些“旋钮”都旋到合适的位置时,模型才能有预期的表现。电视机有很多旋钮,比如频道选择旋钮、音量旋钮、明亮度旋钮等,用来完成多种功能。幸运的是,我们只需要调整有限的几个旋钮就能让电视机有效工作。相反,要让ChatGPT这样的大语言模型有效工作,需要让1750亿个旋钮处于正确的位置。
神经网络
一种主流的模型基本结构是神经网络,它发明于20世纪40年代,可以视作对大脑工作机制的简单理想化。
神经网络是一种层次化的模型,由多层神经元组成,每一层都可以对输入数据进行特征提取和转换。每一层的输出作为下一层的输入,从而形成了一种层层传递的结构。无论输入什么,神经网络都会生成一个答案,这跟人的神经系统比较相似,因此神经网络在图像识别、语音识别中比较常用。
一个典型是神经网络结构
神经网络之所以很有用,原因不仅在于它可以执行各种任务,还在于它可以通过逐步“根据样例训练”来学习执行这些任务。当构建一个神经网络来区分猫和狗的图像时,我们不需要编写一个程序来明确地找到胡须,只需要展示很多关于什么是猫和什么是狗的样例,然后让神经网络从中“机器学习”如何区分它们即可。
神经网络的训练究竟是如何起效的呢?本质上, 我们一直在尝试找到能使神经网络成功复现给定样例的权重。然后,我们依靠神经网络在这些样例“之间”进行“合理”的“插值”(或“泛化”) 。想象一个让神经网络拟合指定函数的过程。
为了找出“我们距离我们有多远”,我们计算通常所说的“损失函数”(有时也称为“成本函数”)。这里我们使用一个简单的 (L2) 损失函数,它只是我们得到的值与真实值之间差异的平方和。我们看到的是,随着训练过程的进行,损失函数逐渐减小(遵循针对不同任务不同的特定“学习曲线”),直到我们达到网络(至少达到良好近似)成功再现的点我们想要的功能:
最后一个要解释的重要部分是如何调整权重以减少损失函数。数值分析提供了多种技术来找到此类情况下的最小值。但典型的方法是逐步遵循从我们之前的 w1、w2 开始的最陡下降路径:
实际上,“深度学习”在2012年左右的重大突破与如下发现有关: 与权重相对较少时相比,在涉及许多权重时,进行最小化可能会更容易 。换句话说,有时候用神经网络解决复杂问题比解决简单问题更容易——这似乎有些违反直觉。大致原因在于,当有很多“权重变量”时,高维空间中有很多不同的的方向可以引导我们达到最小值;而当变量较少时,很容易陷入局部最小值的“山湖”,无法找到“出去的方向”。
在典型情况下,有许多不同的权重集合可以使神经网络具有几乎相同的性能。在实际的神经网络的训练中,通常会做出许多随机选择,导致产生一些“不同但等效”的解决方案。
神经网络训练的艺术
1. 针对特定的任务使用何种神经网络架构 在过去的十年中,神经网络训练的艺术已经有了许多进展。是的,它基本上是一门艺术。有时,尤其是回顾过去时,人们在训练中至少可以看到一丝“科学解释”的影子了。但是在大多数情况下,这些解释是通过试错发现的,并且添加了一些想法和技巧,逐渐针对如何使用神经网络建立了一门重要的学问。
有人可能会认为,每种特定的任务都需要不同的神经网络架构。但事实上,即使对于看似完全不同的任务,同样的架构通常也能够起作用。这反映了我们通常试图让神经网络去完成的任务是“类人”任务,而神经网络可以捕捉相当普遍的“类人过程”。
在早期发展阶段,人们倾向于认为应该“让神经网络做尽可能少的事”。例如,在将语音转换为文本时,人们认为应该先分析出语音的音频,再将其分解为音素等。但是后来发现,最好的方法通常是尝试训练神经网络来“解决端到端的问题”,让它自己“发现”必要的中间特征、编码等。
还有一种想法是,应该将复杂的独立组件引入神经网络,以便让它有效地“显式实现特定的算法思想”。但结果再次证明,这在大多数情况下并不值得;相反,最好只处理非常简单的组件,并让它们“自我组织”来实现(可能)等效的算法思想。
这并不意味着没有与神经网络相关的“结构化思想”。例如,CNN在图像处理任务中似乎很有用,就像RNN在文本处理任务中一样。
2. 如何获取训练数据 “迁移学习”可以将已经在另一个神经网络中学习到的重要特征列表“迁移过来”,从而显著降低对数据规模的要求。
“数据增强”的变化并不一定要很复杂才有用。例如,自动驾驶可以使用在模拟的游戏环境中获取的数据。
“无监督学习”可以用在训练ChatGPT这样的任务重。
3. “足够大的神经网络当然无所不能!” ChatGPT的能力令人印象深刻,以至于人们可能会想象,如果能够在此基础上继续努力,训练出越来越大的神经网络,那么它们最终将“无所不能”。对于那些容易被人类思维理解的事物,这确实很可能是成立的。但我们从科学在过去几百年间的发展中得出的教训是,有些事物虽然可以通过形式化的过程来弄清楚,但并不容易立即为人类思维所理解。
说到底,可学习性和计算不可约性之间存在根本的矛盾。学习实际上涉及通过利用规律来压缩数据,但计算不可约性意味着最终对可能存在的规则有一个限制。
"计算不可约性"(Computational irreducibility)是由著名物理学家斯蒂芬·沃尔夫勒姆(Stephen Wolfram)在其探索复杂系统和细胞自动机理论时提出的一个概念。这个概念主要涉及到一类系统,这些系统的未来状态只能通过逐步模拟或执行其所有步骤来确定,而不能通过更简单的方式或缩减的公式直接预测。简而言之,如果一个系统是计算不可约的,那么为了得到系统未来的状态,没有比实际按照规则一步一步计算更快的方法。你不能通过某种捷径或者更高效的公式来预测它将来的状态,即使是使用最强大的计算机和最聪明的数学家也无法找到一个系统的简化模型来替代完整地、逐步地计算过程。例如,在细胞自动机(如著名的康威生命游戏)中,系统的发展规则可以非常简单,但产生的模式和结构却可能极其复杂,以至于我们无法预测它未来的状态,除非逐步模拟它的每一个时间步。这显示出了在看似简单的规则之下潜在的复杂性和计算不可约性。计算不可约性是现代计算理论、复杂系统研究以及物理学中的一个重要观点,它挑战了传统的缩减主义思维,即通过简化系统来理解系统的行为。在计算不可约的视角下,简化可能不再是一种可行的策略,复杂性和未可知性成为了系统固有的特点。这种理论对于理解生命现象、社会复杂性以及宇宙的基本规则都具有深远的意义。
能力和可训练性之间存在着一个终极的平衡:你越想让一个系统“真正利用”其计算能力,它就会表现出计算不可约性,从而越不容易被训练;而它在本质上越易于训练,就越不能进行复杂的计算。
神经网络确实可以注意到自然界中我们通过“无辅助的人类思维”也能轻易注意到的规律。但是,如果我们想解决数学或计算科学领域的问题,神经网络将无法完成任务,除非它能有效地使用一个“普通”的计算系统作为“工具”。
神经网络能够在写文章的任务中获得成功的原因是,写文章实际上是一个“计算深度较浅”的问题,比我们想象的简单。
“嵌入”的概念
神经网络,至少以目前的设置来说,基本上是基于数的。因此,如果要用它来处理像文本这样的东西,我们需要一种用数表示文本的方法。当然,我们可以(本质上和ChatGPT一样)从为字典中的每个词分配一个数开始。但有一个重要的思想—也是ChatGPT的中心思想—更胜一筹。这就是“嵌入”(embedding)的思想。可以将嵌入视为一种尝试通过数的数组来表示某些东西“本质”的方法,其特性是“相近的事物”由相近的数表示。
embedding是一种将词汇、句子或更大的文本块转化为数值向量的方法,这些向量可以被机器学习模型理解和处理。"嵌入"这个词在此上下文中的含义是,文本信息被"嵌入"到高维空间中,每个维度都代表文本的某种特性。
比如“猫”这个单词文本,可能会在训练过程中被解析成数百个数字,这些数字都代表了这个单词某个抽象的本质特性,他们可能与语义相似性、语法关系、共现模式有关系,但具体的含义我们并不知道,最后会将这些数字放进一个高维向量中。
可以通过查看大量文本,创建很多的词向量,同时收集将一堆有关联的词(比如alligator 短吻鳄和crocodile鳄鱼在相似的句子中经常几乎可以互换),相似的词向量之间距离较近,不相似词向量距离较远。
这种词向量有以下几个特点:
有了词向量,语言模型就可以通过比较两个或更多词向量之间的距离或角度,来理解词之间的关系,衡量文本之间的相似性。
embedding让语义运算有了数值基础,是神经网络模型处理语义的基石,也是 ChatGPT 等大模型的核心技术:先用神经网络学习大量文本数据,获得每个词的向量表达,然后在此向量空间中进行语义运算,从而达到理解语义的目的。
ChatGPT的内部原理
好的,我们终于准备好讨论 ChatGPT 的内部内容了。是的,归根结底,它是一个巨大的神经网络——目前是所谓的 GPT-3 网络的一个版本,拥有 1750 亿个权重。在很多方面,这是一个神经网络,与我们讨论过的其他神经网络非常相似。但它是一个专门为处理语言而设置的神经网络。它最显着的特点是一种称为“Transformer”的神经网络架构。
Transformer的想法是对组成一段文本的标记序列做一些至少有些相似的事情。但 Transformer 不是仅仅在序列中定义一个可以存在连接的固定区域,而是引入了“注意力”的概念——即更多地“关注”序列的某些部分而不是其他部分。也许有一天,可以启动一个通用神经网络并通过训练来完成所有的定制工作。但至少到目前为止,在实践中“模块化”事物似乎至关重要——就像Transformer所做的那样,也可能就像我们的大脑所做的那样。
ChatGPT到底在做什么?在任何给定时刻,它都有一定数量的文本,其目标是为下一个要添加的标记提供适当的选择。
它分三个基本阶段运行。首先,它获取到目前为止与文本相对应的标记序列,并找到表示这些标记的嵌入(即数字数组)。然后,它以“标准神经网络方式”对这种嵌入进行操作,值 “像涟漪一样依次通过” 网络中的各层,以产生新的嵌入(即新的数字数组)。然后,它获取该数组的最后一部分,并从中生成一个包含大约 50,000 个值的数组,这些值将转换为不同可能的下一个标记的概率。
一个关键点是,这个管道的每个部分都是由神经网络实现的,其权重由网络的端到端训练决定。换句话说,实际上,除了整体架构之外,没有任何东西是“明确设计的”;一切都是从训练数据中“学到”的。
首先是嵌入模块:
输入是一个由 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
进行操作:
在嵌入模块之后是Transformer的“主要事件”:一系列所谓的“注意力块”(GPT-2 为 12 个,ChatGPT 的 GPT-3 为 96 个)。这一切都非常复杂,让人想起难以理解的大型工程系统或者生物系统。以下是(GPT-2中)单个“注意力块”的示意图:
在每个这样的注意力块中,都有一组“注意力头”(GPT-2 为 12 个,ChatGPT 的 GPT-3 为 96 个)——每个注意力头都独立地对嵌入向量中的不同值块进行操作。(是的,我们不知道为什么分割嵌入向量是个好主意,也不知道它的不同部分“意味着什么”;这只是“被发现有效”的事情之一)
那么注意力头是做什么的呢?基本上,它们是一种在标记序列(即在迄今为止生成的文本中)中“回顾”的方式,并以一种有用的形式“打包过去的内容”,以便找到下一个标记。在前面的部分,我们讨论了使用的概率根据上一个词选择下一个词。Transformer 中的“注意力”机制所做的是允许“关注”更早的词,因此可能捕获到(例如)动词可以如何被联系到出现在在句子中许多词之前的名词。在更详细地说,注意力头所做的就是用一定的权重重新加权组合与不同标记相关的嵌入向量中的块。
经过注意力头处理后,生成的“重新加权嵌入向量”(GPT-2 的长度为 768,ChatGPT 的 GPT-3 的长度为 12,288)通过标准的“全连接”神经网络层。
因此,在经过一个注意力块之后,我们得到了一个新的嵌入向量,然后该向量依次通过其他注意力块(GPT-2 总共 12 个;GPT-3 总共 96 个)。每个注意力块都有自己特定的“注意力”和“全连接”权重模式。
在经历了所有这些注意力块之后,Transformer的实际效果是什么?本质上,它是将标记序列的原始嵌入集合转换为最终集合。然后,ChatGPT的特定工作方式是选取该集合中的最后一个嵌入,并对其进行“解码”,以生成应该出现的下一个标记的概率列表。
LLM在做什么?它为何才能做到这些
那么,ChatGPT到底在做什么?它为什么能做到这些?
ChatGPT的基本概念在某种程度上相当简单:首先从互联网、书籍等获取人类创造的海量文本样本,然后训练一个神经网络来生成“与之类似”的文本。特别是,它能够从“提示”开始,继续生成“与其训练数据相似的文本”。
训练ChatGPT的重头戏是在向其“展示”来自互联网、书籍等的大量现有文本,但事实证明训练还包括另一个(显然非常重要的)部分。
一旦根据被展示的原始文本语料库完成“原始训练”,ChatGPT内部的神经网络就会准备开始生成自己的文本,根据提示续写,等等。尽管这些结果通常看起来合理,但它们很容易(特别是在较长的文本片段中)以“非类人”的方式“偏离正轨”。这不是通过对文本进行传统的统计可以轻易检测到的。
在经过所有的预训练后,你只需要把东西告诉它一次,它就能“记住”——至少记住足够长的时间来生成一段文本。这里面到底发生了什么事呢?也行“你能告诉它的一切已经在里面的某个地方了”,你只是把它引导到了正确的位置。但这似乎不太可能,更可能的是虽然这些元素已经在里面了,但具体情况是由类似于“这些元素之间的轨迹”所定义的,而你告诉它的就是这条轨迹。
就像人类一样,如果LLM接受到一些匪夷所思、出乎意料、完全不符合它已有框架的东西,它就似乎无法成功地“整合”这些信息。只有在这些信息基本上以一种相对简单的方式依赖于它已有的框架时,它才能够进行“整合”。
人类语言,及其生成所涉及的思维过程,一直被视为复杂性的巅峰。人类大脑“仅”有约1000亿个神经元(及约100万亿个连接),却能够做到这一切,确实令人惊叹。人们可能会认为,大脑中不只有神经元网络,还有某种具有尚未发现的物理特性的新层。但是有了ChatGPT之后,我们得到了一条重要的新信息:一个连接数与大脑神经元数量相当的纯粹的人工神经网络,就能够出色地生成人类语言。
那么,产生“有意义的人类语言”需要什么?
第一个是语言的语法,语言不仅仅是把一些词随机拼凑在一起;相反,不同类型的词之间有相当明确的语法规则。
第二个是逻辑,在亚里士多德发现的三段论(syllogistic)形式中,逻辑基本上用来说明遵循一定模式的句子是合理的,而其他句子则不合理。
ChatGPT“仅仅”是从其积累的“传统智慧的统计数据”中提取了一些“连贯的文本线索”。但是,结果的类人程度已经足够令人惊讶了,因此,有意义的人类语言实际上比我们所知道的更加结构化、更加简单,最终可能以相当简单的规则来描述如何组织这样的语言。
ChatGPT的成功可能向我们揭示了人类思维本质的一些基本规律。
人类语言是不精确的,这主要是因为它没有与特定的计算实现相“结合”,其意义基本上只由其使用者之间的“社会契约”定义。但是,计算语言在本质上具有一定的精确性,因为它指定的内容最终总是可以“在计算机上毫无歧义地执行”。
比如在自然语言中,“少年”这个词的范围是模糊不清的,可能指代从12岁到18岁的人。但在计算语言中,我们可以精确定义: 少年 = If[age >= 12 && age < 18, True, False] 这里使用了编程语言中的逻辑语句,明确限定了“少年”的准确年龄范围。
LLM,如ChatGPT,是如何在语言方面获得如此巨大的成功的呢?答案可能是语言在根本上比它看起来更简单。这意味着,即使是具有简单的神经网络结构的LLM,也能够成功地捕捉人类语言的“本质”和背后的思维方式。在训练过程中,LLM已经通过某种方式“隐含地发现”了使一切成为可能的语言规律。
之前讨论过,在ChatGPT内部,任何文本都可以被有效地表示为一个由数组成的数组,可以将其视为某种“语言特征空间”中一个点的坐标。因此,ChatGPT续写一段文本,就相当于在语言特征空间中追踪一条轨迹。现在我们会问:是什么让这条轨迹与我们认为有意义的文本相对应呢?是否有某种“语义运动定律”定义(或至少限制)了语言特征空间中的点如何在保持“有意义”的同时到处移动?
产生“有意义的人类语言”需要什么?过去,我们可能认为人类大脑必不可少。但现在我们知道,ChatGPT的神经网络也可以做得非常出色。这或许就是我们所能达到的极限,没有比这更简单(或更易于人类理解)的方法可以使用了。不过,我强烈怀疑ChatGPT的成功暗示了一个重要的“科学”事实:有意义的人类语言实际上比我们所知道的更加结构化、更加简单,最终可能以相当简单的规则来描述如何组织这样的语言。
原文链接: