文:城主
前言
作为颇有建树的AI科学家,Hyung Won Chung从Google跳到OpenAI一年多,他刚在网络上所做的LLM技术分享中提供了LLM在2023年的最新动向和大量技术细节,颇有价值。
视频传送门:
【"2023年的大模型" :OpenAI科学家最新讲座【中英】-哔哩哔哩】 https://b23.tv/4JV0IlE
=以下是本城根据讲座提炼整理的完整内容=
我将在此讨论2023年的大型模型。
你可能会问,为什么要特意强调“2023年”这个时间点?当我们说“大型”,这其实是有些误导性的。因为今天所称的大型模型,在未来几年内可能就被视为小型了。随着我们对“规模”的定义发生变化,我们在目前的大语言模型中所做的许多见解和结论都可能会变得过时,甚至在某些情况下变得不再适用。然而,幸运的是,那些基于基本原则的见解往往会持续得更长久,比那些初看起来很有前景的新颖观点更为持久。
在本次分享中,我想与大家分享我过去四年在这一领域的工作中得到的基本认识,这些都是我从与一些非常聪明的人交流中获得的。我希望,我今天分享的内容都是基于基本原则的,能够在未来几年内保持其相关性。那么,让我们开始吧。
大型语言模型的一个特点是,某些能力只有在达到一定规模时才会显现。这使得我们需要从不同的角度来看待这个领域。这是我想表达的。此处的具体细节并不重要。在X轴上,我们可以考虑模型的规模,比如模型的参数数量、训练数据的大小、所用的计算资源等。而在Y轴上,可以是你所关心的任务的某些性能指标。我们已经反复观察到这样的模式:小型模型在某些任务上几乎无法取得任何进展,但当模型达到一定规模时,它突然就能够完成这些任务了,有时甚至能做得很好。我们称这种现象为“涌现”,就像某种能力突然“涌现”出来。这在大型语言模型中是非常独特的。
这为AI研究者提供了一种全新的视角。首先,是“尚未”这种观念。假设我们有一个新想法,例如一个新的推理技巧,我进行了实验,发现它不起作用。大部分时间,确实如此。但我不会说这个想法永远不会起作用,我只会说“现在还不行”。这确实是一种根本的思维转变。这意味着,这个想法可能在当前的模型上不适用,但在三、五年后的模型上,它可能会起作用。
为什么这种观点在以前不是那么明显呢?我们已经习惯于在一个基本规律不会真正改变的环境中工作。例如,如果你在物理实验或热力学研究中有了一个新的想法,但实验失败了,你知道这个想法在三年、甚至三十年后都不会成功。但在AI领域,情况则完全不同。例如,GPT-4发布后,研究者们在其基础上进行了大量实验,建立了新的直觉。但随着新模型的发布,很多之前的想法和直觉就变得过时了。
这种转变需要我们不断地更新、抛弃那些基于过时观点的直觉,这对于许多研究者来说是一个新挑战。但这也为新入行的研究者提供了机会。他们可以带来新的视角,尝试那些在以前的模型上不起作用的想法,而在新的模型上,这些想法可能突然就有效了。这种情况在AI这个竞争激烈的领域已经发生了很多次,这是一个非常有意思的现象,值得我们深入思考。
我想分享的下一个观点与我们如何站在前沿,特别是与缩放曲线有关。这是我要表达的核心思想。在我的日常研究中,我总是在脑海中构建一个画面,并记录所有不成功的实验。这些失败往往是因为某种“智力”上的不足。这可能是一个模糊的描述,但也许这意味着没有足够的推理能力去解决某个复杂的数学或编程问题。因此,我会把这些记录下来,但并不会立即标记为失败,这样在未来可以轻松地重新进行尝试。当出现新的、更优秀的模型时,我会再次运行这些实验,以判断哪些是成功的,哪些是失败的。通过这种方式,我不断更新我的认知,学习新的知识,并围绕新兴能力建立直觉,这与“规模”紧密相关。我相信,这种思维方式将变得越来越重要。
为了进一步解释,让我们简化一下。并不是说所有的任务都需要大规模的处理,但有时确实需要。为了说明,我以GPT-3和GPT-4为例,它们代表了不同的规模。考虑以下三个能力层面:对于“能力一”,GPT-4尚未达到,但它非常接近一个转折点,这意味着我们可能会突然看到一个跃进式的改进。对于“能力二”,尽管我们有了强大的GPT-4,但仍然有很大的距离,目前的方法可能还不能提供实质性的帮助。而对于“能力三”,GPT-3已经超越了转折点。在这个阶段,我所进行的研究可能只会带来渐进式的改变。
这是一个提示:实际上,我经常发现我正在解决的问题不仅仅是上述两三种。但只要我坚持这种思维框架,并经常回顾和反思,更新我的直觉就会变得更加容易,帮助我明确我到底在解决哪种问题。这就是我想向大家介绍的核心思想。总的来说,我们所做的一切都与“规模”有关,而从“规模”的角度看问题确实非常关键。
但如何真正实现这种“缩放”呢?我将在接下来的时间中深入探讨这个问题。目前为止,所有的大型语言模型都采用了Transformer架构。你可能已经对此非常熟悉了。但在这里,细节不是那么重要。我们要关注的是基本的思想,并从基础原理出发。为此,我们需要过滤掉不必要的细节。
事实上,Transformer的内部结构对我们来说并不那么关键。我们可以从功能的角度来看待Transformer,将其视为一个包含一系列矩阵乘法的序列到序列的映射。其输入是一个长度为D的序列,代表Transformer的宽度和长度;输出也是一个同样大小的数组。
这主要用于模型训练。虽然对于实际推理,情况可能有所不同,但缩放主要是在预训练阶段发生的,且输入和输出的长度是相同的。这是一个非常简化的视角,但它提供了一个清晰的图景。在此基础上,我们可以进一步思考输入和输出的形状,以及从一开始就会发生的事情。例如,我们可能有一个句子,这只是一个简单的字符串。然后,我们需要对其进行标记化,使用BPE或句子片段等方法,这基本上是一个尝试尽可能压缩文本的外部模型。这样,我们就可以得到一个整数列表。接下来,我们会将这个列表嵌入到一个隐藏的空间中,这就是所谓的词嵌入。
每个标记现在都被表示为一个长度为D的向量,并且我们有这些向量的总长度。这就是实际计算的开始。我们有N个Transformer层,这些层只是从一个序列映射到另一个相同的序列。这里,一切都与规模有关,而且我们尽量不要做过多的假设。我们希望每个序列标记都能与其他标记进行交互,所以我们应该允许它们这样做,但不要限制它们的交互方式。在Transformer中,一种实现这一点的方法就是通过计算点积。这就是我们要达到的目标。
模型的学习和计算细节,如点积的获取,虽然复杂,但都是为了执行主要的计算任务。这些计算主要在高维数组中进行,涉及到矩阵乘法和数组计算。在Transformer模型计算的最后阶段,我们得到了一个序列。接着,我们采用特定的损失函数(我稍后会介绍这个函数)来评估模型的预测。这个损失函数基于模型对下一个Token的预测来计算最大可能性。目标是预测下一个标记,并根据预测的准确性得到一个数值。有了这个数值后,我们会进行反向传播,更新模型的所有参数。
在实际应用中,这些计算是批量进行的。这意味着我们的计算不仅仅针对一个数据点,而是同时处理多个数据点。整个数据批次中唯一的相互依赖是在最后的计算损失步骤,我们会取其平均值。
这就是模型计算的全部过程。绝大部分的计算都在这里发生。因此,当我们讨论如何扩展Transformer模型时,这就是我们要关注的关键部分。
扩展Transformer从根本上来看,就是要确保这部分的计算能够在很多机器上高效地执行。这涉及到如何将Transformer中的所有这些矩阵合理地分配给各种机器。关键是要确保在尽量减少机器之间的通信的同时进行合理的分配。
考虑到我们需要在多台机器上进行大量的矩阵乘法,我们首先从一个简单的矩阵乘法例子开始。假设我们有八台机器,可能是CPU或GPU。我们的任务是执行一个16x16的矩阵乘法。
为了实现这一目标,我们首先需要对硬件有一个抽象的认识。这八台机器可能位于同一个房间,或者分布在不同的地方。我们不需要过多地关心它们的物理布局,而是在虚拟空间中定义一个网格来表示它们。
每台机器都负责矩阵的一部分。我们使用颜色编码来表示A矩阵的各个部分应该分配给哪台机器。这种方式使得每台机器都可以并行地执行其分配到的任务。
这就是我们如何分配矩阵以及每台机器应该执行的任务。
首先,我们来探讨机器的工作原理。对于输出矩阵C,在执行矩阵乘法后,我们的目标是使机器一的切片位于8x4的左上角。这是一个明确的需求。
接下来,我们需要确定机器要执行的操作。考虑矩阵乘法的特性,我们通常对列和行进行计算。为了完成这个操作,机器需要获取额外的数据。它自身并不拥有执行此操作所需的全部数据。为了解决这个问题,我们执行了一系列收集操作,这是MPI中的一个操作。具体来说,机器需要与其他四台机器进行通信来获取数据。每台机器都有其本地的数据存储。当机器一与机器二、三、四通信并获取所需数据后,它将拥有所有的数据副本。这种收集操作被所有机器执行,这也是为什么它被称为“全体收集”而不仅仅是“收集”。
当机器拥有所有必要的数据副本时,它可以开始计算。值得注意的是,这种计算是在所有八台机器上并行进行的,这也是其能够快速计算的原因。但这也带来了一个代价,即通信成本。我们需要确保计算的速度优势超过了通信的代价。
对于矩阵乘法,我们可以总结为使用“爱因斯坦求和符号”。这为我们提供了一种高层次的方法来描述数组计算。基本规则是,如果一个字母在两个输入中都出现,则将它们的分量相乘。例如,numpy中的A乘以B可以表示为两个字母I的乘积。如果一个字母没有出现在输出中,则需要对该维度进行求和。这与矩阵和向量的乘法相似。
爱因斯坦求和提供了一种更为通用的方法,允许我们增加更多的维度,不仅仅是二维或一维。因此,从这个角度来看,矩阵乘法可以表示为爱因斯坦的MN,MP,其中M是收缩维度。这就是为什么我们要这样做的原因
首先,我们有各种标签的数组轴,例如“国会议员”和“明尼苏达州”。这种映射方式就是将N映射到Y轴和X轴的数组轴。有没有想过,有一种神奇的装饰器可以自动并行化这种映射并为你完成所有工作呢?我稍后会详细讨论这种实现方法,但真正的实现过程与此非常相似。我们可以将其视为一种魔法,它只需插入在二维中聚集的所有数据,并返回其并行化版本。这就是全部内容。
爱因斯坦求和为我们提供了一个框架,告诉我们需要做什么。当我们谈论Transformer时,我们主要关心的是自注意力层,这是Transformer的核心部分。除了softmax外,所有这些操作都可以用Einsum来表示。你可以简洁地将其布局,其中X是三维序列,是模型的长度。所有其他参数都是模型学习和更新的参数。当你拥有这种布局时,你就得到了一个带有标签数组轴的爱因斯坦运算。
现在,我们如何并行化这个操作呢?首先,我们有八台机器。我们不再使用X或Y这样的标签,而是按照惯例使用“数据”和“模型”这两个词。这意味着数据并行和模型并行。这种网格并行方式最初是TensorFlow在2018年提出的,虽然现在有些过时,但我们仍然使用这个术语。
为了并行化,我们只需稍作修改。我们并行化它,并将B作为数据映射,因为B代表了最佳维度。我们在数据轴上分配了不同的机器,而N是序列长度。在Transformer的任何并行版本中,我们都不会跨序列长度进行并行化,因为那里发生了很多相似的操作。而与D、H(头数)相关的是模型维度。实际上,这就是为什么多头注意力是如此有效的原因。它是由并行策略驱动的。
现在,一旦你有了这种并行策略,你可以使用完全相同的代码,并行化它,并在八台或任意数量的机器上运行。这是一个常见的例子,使用八台机器,但这个框架实际上可以适用于任意数量的机器。从谷歌的博客文章中可以了解,实际上在TPU V4 Pod中,它可以使用高达3072个芯片。当我们训练Palm模型时,我们使用了两个pods,所以这里我们使用了6000个芯片,每个芯片的计算能力都与高端GPU相当。
如今,你手头拥有这批强大的机器,你可以按照固定的模式定义一个网格。模型并行维度为48,数据并行维度虽然在2D中显示,但可以扩展到64。在Palm中,我们采用了不同的配置,但核心思路仍然相同,只是机器数量有所增加。一个需要注意的细节是DCN(数据中心网络)的数据并行性。当两个Pod之间没有直接连接,但都连接到数据中心网络时,其传输速度大约为每秒25GPS,这相对于连接GPU pod的速度来说是较慢的。因此,我们在此处避免了模型并行化。在进行梯度计算后,我们在数据中心网络上进行梯度求和,这个过程大约需要一秒钟。尽管我不确定具体的时间,但这并不重要,因为当我们训练像Palm 5400亿这样的模型时,每个训练步骤需要大约17秒,所以额外增加的一两秒并不会带来太大影响。
这种体验确实很有趣,我只需要输入代码,然后在我的笔记本电脑上运行,程序就会自动在所有这些机器上执行。这种规模化的方法,如果你真正理解了它,最后的实现其实只是我刚刚描述的大量机器上的矩阵乘法。所以,我们一直都在假设这种并行化装饰器是可行的,但如何真正实现它呢?一种方法是使用GSPMD,这是一种基于编译器的方法。你可以编写神经网络代码,就像你拥有一台拥有无限内存的机器一样,不需要进行任何并行化处理。我们就是这样做的,不进行任何通信,只是表示神经网络的核心部分,并将训练步骤表示为一个计算图。你只需要指定这些输入和输出如何映射到硬件轴,然后交给XLA处理,它会自动插入所需的通信操作。这种方法确实像魔法一样,但它并不总是有效,需要经过多次迭代,并且很多人都在尝试。但现在,许多大型模型,如Google、P5、Palm、Switch和Transformer,都使用GSPMD作为后端,完全采用我所描述的方法。当然,还有其他的方法。我对其他方法不是很熟悉,但你可以考虑手动注解和编译器操作。但无论采用哪种方法,最终的过程都是相同的,都涉及将数组轴映射到机器。有时手动方法更为优越,因为它提供了更多的控制权。
以下是一些具体的例子。对于许多研究人员来说,使用GSPMD进行并行化可能过于复杂。因此,Jax推出了一个名为Pjit的前端接口。我推测它被称为Jit是因为它变得非常实用。我们需要并行化定义的训练步骤。我们用Jax的Pjit作为装饰器来包装这个步骤。这样,你得到的训练步骤可以在大量机器上运行。这个具体的代码实际上就是用来训练Palm的。你可以查看这些代码,了解它们是如何工作的。尽管有些代码模板化,但既然你已经熟悉了这个框架,你可能对其中的内容有所了解。这些代码是开源的,基于T5X框架构建。我们还有一篇简短的论文描述了该系统,链接在文章底部。
现在,从工程和硬件系统的角度来看,这些都很好。但从机器学习的角度来看呢?最近发布的Llama2模型在成功运行后的表现非常好。但实际进行预训练时,迭代不同的想法的成本是非常高的。你可能想尝试不同的数据分割方式或其他方法,但每次都需要在大规模上运行,这非常耗费资源。如果你正在进行这样的运行,你可能会面临这样的场景:假设你有2万亿个Token,需要运行50天。然后,你可能需要花费一天的时间来评估进展情况。在此情境下,你需要做出决策,例如,"看起来我们的700亿模型表现得很好。"但这种决策非常困难,因为你已经花费了大量的GPU时间。这种情境下的决策制定是非常紧张和困难的。
预训练的核心是所谓的"缩放法则"。GPT-4的技术报告和OpenAI之前的论文都讨论过这个概念,我认为这是一个关键的概念。我们在这里讨论的是如何预测,如何根据小规模模型的性能外推到更大规模的模型,比如GPT-4。这种缩放定律是基于小规模模型的数据开发的。这为我们提供了一个指导方针,帮助我们预测模型在更大数据上的表现。如果你可以预测模型的扩展损失,那么这将是一个非常有价值的工具。预训练的这一部分确实非常关键。我想说的是,尽管现在的扩展比两年前更为简单,但仍然是一个巨大的挑战。这不仅仅是简单地扩大模型规模,还有很多其他考虑因素需要考虑。
以下是一些具体的例子。在Palm的训练过程中,我们遇到了损失值的高峰现象。这个问题实际上已经在论文中被提及,你可以去查阅。整个训练过程中,大约出现了20次损失高峰,这让很多人感到担忧,因为损失值突然从两点上升到了六点。这种情况确实不太理想。为了解决这个问题,我们训练了三个模型,使用完全相同的数据,但只有一个模型出现了这种情况。这种问题很难调试,并且在小规模上很难复现。我们确定这并不是由于数据问题引起的。一些研究者进行了实验来验证这一假设。每当这种情况发生时,它都会造成大量计算资源的浪费,这使得大规模训练变得更具挑战性。
尽管如此,随着技术的进步,对于某个给定的规模,如Llama模型,训练变得更加容易。但与此同时,我们也发现,技术规模的增长速度超过了解决这些问题的速度。大多数人并不会尝试在更大的规模上训练模型,他们可能会选择等待其他研究者的进展,并基于此进行进一步的研究。
这自然地引导我们进入了下一个话题:仅仅增大规模并不能解决所有问题。除了大规模的工程工作,我们还需要进行更多的研究,尤其是在模型训练完成后。让我来解释一下为什么我们可能需要在训练后进一步优化模型。由于预训练模型的学习目标仅仅是预测下一个Token,我们不能直接与它交互。例如,如果输入是一个问题,模型可能会持续生成内容,而不是直接回答这个问题。我们所期望的是一个简洁的答案。为了解决这个问题,我们采用了一种技巧,即构建问题,使得答案恰好是下一个Token。这确实是一个有力的技术,但它并不是真正的通用解决方案。
更大的问题是,预训练模型可能会盲目地生成内容,即使这些内容是恶意的或有害的。特别是,模型不知道如何拒绝某些提示。因此,所有这些我们认为重要的能力,例如与人类价值观的一致性,都需要在训练后的阶段进行教育。我更喜欢称之为"训练后Post-Training"。
以下是当前大型语言模型的四个主要阶段。首先,预训练是第一阶段。接下来的三个阶段分别是:指令微调(有时也被称为SFT,即监督微调)、奖励模型的训练以及策略模型的训练。这也涉及到了RLHF,即强化学习的部分。我们将按照1、2、3的顺序逐个介绍这些阶段。
首先,我们来探讨指令微调。其核心思想是为所有任务建立从自然语言指令到自然语言响应的映射。回想一下,我们在采纳这种方法之前是如何进行任务的。
例如,在2018年,当时最先进的模型是BERT。如果我们需要完成一个分类任务,我们将首先使用BERT对句子进行编码,然后将其映射到分类空间,这需要一些特定于任务的参数。但当我们尝试进行多任务学习时,这种方法就显得不太实用。
在T5模型中,这个问题得到了改善,因为它的输入和输出都是文本。因此,所有的任务都可以通过文本到文本的映射来完成,这使得多任务学习变得更加简单。
但在多任务学习中,模型需要知道它正在执行哪个任务。为了解决这个问题,我们可以为模型提供元数据,比如"这是COLA任务"。但这种方法感觉有些不自然。相反,指令微调的方法则是使用自然语言来描述任务,例如"判断以下句子是否可接受",这样模型就能理解并执行相应的任务。
回顾过去,这种方法在T5或2018年并不明显,因为当时人们并不认为语言模型能够理解这些指令。但随着模型规模的增长,我们发现模型确实有能力在某种程度上理解这些指令,并利用自然语言的丰富性来统一各种任务。这就是指令微调的基本思想。进一步地,我们也可以将这种方法扩展到对话场景中,其中模型可以与另一个代理进行交互,而不仅仅是简单地响应指令。这就是指令微调的核心思路。
去年,我在谷歌工作时撰写了一篇论文,探讨了指令微调的潜能及其边界。但在深入讨论之前,我想先说明一点。当我们按照特定的指令进行模型训练时,可能会遇到在训练过程中未曾涉及的新任务。但由于这些新任务仍然是基于指令的,所以只需按照这些指令来操作模型即可。这就是所谓的“概括”。这是一个非常核心的概念。那么,一个自然的问题是,如果训练集中包含更多的指令,是否能得到一个更好的模型?这样的模型是否能够更好地概括?
为了验证这一点,我们收集了大量的学术任务,总共有1836个,并将它们结合起来进行训练。我不打算深入细节,但我已经在论文的末尾提供了链接,供有兴趣的读者查阅。这篇论文描述了Flan、T5和Plan等模型的起源。我们制作了一些图表来展示,其中X轴表示模型的大小,包括80亿、620亿和5400亿。Y轴表示了评估集的平均分数。我们精心选择了其中6个在训练过程中未见过的难度较大的任务。可以看到,一个拥有80亿参数的模型表现得相当好,但其分数仍低于10%。
因此,我们的结论是,尽管增加更多任务可以提高性能,但其效果是递减的。这一点在另一张图中可能更为明显,这张图显示了微调任务的数量与性能的关系。从中我们可以看到,每个模型的性能都提高了大约10%,但增加更多的任务并没有带来太大的帮助。关键在于任务的多样性。并且,即使是在1800个任务中,我们测试过的任何大小的模型,或者任何类型的模型,都能从这种方法中受益。我认为这种方法非常有效,但它确实存在局限性。
再次思考这个问题,我们需要考虑学习的目标是什么。在这个学习阶段,我们到底在教模型什么呢?在监督学习中,我们常常使用交叉熵损失或最大似然估计作为学习目标。这意味着对于给定的输入,我们期望模型能够输出一个唯一正确的答案,而所有其他答案都被认为是错误的。在强化学习的文献中,这种方法被称为“行为克隆”。简而言之,如果我们有足够多的示例,模型应该能够模仿或“克隆”这些行为,从而在新的、未见过的情境中做出正确的决策。然而,随着任务的复杂性增加,为模型明确定义“正确的行为”变得越来越困难。
我将用一系列例子来阐述这个观点,让我们进行一个思维实验,只考虑存在单一正确答案的情况。答案必须是确定的。以一个简单的例子为起点,二加三等于多少?显然,答案是五,或者可能是“答案是五”这样的回答。但这一点是毋庸置疑的。再来一个稍微复杂一些的,将“我应该学习,而不是看这部电影”翻译成韩语。这是我个人的翻译,我懂韩语,所以这可能是正确的。但这确实是一个有着单一答案的问题,尽管其中可能存在一些微小的差异。
现在,考虑我们在大型语言模型中真正面对的问题。例如,给一个五岁的男孩写一封来自圣诞老人的信,解释圣诞老人并不真实,同时要确保这个信息传递得足够温柔,不伤害这个孩子的感情。对于这样的问题,我很难确定一个最佳答案,更不用说有一个确定的答案了。
所以,当面对这种情况时,我对使用最大似然估计作为我们主要的学习目标感到不太自信。这可能是一个误导。考虑到一些更实际的用例,比如我经常提到的一个提示:“在Python中使用梯度下降实现逻辑回归”。这个问题并没有一个明确的答案。你可能偏向函数式编程,或者你可能更喜欢面向对象的编程风格,但无论你的选择是什么,都可能是有效的。
我们的目标越来越是教导模型如何执行一些更加抽象和模糊的任务。似乎指令微调的目标函数开始成为一个瓶颈。尽管我没有确凿的证据证明这在实践中是一个问题,但我不认为我们能够使用这种非常狭窄的信号来训练一个比GPT-4大上千倍的模型。那么,我们是否可以使用某种方式来替代这个最大似然目标呢?
这就是强化学习与RLHF的核心观点。在强化学习中,我们试图最大化一个预期的奖励函数。考虑到一个代理在下棋时,如果它赢了,我们给予它1的奖励,否则给予0。这是一个有效的奖励函数,但我们实际上可以使用一个模型来为更复杂的情况定义奖励,我们称这个为奖励模型。那么,如何从这个视角来实施它呢?
我们都知道如何使用神经网络进行监督式学习。因此,我们可以使用神经网络来代表这个奖励模型,将其进一步整合到奖励模型中。
核心的概念在于,对于一个特定的输入,我们提供两个答案,并由人类来判断哪一个更受偏爱,而不是直接告诉模型哪一个是最好的。从这两个答案中,这个更为优秀。最初,这种做法可能没有明确地说明为什么一个答案比另一个更好,但重要的是它为模型提供了一种学习人类偏好的方式。
关键在于,尽管某个答案可能被视为首选,但它并不一定是最佳选择。只要它比另一个选项好,模型就可以从中学习。比较的这种方法是至关重要的。为何我们选择比较而不是直接评分?对于如二加三的简单问题,认为五比四更好可能是没有意义的,因为只有一个正确答案。但对于其他复杂的问题,比如某种句子的补全,我可能会提出两个较好的答案,并指出其中一个更为出色。
核心思想是,比较可能比绝对评分更简单。对于这些数学公式,我可能会快速跳过。简单地说,对于两个答案YI和YJ,我们定义了一个概率PIJ,表示答案I优于答案J的概率。这个概率是基于人类给出的标签。这个概率模型实际上是基于奖励的差异,更具体地说,是对数几率。这种建模方法可以追溯到1952年。我们只需重构这个模型并最大化这个概率,因为这实质上是最大似然法。奖励模型是基于最大似然法进行训练的。
这样的方法很好,因为它为策略模型提供了丰富的信号。这是大型模型的最后阶段。在这里,目标函数是我们刚刚学到的,而奖励模型的参数在初始的强化学习阶段就已确定。这个方法可能让你想起了生成对抗网络(GAN),其中有一个判别器和生成器。你固定其中的一部分参数,然后进行另一轮的迭代。
对于这个策略模型,它通常是从监督指令微调的检查点开始的。你只需要为这个提示生成一些补全,然后提供给奖励模型,它会返回一个得分。基于这个得分,如果分数很低,那么我知道这个答案并不好。如果分数很高,那么我会尝试更多这样的答案。
因此,这是数学中的一种试错方法的形式化表示。这基本上是一个宏观的观点。因为我们的目标是通过基于梯度的迭代方法来最大化这一目标,所以我们只需要梯度。
这些梯度是通过一些策略级别的算法(例如PPO)来获得的。核心思想是在满足RM模型的条件下进行迭代。在这个过程中,RM模型对人类的偏好进行编码,并将其传递给策略模型,该模型再通过强化学习来学习这些偏好。
实际上,许多人并不真的喜欢这种方法。我经常听到人们说:“我们应该放弃RLI方法。”许多人,不仅仅是OpenAI的人,都有这种观点。主要的问题是,实施这种方法确实很困难。强化学习是一个非常复杂的领域,很容易出错。一个常见的问题是所谓的“奖励黑客”。如果模型发现长时间的完成得到了更高的奖励,它可能会倾向于产生更长的答案,即使这些答案没有意义。这种模型的行为与人类的偏好是不一致的,这种差异被称为“奖励黑客”。这是一个困难的问题,目前还没有明确的解决方案。
尽管有这些挑战,但我仍然认为RLHF是一个有价值的研究方向。在我看来,最大似然的归纳偏差是太强了。当我们的模型规模增加时,这种偏差可能会导致问题。例如,GPT-4可能还可以,但更大的模型可能会出现问题。学习这个目标函数可以帮助我们克服这种偏见。此外,这个领域还有很大的进步空间。虽然我们已经看到了一些成功的RLHF模型,但这只是开始。
总的来说,我认为如果某个方法在原则上是对的,我们就应该继续研究,直到我们找到正确的方法。
我想通过一个高层次的视角来回顾人工智能的发展。
从基于规则的系统开始,虽然我可能不是很熟悉,但我认为这个高层次的观点是很重要的。在这里,输入是通过手工设计的程序来映射的。在下一代机器学习系统中,输入被转换为手工设计的特征,然后通过一个可学习的部分来映射到输出,如SVM。这个可学习的部分是我用蓝色标出的。随后,这些输出和输入被传递给一个手工设计的损失函数,然后进行迭代。深度学习的主要变革是将手工设计的特征替换为学习到的特征。
特别地,分层的表示学习定义了深度学习的技术特点。这种转变确实取得了巨大的成功。为什么会这样呢?因为它采用了更弱的归纳偏差,并允许了更高的可扩展性。我们现在拥有更强大的计算能力,所以为什么不充分利用它呢?这便是深度学习成功的核心。
因此,如果我们比较经典的机器学习和深度学习,最接近的对比可能是逻辑回归和前馈神经网络。它们处理相同的任务,但前馈神经网络从数据中学习了隐藏的表示。这使得模型能够更好地处理二进制分类任务。
那么,下一个演进阶段会是什么呢?如果仅仅是改变一个组件并使其变成可学习的就如此成功,那为什么不尝试更多的改变呢?目前,损失函数仍然是手工设计的。也许我们应该打破这个约束,使其变得可学习。我认为这将是下一个阶段。我们已经有了一些成功的例子,如GAN和RLHF。这些模型允许复杂的行为表达,而这些行为如果要被形式化描述将会非常困难。
但我认为这只是RLHF的一个实例。它也可能是其他类型的强化学习模型,或者甚至不是强化学习的方法。我相信这将是下一个范式,并且我们应该努力朝这个方向发展。
当我思考每个范式的代表性模型时,我想到了IBM的深蓝。对于经典的机器学习,我不太确定具体是哪一个,但我们可以称它为基于SVM的系统。然后,下一个范式的代表是GPT-3。每一个范式都带来了巨大的变革,我相信学习损失函数或目标函数将是下一个重大的步骤。
考虑到这一点,我对未来的发展感到非常兴奋。谢谢大家。