Press "Enter" to skip to content

“建立对像ChatGPT这样的LLMs背后概念的直观理解 – 第1部分:神经网络、Transformer、预训练和微调”

我确定不只有我一个人这样想,但从我在一月份的推文中就可以看出,当我第一次遇到ChatGPT时,我的想法完全被颠覆了。这种体验与我与任何“聊天机器人”交互的体验完全不同。它似乎能理解用户的意图,以一种只有人类才能做到的方式自然地回答问题和评论。如果有人告诉我在那次对话的另一端还有另一个人,我不会有一丝怀疑。

在最初的兴奋之后,我开始阅读有关这个神秘技术的所有内容。当ChatGPT API在三月份发布时,我开始尝试使用它创建聊天机器人,并写博客记录这一经历(其中一个在VoAGI上获得了推广,我至今为止仍感到非常兴奋)。当然,这还远远不够,我需要更多地了解API调用的另一端正在发生的事情,于是我开始深入研究语言模型、深度学习和转换器等领域。

英国作家阿瑟·克拉克爵士关于预测未来科学和技术进步的三大定律中,最著名的一条是:

“足够先进的技术和魔法无异。”

本博客文章试图以通俗易懂的方式揭开大型语言模型(LLM)背后的概念,解开“魔术师的魔法”,如果你愿意这样说的话。无论你是那些积极关注人工智能趋势的人,还是在探索蓬勃发展的人工智能工程领域并需要对基础知识有所了解,或者只是出于好奇而想满足好奇心,希望你在阅读完本文后能对使ChatGPT成为可能的巧妙概念有更多了解。

神经网络

像ChatGPT这样的LLM是通过人工神经网络对来自互联网的大量公开可访问的文本数据进行训练的。人工神经网络是机器学习算法,旨在以一种抽象的方式模仿我们大脑的结构和学习过程。它们由相互连接的节点或“神经元”层组成,通过对大量文本数据进行重复训练迭代,网络学习文本中的模式和语言的细微差别,足以自动生成连贯的单词、句子或整个文档。

每个圆圈代表一个神经元,每个神经元通过可编程参数与下一层的其他神经元相连,这些参数在模型“学习”完成所需任务时进行调整,例如,识别图像是猫还是狗。GPT-3是在一个具有96层和1750亿个参数的神经网络上进行训练的。据报道,GPT-4具有1万亿个参数。图片来源

人工神经网络是深度学习的主要特征,它在人工智能领域非常重要,因为它能够捕捉数据中的复杂模式和依赖关系,并从这些模式中推广出对新的、未见过的数据的预测。在语言建模的背景下,这意味着根据前一个单词或一系列前置单词预测接下来应该出现的单词。与常规的线性回归等传统机器学习算法相比,神经网络能够通过网络隐藏层的神经元中的非线性数学函数(激活函数)表示和建模大量数据中不同特征之间的非线性关系。

神经网络已经产生了你可能已经与之交互过的消费技术(并且它们不一定局限于语言任务),例如使用面部识别解锁手机、在Pokemon游戏中的增强现实功能或Netflix主屏幕中的节目推荐。

Andrej Karpathy甚至认为这可能是一种全新且更好的编写软件的方式:

例如,不是通过手动编写程序的逻辑(如果满足条件A,则执行x;如果不满足条件A,则执行y),而是通过从训练数据中的示例中学习,如果在生产中遇到“条件A”,则应执行x。这些条件/逻辑不是由其创建者定义的,而是神经网络通过调整其数十亿甚至数万亿个参数(权重和偏置)来符合这种期望行为。

权重和偏差是连接(用数值表示),帮助确定网络层中的节点/神经元是否被激活以及激活程度如何。在我们的大脑中,生物学的对应物是‘突触’或者发送激活我们生物神经元的电信号。图片来源
通过电信号激活的生物神经元的可视化。研究表明,这种大脑活动是存储记忆并在回忆过去经历时重新播放记忆的机制。来源

没有人知道每个单独的权重和偏差具体起什么作用,或者单个权重如何影响人工神经网络行为的变化。这些参数在训练过程中通过梯度更新作为一个整体进行改变(稍后将详细讨论)。

这就是为什么经常听到基于神经网络训练的机器学习模型被称为‘黑箱’。它们的输入和输出可以被观察到,但其内部运作或者如何实现它所做的事情并不容易理解。这也是发现‘新兴’能力的原因。当一个大型语言模型(LLM)变得越来越大(通过其参数数量衡量),它开始在训练中展现出意想不到的能力。例如,GPT-2在语言翻译方面表现出色,GPT-3是一个优秀的少样本学习者,而GPT-4则显示出了人工通用智能(AGI)的迹象。这些都不是明确定义的训练目标,它的主要目标是预测序列中的下一个词。

新兴行为不仅仅存在于大型神经网络中。当一个系统变得越来越大和复杂时,其个体组件之间的相互作用可能会导致意外的行为,这些行为无法通过分析每个单独组件的属性来完全解释——一个蚂蚁是愚蠢的,但是一群蚂蚁却可以建立非常复杂的隧道网络并对抗其他群体。这种现象在社会昆虫(蚂蚁和蜜蜂)、群体行为和其他生物生态系统中得到了记录。

预训练基础模型

像ChatGPT这样的模型的第一步是预训练一个基础模型。这一步的目标是创建一个能够自主生成连贯词结构或者生成类似人类的文本(短语、句子、段落)的机器学习模型,它根据其对给定前面的单词预测下一个单词的预测生成单词序列。这一步被称为预训练,因为这一步的输出——基础模型仍然是一个有限的实际应用并且通常只对研究人员感兴趣的原始产品。基础模型通过后续的微调阶段进一步‘训练’,以便用于特定任务,如文本翻译、摘要、分类等。

在预训练开始时,神经网络的参数被设置为随机数值。大量互联网文本数据中的单词被转化为标记(作为整数)和嵌入(作为向量)的数值表示形式,然后被输入到神经网络中。

标记和嵌入将在本系列的下一部分详细讨论,但现在可以将标记视为模型词汇表中单词的唯一ID,将嵌入视为该单词的含义。

<img alt="例如,‘the’这个单词被分配一个标记ID(5),然后被分配一个具有n个元素或维度(例如512)的嵌入向量。这里只显示了3个示例值(-0.0340,0.0068和-0.0844)。这个矩阵中的单词嵌入在预训练开始时被赋予随机值。随着模型的‘学习’,这些值会得到调整——具有相似语义含义的单词的值在每次训练迭代中会变得更加相似/接近。图片来源。

模型会给出一个单词或一组单词,并根据这些前置单词预测下一个单词。然后,模型会在未见过的数据上进行测试,并根据来自模型之前从未见过的隐藏数据集中的“真实下一个单词”来评估其预测的准确性。

在机器学习中,数据集通常被划分为训练数据集和测试数据集。训练数据集用于训练模型,测试数据集(未见数据)用于评估模型的预测结果。测试集还用于防止“过拟合”,即模型在训练数据上表现出色,但在新的未见数据上表现差。

考虑训练数据集中的示例句子:“我必须去商店”。这个句子可以按照以下方式使用:

  1. 模型给出“我有”并预测“去”。
  2. 然后给出“我有去”并预测“商店”。
  3. 然后给出“我有去商店”并预测“的”。
  4. 最后给出“我有去商店的”并预测“东西”。

通过对整个训练数据集进行这样的处理,模型将能够学习哪些单词倾向于出现在不同的单词组合之后。它学习了“我”和“有”之间的依赖关系,“有”和“去”之间的依赖关系,以此类推。

在测试步骤中,过程类似,但使用的是模型未经训练的句子或文本。这是一种检查模型如何将其对语言理解推广到未见数据的方式。

让我们考虑测试集中的未见句子:“她需要去___”。即使这个确切的句子不是训练数据集的一部分,模型仍然可以利用其遇到的类似上下文的理解进行有根据的预测。例如,在训练句子“I have to go to the store”中,经常会看到短语“去…的”之后跟着一个地点或目的地。基于此,模型可能会预测“市场”、“商店”、“办公室”或其他类似的单词,因为它们在这种上下文中是常见的目的地。因此,尽管模型是在“我必须去商店”及其具有类似意义的变体上进行训练的,它能够从中推广出“她需要去…”后面很可能是一种类似类型的单词,即使这个确切的句子不是其训练数据的一部分。

模型如何“学习”

在预训练开始时,当模型被要求进行预测时,它通常会输出一些荒谬的单词序列,因为它还没有“学到”任何内容。在我们之前的示例句子中,它可能会生成单词“苹果”而不是“商店”作为真实的下一个单词。由于语言模型是概率性的,在这种情况下,“错误”意味着模型将更高的概率(被选中的概率)分配给单词“苹果”,而不是预期的单词“商店”。

最终目标是让模型每次在被要求预测接在序列“她需要去___”后面的下一个单词时都输出“商店”。

开始(左侧)和结束(右侧)训练期间字符级语言模型的示例输出,即预测下一个字母或字符。图片来源

通过使用“损失函数”来计算实际和预期或真实的下一个单词之间的差异,其中差异越大,“损失”值就越高。损失是一个单一的数字,它“平均”了您要求模型进行的所有预测的损失或错误。通过这些步骤的多次迭代,目标是通过反向传播和梯度下降优化的过程来最小化这个“损失”的值。模型通过这些步骤“学习”或改善其预测能力。

您可能想知道如何“计算两个单词之间的差异”以得到损失值。请注意,通过神经网络的是不是实际文本(单词、句子),而是这些文本的数值表示,即它们的标记和嵌入。一系列单词的数值表示通过网络的层进行处理,其中输出是一个对词汇表的概率分布,用于确定接下来是什么单词。未经训练的模型可能会将单词“苹果”的标记ID(例如0.8)与真实的下一个单词的标记ID(例如0.3)相比较,为“苹果”分配更高的概率。神经网络将不会遇到任何文本的单个单词或字母。它专门处理数字,基本上是一个带有额外步骤的计算器。 😅

图片来源

通过反向传播,模型的误差程度(损失值)通过神经网络向后传播。它计算每个独立权重和偏置的输出的导数,即输出对每个特定参数变化的敏感程度。

对于那些在学校没有学过微积分的人(比如我自己),可以把模型的参数(权重/偏置)想象成可调节的旋钮。这些旋钮是任意的,也就是说你无法确定它们以何种特定方式控制模型的预测能力。这些旋钮可以顺时针或逆时针旋转,对输出的行为有不同的影响。旋钮A顺时针旋转时可能会使损失增加3倍,旋钮B逆时针旋转时可能会使损失减少1/8(以此类推)。所有这些旋钮都会被检查(数十亿个),以获得输出对每个旋钮调整的敏感程度的信息,这个数值就是它们相对于输出的导数。计算这些导数的过程被称为反向传播。反向传播的输出是一个向量(一组数字),其元素或维度包含参数的个别导数。这个向量是神经网络现有参数值(或当前学习状态)相对于误差的梯度。

神经网络参数作为可调节的旋钮。来自Unsplash

向量有两个属性:长度或大小和方向。梯度向量包含误差或损失增加的方向信息。向量的大小表示斜率或增长速度。

将梯度向量想象成你正在从一个多雾的山上下降的地图——梯度下降优化是利用梯度向量的方向和斜率信息尽可能高效地到达山底(最小的损失值),通过导航到具有最大下降斜率(梯度向量的相反方向)的路径。这涉及迭代地调整网络的权重和偏置的值(通过从中减去小的值即学习率)以达到这种最优状态。

梯度下降优化从高误差率或损失(红色)开始,通过可视化一个具有3个维度的梯度向量来达到最小损失(蓝色)。实际的梯度向量具有数十亿个维度,很难进行可视化。然而,不管大小如何,优化概念对所有向量都适用。图片来源
下面是一个用Python代码实现的梯度下降优化示例。模型被要求进行预测(前向传递),然后通过网络进行反向传播(后向传递)计算预测中的误差。然后使用随机梯度下降(SGD)来更新模型的参数。这个过程通过循环重复多次,在每次重复或步骤中降低损失值(黄色部分),提高模型预测的准确性。图片来源

经过这些步骤,希望在下一次训练迭代中,当模型再次被要求为”She needs to head to the…”预测下一个单词时,它应该给单词”store”分配更高的概率。这个过程重复多次,直到损失值没有显著变化,意味着模型的学习已经稳定或达到收敛状态。

神经网络学习如何进行英语(以及其他语言)交流的关键在于大量的数学。这归结为在神经网络内部进行的复杂计算生成的一个单一数字(损失值)的减小。当这个数字变得更小时,语言模型变得更加“流利”或“连贯”。在网络的内部层之间应用的数百万或数十亿的矩阵和向量之间的数学运算以某种方式融合成了语言的几何模型。

为了帮助理解,我们通过使用“理解”、“看到”和“学习”等词语来使模型拟人化,但实际上,它没有任何执行这些任务的能力。它只是一个根据概率分布给定的采样方法来输出下一个最佳标记的算法。

变形金刚(Transformer)

变形金刚是自然语言处理(NLP)研究的突破,它给我们带来了ChatGPT。它是一种利用独特的自注意机制的神经网络架构。它在2017年发布的论文“Attention is All You Need”中被广泛讨论。几乎所有最先进的LLM(如BERT、GPT-1)都是在该论文之后发布的,它们都建立在变形金刚的基础上或使用了变形金刚的思想。这篇论文对深度学习的影响非常重要,几乎无法估量。它现在正在应用于视觉任务,使其真正成为多模态,并展示了其处理其他类型数据的灵活性。它还开启了“……是你所需要的”迷因趋势,甚至Towards AI编辑团队也无法抗拒。

变形金刚模型架构。图片来源

在变形金刚之前,用于NLP的神经网络使用的是处理顺序数据的架构,例如循环神经网络或RNN。这意味着在训练过程中,网络会按顺序逐个处理每个单词或标记。需要注意的是,单词的顺序对于保留序列的上下文/含义很重要——“猫吃了老鼠”和“老鼠吃了猫”是两个含义不同的句子,尽管它们由完全相同的单词/标记组成(顺序不同)。

循环神经网络。来源

变形金刚的一个关键创新是摒弃了循环或顺序标记处理。它不是按顺序处理标记,而是在输入到网络的内部层之前,将每个单词的位置信息(即单词在正在处理的序列中出现的顺序)编码到其嵌入中。

更重要的是,变形金刚解决了神经网络(如RNN)在处理长期依赖性时遇到的问题。给定足够长的词序列(例如非常长的段落),RNN会“遗忘”它先前处理的单词的上下文,这被称为梯度消失问题。RNN在每个顺序或时间步骤中存储有关单词在序列中的相关性的信息,称为隐藏状态。当它处理一个长序列时,在反向传播过程中,与较早时间步相关的梯度可能变得非常小。这使得RNN难以从序列的早期部分学习,并且可能导致对先前处理的单词信息的“丢失”。对于下一个单词预测模型来说,这是一个问题,特别是如果那些“被遗忘”的单词对当前生成的序列的上下文很重要。

变形金刚通过“自注意”机制解决了这个限制。与位置编码一样,每个单词通过其嵌入被编码为与序列中的其他单词“关注”程度的信息,无论序列的长度如何或所关注单词在序列中的相对距离如何。这种编码同时适用于序列中的所有单词,使得变形金刚能够保持任何序列的上下文。

在这个例子中,单词“swam”对单词“river”和“bank”有更多的关注(或分配更高的权重)。因此,在自注意层中编码单词的输出嵌入时,它的嵌入值将更多地受到“river”和“bank”的嵌入的影响。图片来源

一个词应该对其他词的关注程度是一种“学习”特性,存储在模型权重中,并通过矩阵乘法编码在词嵌入中。随着模型在训练数据中了解单词之间的关系越来越多,这些“学习”会在每次训练迭代中进行调整。

<img alt="使用矩阵乘法进行自注意力的公式(左侧)图像来源和样本序列“your cat is a lovely cat”的自注意力分数(右侧)。在矩阵的第二行中,单词“your”对单词“lovely”(0.179,除了自身)的关注度最高。该矩阵是查询(Q)和键(K)矩阵的点积,每行的值等于1(或100%),以反映每个单词“关注”序列中所有其他单词的比例或程度。单词的“查询”值表示它应该更多关注或集中的单词的“特质清单”。单词的“键”值包含单词的“特质”。符合“清单”中定义的条件的单词将受到更多关注。点击放大。图像来源

自注意力层的最终输出(在上面的示例中为Z矩阵)是一个包含每个单词在序列中位置信息(来自位置编码步骤)以及每个单词应该关注序列中所有其他单词程度的词嵌入矩阵。

然后将其馈送到传统神经网络中,就像之前在文章中讨论的那样(称为前馈神经网络)。对于变压器的每个隐藏层,这些步骤(注意力+前馈-构成一个变压器块)会重复多次-例如,GPT3会重复96次。每个层的转换为模型关于如何最好地预测序列中的下一个单词增加了额外信息的“知识”。

根据OpenAI发布的LLM缩放定律,为了训练更好的模型,增加参数数量的重要性比增加训练数据的大小高出3倍。(注:DeepMind后来发表了一篇持不同观点的论文。)这意味着计算要求显著增加,因为处理更多参数数量需要更复杂的计算。并行化是处理这个问题的关键,它是将单个任务划分为多个子任务,可以在多个计算资源上同时处理。

对于RNN来说,由于其顺序性质,实现并行化是困难的。但对于变压器来说,它可以同时计算序列中所有元素之间的关系,而不是按顺序。这也意味着它们与GPU或显卡配合得很好。图形渲染需要大量同时发生的简单计算。GPU具有众多、小巧、高效的处理核心,专为并行操作而设计,使其非常适合深度学习中的矩阵和向量运算等任务。

人工智能的“主流化”和构建更大更好模型的疯狂竞争对GPU制造商来说是一个福音。截至撰写本文时,尤其是NVIDIA的股价已经增长了200%,使其成为今年表现最佳的股票,并推高了其市值达到1万亿美元。他们加入了苹果、谷歌、微软和亚马逊等巨头公司的这个独家俱乐部。

变压器是一个相当复杂的主题,上面的解释为了更容易理解更广泛的观众,省略了重要的概念。如果您想了解更多信息,我找到了以下更详细的介绍:Jay Allamar的图解变压器,Lili Jiang的药剂类比,或者如果您想要更高级的内容- Karpathy的nanoGPT,它以莎士比亚式的方式胡言乱语。

像ChatGPT这样对’chat’模型进行微调

预训练的输出是基础模型或基础模型。最近发布的文本生成基础模型的例子有GPT-4、Bard、LLaMa 1和2,以及Claude 1和2。由于基础模型已经通过预训练(句子结构、单词之间的关系等)具备了对语言的广泛知识,您可以利用这些知识进一步训练模型来执行特定任务,例如翻译、摘要或像ChatGPT这样的对话助手。其基本思想是,模型通过预训练获得的一般语言理解能力可以用于各种下游任务。这个思想被称为迁移学习。

如果您向基础模型提问或提示问题,它可能会用另一个问题回答您。请记住,它的训练目标是通过预测序列中前一个单词,来完成一个单词序列。例如:

以下是使用提示或输入:“法国的首都是什么”对GPT 3基础模型‘davinci’的样本完成或输出。图片作者:生成自OpenAI playground。

然而,我们可以通过“欺骗”基础模型,使其回答问题,让它认为自己正在尝试完成一个序列:

以下是使用一些提示进行的‘davinci’的另一个完成。‘巴黎’ —— 高亮的单词是完成/输出结果。图片作者:生成自OpenAI playground。

利用这个思想,模型通过以问题和答案形式的不同提示/完成对进行了另一轮训练。与通过预测一组单词之后下一个单词是什么来从互联网上的随机文本“学习英语”不同,模型“学习”了以“问题”形式完成提示时,完成应该是“答案”形式。这是监督微调(SFT)阶段。

样本监督微调数据集。图片来源

预训练利用了一种称为自监督学习的机器学习方法,模型通过从训练数据本身中创建“标签”或目标词来训练自己。以下是早前给出的例子:

  1. 模型给出“I have”,并预测“to”。
  2. 接着给出“I have to”,并预测“go”。

模型根据语料库中的内容创建目标词‘to’和‘go’。请注意,目标/基准词对于损失值(即当前模型的预测与目标之间的差异)非常重要,以及后续的梯度更新。

与预训练阶段相比,微调阶段的训练数据准备工作可能更加费力。它需要人工标注者和审阅者仔细注释“标签”或目标完成。然而,由于模型已经学习了语言的一般特征,即使任务特定的训练数据有限,它也可以快速适应进行微调的语言任务。这是迁移学习的一个好处,也是预训练背后的动机。根据Karpathy的说法,99%的计算能力和训练时间以及大部分用于训练LLM的数据都是在预训练阶段使用的,微调阶段只使用了一小部分。

微调使用与之前概述的相同的梯度更新方法,但这次它是通过学习一系列由人类策划的问题/答案对来教导它如何组织其完成,即“说什么和如何说”。

它经历了其他微调阶段,如奖励建模和从人类反馈中进行强化学习(RLHF),以训练模型输出更符合人类偏好的完成。在这个阶段,人类标注者会对模型的完成结果进行评分,评估其真实性、有用性、无害性和有害性等属性。人类偏好的完成结果会被加强到训练中,即在经过微调的模型的完成中出现的概率更高。

GPT助手训练流程。图片来源。

这些微调步骤的输出是“助手”或“聊天”模型,例如ChatGPT。这些是这些基础模型的“零售”版本,当您访问ChatGPT网站时与之交互。GPT-3基础模型(davinci)可以通过API访问。截至目前,GPT-4基础模型尚未作为API发布,并且鉴于OpenAI最近有关竞争和LLM安全的声明,不太可能会发布。这些微调步骤通常适用于所有可用的商业和开源微调模型。

第一部分结束

注意:第2部分将讨论先于LLM爆炸但同样引人入胜的“嵌入” —— 嵌入模型的训练方式以及如何从词嵌入生成句子或文档级嵌入(用于RAG系统)。我们还将讨论“标记”以及为什么需要它。在本文中,我们暗示标记=单词以简化问题,但实际上,现实世界中的标记可以是单个字符或字母、子词、整个单词、一系列单词,或者在单个模型词汇中包含所有这些类型!

如果我有任何错误,欢迎在评论中纠正!:)

资源/参考资料:

3blue1brown. 神经网络是什么?

Geeks for Geeks. 人工神经网络及其应用

Jay Alammar. 图解Transformer

Luis Serrano. Transformer模型是什么,它们是如何工作的?

Andrej Karpathy. GPT的现状

Andrej Karpathy. 让我们构建GPT:从头开始,用代码解释。

Leave a Reply

Your email address will not be published. Required fields are marked *