突破边界:高性能计算引领LLM驶向通用人工智能AGI的创新纪元
AGI | AIGC | 大模型训练 | GH200
LLM | LLMs | 大语言模型 | MI300
ChatGPT的成功带动整个AIGC产业的发展,尤其是LLM(大型语言模型,大语言模型)、NLP、高性能计算和深度学习等领域。LLM的发展将为全球和中国AI芯片、AI服务器市场的增长提供强劲动力,据估算,LLM将为全球和中国AI服务器带来约891.2亿美元和338.2亿美元的市场空间。
国外厂商在LLM领域具有领先优势,但我国LLM产品也在快速发展,2023年以来多家厂商推出了自研的通用LLM,国产LLM在各行业的应用以及生态建设也取得积极进展。虽然我国LLM相比GPT-4或仍有一定差距,但在短期内达到或接近ChatGPT的水平是可以预期的。
值得关注是 AMD 上周推出 MI300 系列加速卡,旨在与英伟达展开竞争。MI300 系列是 AMD 为 AI 和高性能计算打造的一系列最新 APU 加速卡,包括MI300A 和 MI300X。其中 MI300A 集成了 CPU 和 GPU,而 MI300X 则是一款专门面向生成式 AI 推出的加速器,对标英伟达 H100。从性能参数看,MI300系列产品足以比肩甚至超越英伟达的高端加速卡,但总的来说,短期仍然难以撼动英伟达在该领域的绝对领先地位。
展望下半年,我国大模型产品已经初步具备商用能力。北上深三地利好通用人工智能发展政策的发布,彰显我国对AIGC发展的重视和支持,同时将为其他城市发布类似政策带来示范效应。在政策与技术的共振下,我国AIGC产业未来发展前景广阔。
如今,国内在LLM模型相关技术方面距离最先进技术的差距进一步加大。在Bert出现之后的一到两年间,国内在这块的技术追赶速度很快的同时也提出了一些很好的改进模型。差距拉开的分水岭应该是在 GPT 3.0出来之后,也就是2020年年中左右。在当时,其实只有少数的人觉察到GPT 3.0它不仅仅是一项具体的技术,更能体现出LLM应该往何处去的一个发展理念。
大型语言模型(LLM)是一种低成本、高效率的技术,它在自然语言处理(NLP)和人工智能(AI)领域引起了广泛关注。其中,ChatGPT作为LLM的代表,是否带来了NLP和AI领域的研究范式转变?如果是,将会产生怎样的影响?LLM通过从海量数据中学习,积累了丰富的知识。那么,LLM是如何存取这些知识的呢?随着LLM规模逐步增大,它将对研究和应用产生怎样的影响?此外,上下文学习(In Context Learning)是一项神秘的技术,它与指令(Instruct)有着密切的关系。LLM是否具备推理能力?思维链(CoT)又是如何实现的呢?接下来,将详细介绍以上提到的方面。
LLMs的背景、能力
一、LLM的背景
LLM(大型语言模型,大语言模型)是指使用大量文本数据训练的语言模型,包含数千亿或更多的参数。采用 Transformer 架构和语言建模预训练目标,但相较于小型模型,LLM 模型大小、预训练数据和总计算量更大。这使得它们可以更好地理解自然语言,并生成高质量的文本。LLM 的容量改进可以用标度律进行部分地描述,但某些能力只有在模型大小超过某个水平时才能观察到。
二、LLM的涌现能力
LLM 的涌现能力是指在小型模型中不存在但在大型模型中出现的能力,是 LLM 与以前的 PLM 区分的最显著特征之一。当规模达到一定水平时,LLM 的性能显著高于随机状态,这种新模式与物理学中的相变现象密切相关。LLM 的涌现能力可以与一些复杂的任务有关,人们更关心的是它的通用能力。
LLM 的三种代表性的涌现能力包括上下文学习、指令遵循和循序渐进的推理。其中,上下文学习能力使得语言模型可以通过完成输入文本的词序列来生成测试实例的预期输出;指令遵循能力使得 LLM 能够在不使用显式样本的情况下通过理解任务指令来执行新任务,从而提高泛化能力;循序渐进的推理能力使得 LLM 可以通过利用涉及中间推理步骤的 prompt 机制来解决复杂任务得出最终答案。
NLP研究范式的转换
从浅层语义到深层语义的建模
在过去的10年中,NLP领域可能经历了两次重要的研究范式转换。
一、从深度学习到两阶段预训练模型
NLP领域引入深度学习大致从2013年开始,直到GPT 3.0出现之前(2020年5月左右)。在Bert和GPT模型出现之前,NLP领域流行的技术主要是深度学习模型,主要依托于改进的LSTM和CNN模型作为特征抽取器,以及Sequence to Sequence+Attention作为总体技术框架。然而,这些虽然增加了模型层深,但在解决具体任务上的效果仍然不够成功。这主要是由于任务训练数据量有限和LSTM/CNN特征抽取器表达能力不够强所致。
直到Bert和GPT这两个预训练模型的出现,才代表了NLP领域的一个技术飞跃,并带来了整个领域研究范式的转换。这种范式转换带来的影响主要体现在两个方面:一是部分NLP研究子领域的衰退乃至逐步消亡;二是NLP不同子领域的技术方法和技术框架日趋统一,技术栈基本收敛到两种技术模式中。
1、部分NLP研究子领域的衰退乃至逐步消亡
NLP是一个宏观研究领域的统称,里面有五花八门具体的子领域与子方向,如果仔细分析,从任务的性质角度,可以把这些任务分成两大类:中间任务和最终任务。
1)中间任务
典型的中间任务主要包括中文分词、词性标注、NER、句法分析、指代消解、语义Parser等,这类任务一般并不解决应用中的实际需求,大多数是作为那些解决实际需求任务的中间阶段或者辅助阶段存在。比如几乎没有需求说,要一个句法Parser,把这个句子的句法分析树给用户看看,用户不需要看到这些NLP的中间阶段处理结果,只需关心某个具体任务有没有干好。
2)最终任务
这类任务(文本分类、文本相似性计算、机器翻译、文本摘要等)的特点是每个子领域都解决某个实际需求,任务结果基本能直接呈现给用户,比如用户确实存在给你一句英文,告诉他中文是什么的需求。
按理说,“中间任务”不应该出现,而之所以会存在的原因是NLP技术发展水平不够高。在技术发展早期阶段,由于当时技术相对落后,很难一步做好有难度的最终任务。如机器翻译,早期技术要做好机器翻译是很困难的,于是科研人员就把难题分而治之,分解成分词、词性标注、句法分析等各种中间阶段,先把每个中间阶段做好,然后再拼起来完成最终任务。
自从Bert/GPT出现之后,就没有必要做中间任务。因为通过大量数据的预训练,Bert/GPT已经把这些中间任务作为语言学特征,吸收到Transformer的参数里,此时完全可以端到端地直接解决那些最终任务,而无须对这种中间过程专门建模。
2、不同研究方向技术路线的统一
除了“中间任务”,NLP任务可以划分为两大类型:自然语言理解和自然语言生成。自然语言理解任务包括文本分类、句子关系判断、情感倾向判断等分类任务,模型根据输入文本判断其属于哪个类别。自然语言生成任务包括聊天机器人、机器翻译、文本摘要、问答系统等生成任务,模型根据输入文本生成相应输出文本。
自Bert/GPT模型出现后,NLP领域出现了技术统一趋向,特征抽取器逐渐从LSTM/CNN统一到Transformer上,多数任务采用预训练+微调或Zero/Few Shot Prompt模式。自然语言理解任务采用Bert为代表的双向语言模型预训练+Fine-tuning模式,自然语言生成任务采用GPT 2.0为代表的自回归语言模型+Zero/Few Shot Prompt模式。这两种模式背后的发展思路和未来发展方向不同,但很多人低估了GPT模式的潜力。GPT模式的自回归语言模型可以生成高质量的文本,能够应用于多个自然语言生成任务且具有良好的迁移能力。相比之下,Bert模式在生成任务上表现较差且Fine-tuning方式需要大量标注数据,不易适应新任务。
二、从预训练模型走向通用人工智能 (AGI,Artificial General Intelligence)
这次范式转换涵盖的时间大致在GPT3.0出现后,从2020年6月左右开始一直持续到现在。ChatGPT转换的关键节点,但在InstructGPT出现之前,LLM处于范式转换的过渡期。
1、以GPT 3.0为代表的“自回归语言模型+Prompting”模式占据统治地位
在预训练模型发展的早期,技术框架收敛到Bert模式和GPT模式这两种不同的技术范型,而且人们普遍更看好Bert模式一些,相当多数的后续技术改进,都是沿着Bert那条路走。但是,随着技术的继续发展就发现目前规模最大的LLM模型,几乎清一色都是类似GPT 3.0的“自回归语言模型+Prompting”模式(如GPT-3、PaLM、GLaM、Gopher、Chinchilla、MT-NLG、LaMDA等)。为什么会这样呢?背后一定有其必然性,主要源于两个原因。
1)Google的T5模型,在形式上统一自然语言理解和自然语言生成任务的外在表现形式
如上图所示,T5模型中的文本分类问题和判断句子相似性的回归或分类问题,都是典型的自然语言理解问题。在T5模型中,这些自然语言理解问题的输入输出形式与生成问题保持一致,可以将分类问题转换成让LLM模型生成对应类别的字符串,从而实现理解和生成任务在表现形式上的完全统一。这表明自然语言生成任务在表现形式上可以兼容自然语言理解任务,而反过来则很难做到这一点。这样做的好处是,同一个LLM生成模型可以解决几乎所有NLP问题。相比之下,如果仍然采用Bert模式,LLM模型则无法很好地处理生成任务。
2)如果要以零示例提示语(zero shot prompting)或少数示例提示语(few shot prompting)的方式做好任务就必须要采取GPT模式
研究表明,以fine-tuning方式解决下游任务时,Bert模式的效果优于GPT模式。但是,如果是以zero shot/few shot prompting模式解决下游任务,则GPT模式的效果要优于Bert模式。这说明,生成模型更容易完成zero shot/few shot prompting方式的任务,而Bert模式在这种方式下做任务时存在劣势。
那么问题来了:为什么要追求zero shot/few shot prompting方式来做任务呢?要解释清楚这个问题,首先需要搞清楚另外一个问题:什么样的LLM模型最理想的?
对于LLM模型来说,首先,应该具备强大的自主学习能力。如果将世界上所有可获得的文本、图片等不同类型的数据输入模型中,应该能够自动学习其中包含的所有知识点,学习过程不需要人的介入,并且能够灵活应用所学知识来解决实际问题。由于数据量庞大,要吸收所有知识,模型必然需要具备大量的参数来存储知识,因此这个模型必然会是一个巨无霸模型。
其次,LLM模型应该能够解决NLP任何子领域的问题,而不仅限于某个有限的领域,甚至应该能够响应NLP之外的其他领域的问题。此外,当使用LLM模型解决某个具体领域的问题时,应该使用人类习惯的表达方式,即LLM应该理解人类的命令。这体现让LLM适应人类,而不是让人去适应LLM模型。人适应LLM的典型例子是,人们会费尽心思地尝试各种不同的prompt,以试图找到好的提示语,以便更好地解决手头问题。
为什么要追求zero shot/few shot prompting这种方式来解决任务?主要有以下两个原因。
1)理想中的LLM模型规模必然非常巨大,只有极少数机构有能力制作出这个模型或改动模型参数。任务需求方却千千万万,其中大多数是中小机构甚至个人即使模型开源,也无法部署这个模型,更不用说再使用Fine-tuning这种模式去修改模型参数了。因此应该追求不修正模型参数就能让任务需求方完成任务的方式,即应该采取prompt模式完成任务,而非Fine-tuning模式。模型制作方则将LLM作为公用服务,以LLM as Service的模式运行。
作为服务支持方,考虑到用户需求的多样性,LLM模型制作方更应该追求让LLM能够完成尽可能多类型的任务,这是附带的影响,也是为何超级大模型一定会追求走向AGI的现实因素。
2)zero shot prompting也好,few shot prompting也好,甚至促进LLM推理能力的思维链(CoT, Chain of Thought)Prompting也好,都是现有技术中的一种。具体而言,zero shot prompting的初衷是直接用人类常用的任务表述方式让LLM做事情,但是发现LLM并不能很好地理解,效果也不好。经过继续研究,人们转而发现,对于某项任务,如果给LLM几个示例,用这些示例来代表任务描述,效果会比zero shot prompting好,于是都开始研究更好的few shot prompting技术。
可以理解为,本来希望LLM能够用人类常用的命令方式来执行某个任务,但是目前技术还做不到,所以退而求其次,用这些替代技术来表达人类的任务需求。如果理解了上述逻辑,很容易得出如下结论:few shot prompting(也被称为In Context Learning)只是一种过渡时期的技术。如果能够更自然地去描述一个任务,而且LLM可以理解,那么肯定会毫不犹豫地抛弃这些过渡期的技术,原因很明显,用这些方法来描述任务需求,并不符合人类的使用习惯。
2、让LLM适配人的新型交互接口
ChatGPT是一种能力强大、善解人意的技术方法,最接近理想的LLM模型。ChatGPT的强大能力主要得益于GPT 3.5模型,而非人工标注数据。虽然加入了人工标注数据,但这些数据量级只有数万,对GPT 3.5的基础能力增强作用微乎其微。
ChatGPT的最大贡献在于它基本实现了理想LLM的接口层,让LLM适配人的习惯命令表达方式,而不是反过来让人去适配LLM。这增加了LLM的易用性和用户体验,是一种更符合人类表达习惯的人和LLM进行交互的人机接口技术。ChatGPT的技术贡献必将启发后续的LLM模型,在易用人机接口方面继续做进一步的工作。
3、很多NLP子领域不再具备独立研究价值
范式转换将会改变NLP领域的格局,许多独立存在的研究领域将被LLM技术体系所纳入,逐步消失。虽然许多“中间任务”不再需要独立存在,但是大多数“最终任务”仍将作为独立领域存在,只是在“预训练+fine-tuning”框架下,陆续提出新的改进方案。
研究表明,随着LLM模型规模的增大,许多NLP任务的效果会得到大幅提升。因此,很多领域所谓“独有”的问题,只是因为缺乏领域知识而表现出来的外在表象。只要提供更多的领域数据给LLM,让它自己学习更多知识,这些问题就可以被很好地解决。未来的技术发展趋势应该是追求规模越来越大的LLM模型,通过增加预训练数据的多样性,来涵盖越来越多的领域。研究重心将投入到如何构建理想LLM模型,而非解决某个领域的具体问题。因此,越来越多NLP的子领域将被纳入LLM技术体系,逐步消失。
判断某个具体领域是否需要立即停止独立研究,可以采取以下两种方法:一是判断LLM的研究效果是否超过人类表现,对于那些LLM效果已超过人类表现的研究领域,已无独立研究的必要。二是对比两种模式的任务效果,如果few-shot prompting或instruct-based方法的效果达到或超过用较大的领域专用数据进行Fine-tuning的效果,则意味着这个领域没有继续独立存在的必要性。
如果这个猜测成立,将意味着很多NLP领域的研究人员面临着往何处去的选择,是继续做领域独有问题呢?还是放弃这种方式,转而去建设更好的LLM?
4、更多NLP之外的研究领域将被纳入LLM技术体系
理想中的LLM应该是一种通用的人工智能模型,不应该被限制在某一个学科领域内。ChatGPT的出现证明了这种追求AGI的可行性,而现在是抛开“领域学科”这种思维束缚的时候了。除展示出在各种NLP任务中流畅的对话形式,ChatGPT还具备强大的代码能力。
LLM技术正在向外扩展,其中一个自然的方向是图像处理和多模态任务。目前已经有一些工作在尝试将多模态融入LLM中,以实现通用人机接口的功能,例如DeepMind的Flamingo和微软的“Language Models are General-Purpose Interfaces”。
图像领域的预训练模型应用到下游任务的效果收益远不如NLP领域的预训练模型显著,这可能是因为图像预处理模型仍需深入探索,以释放图像数据的潜力。因此,图像处理领域被融入LLM的时间可能会比想象的要慢。当然,如果图像领域的预训练模型被趟通,它们很可能会被融入到大型LLM中,直接完成终端任务,类似于NLP领域的局面。
除了图像和多模态,其他领域也将逐渐被纳入到LLM中,这是具备高价值的研究主题。范式转换的个人思考表明,LLM技术的主要技术进展可以分为两大类:一类是关于LLM模型如何从数据中吸收知识,也包括模型规模增长对LLM吸收知识能力带来的影响。第二类是关于人如何使用LLM内在能力来解决任务的人机接口,包括In Context Learning和Instruct两种模式。思维链(CoT)prompting这种LLM推理技术,本质上也属于In Context Learning。
从无尽数据导海量知识
目前的研究结果表明,Transformer作为一个特征抽取器已经足够强大,不需要进行特别的改进。预训练过程让Transformer学到了什么?知识是如何存储的?如何修正错误的知识?这些问题是当前研究的重点。本节讲述这方面的研究进展。
一、LLM学到了什么知识LLM通过学习海量自由文本,获得了大量的知识,可以将这些知识粗略地分为语言类知识和世界知识两大类。语言类知识包括词法、词性、句法和语义等,有助于人类或机器理解自然语言。研究表明,LLM可以学习各种层次类型的语言学知识,并且这些知识存储在Transformer的低层和中层。世界知识则包括真实事件(事实型知识)和常识性知识(Common Sense Knowledge)。
研究表明,LLM可以从训练数据中吸收大量世界知识,并且这些知识主要分布在Transformer的中层和高层,随着模型层数的增加,能够学习到的知识数量逐渐以指数级增加。对于Bert类型的语言模型来说,只用1000万到1亿单词的语料,就能学好句法语义等语言学知识,但是要学习事实类知识,则需要更多的训练数据。随着增加训练数据量,预训练模型在各种下游任务中效果越好,这说明了从增量的训练数据中学到的更主要是世界知识。
二、LLM如何存取知识LLM是一种基于Transformer结构的语言模型,可以从大量的自由文本中学习到丰富的语言类和世界知识。但对于具体的某条知识,LLM是如何存储和提取的呢?从Transformer的结构来看,模型参数由两部分构成:多头注意力(MHA)部分占了大约参数总体的三分之一,三分之二的参数集中在FFN结构中。
FFN的第一层是一个MLP宽隐层,也就是Key层;第二层是一个MLP窄隐层,也就是Value层。FFN的输入层实际上是某个单词对应的MHA的输出结果Embedding,也就是通过Self Attention,将整个句子有关的输入上下文集成到一起的Embedding,代表了整个输入句子的整体信息。
Key层的每个神经元节点,记载了一对<Key,Value>信息。比如对于FFN第一个隐层的第i个节点ki,也许就是它记载了<北京,is-capital-of,中国>这条知识。ki节点对应的Key向量,其实指的是节点ki和输入层每个节点的权重向量;而对应的Value向量,指的是节点ki和FFN第二层的Value层每个节点形成连接的权重向量。
每个神经元的Key向量,用于识别输入中的某种语言或者知识模式,是一种模式探测器。如果输入中包含它要检测的某种模式,那么输入向量和ki节点的key权重进行向量内积计算,加上Relu,形成ki的大数值响应,意味着ki检测到了这个模式,于是再把这个响应值,通过ki节点的Value权重向量向FFN第二层传播。这等价于将Value向量的值,用响应值加权,然后传递并体现到第二层Value层每个节点的输出上。
这样,FFN的正向传播计算过程,看起来就像是通过Key检测到某种知识模式,然后取出对应的Value,并把Value体现在FFN的第二层输出上。当然,FFN第二层每个节点,会收集FFN的Key层所有节点信息,所以是一种混合响应,而Value层所有节点的混合响应,可以解读为代表输出单词的概率分布信息。把FFN看成Key-Value存储器这种思路,虽然可能不是最终的正确答案,但是距离最终正确答案的距离,估计也不太远。
三、如何修正LLM里存储的知识当使用LLM进行自然语言处理时,可能会遇到一些过时或错误的知识。为了解决这个问题,可以使用三种不同的方法来修正LLM中存储的知识。
1、从训练数据的源头开始修正知识
通过追踪某条知识对应的训练数据源头定位到是哪些数据导致LLM学会知识。然后删除数据源,重新预训练整个LLM模型,以达到删除LLM中相关知识的目的。但这种方法在少量多次的常规知识修正场景中不适用。
2、通过fine-tuning来修正知识
根据要修正成的新知识来构建训练数据,让LLM模型在练数据上做fine-tuning,以指导LLM记住新的知识,遗忘旧知识。但是会有忘掉该忘的知识,还会忘掉不该忘的知识现象存在,导致这么做之后有些下游任务效果下降。此外成本也相当高。
3、直接修改LLM的模型参数来修正知识
通过定位存储知识的具体位置,强行调整FFN中对应的模型参数,将旧知识替换成新的知识。然而,这种方法需要解决两个关键问题。首先需要知道如何在LLM参数空间中定位某条知识的具体存储位置。其次需要知道如何修正模型参数,以实现旧知识到新知识的修正。
理解修正LLM知识的过程对于更深入理解LLM的内部运作机制是很有帮助的。虽然三种方法各有优缺点,但都可以帮助修正LLM中的过时或错误的知识,提高LLM在自然语言处理任务中的表现。
当LLM越来越大时会发生什么
近年来,LLM模型规模不断增长,目前效果最好的LLM模型,其参数规模大都超过了千亿(100B)参数规模。如OpenAI的GPT-3规模为175B,Google的LaMDA规模为137B,PaLM的规模为540B,DeepMind的Gogher规模为280B等。国内也有中文巨型模型,比如清华&智谱GLM规模130B,华为“盘古”规模200B,百度“文心”规模260B,浪潮“源1.0”规模245B。
那么问题来了,随着LLM模型规模的不断增长会发生些什么呢?预训练模型的应用往往是两阶段的:预训练阶段和具体场景应用阶段。在预训练阶段,LLM模型的优化目标是交叉熵,对于像GPT这种自回归语言模型来说,也就是看LLM是否正确预测下一个单词。而在场景应用阶段,一般要看具体场景的评价指标。通常,LLM模型在预训练阶段的指标越好解决下游任务的能力就越强。然而,事实并非完全如此。
现有研究表明,预训练阶段的优化指标确实和下游任务表现出正相关关系,但并非完全正相关。也就是说,仅仅看预训练阶段的指标来判断一个LLM模型是否够好是不够的。因此需要在模型的预训练阶段和应用阶段都进行充分的评估和测试。
在预训练阶段,OpenAI和DeepMind的研究表明,同时增加训练数据量和模型参数是最优的选择,而只单独增加其中某一个是不够好的。DeepMind认为,训练数据量和模型参数是同等重要的,因此应该同比例地增加。比如,如果用于训练LLM的算力总预算增加了10倍,那么应该增加3.3倍的模型参数量,3.3倍的训练数据量,这样模型效果才最好。而对于Chinchilla模型,它选择增加4倍的训练数据,但是将模型参数降低为Gopher的四分之一,大约为70B。这样做的结果是,Chinchilla的预训练指标和许多下游任务指标都要优于规模更大的Gopher。这表明,可以选择放大训练数据,并同比例地减少LLM模型参数,以达到在不降低模型效果的前提下,极大缩小模型规模的目的。
从LLM解决下游具体任务效果的角度来看,随着模型规模增大,不同类型的任务有不同的表现。比如,对于简单的任务,如语言模型的困惑度,随着模型规模增大,模型效果会不断提升。在OpenAI的研究中,当训练数据量从12B增加到800B时,GPT-3模型的困惑度从3.15降低到1.28。
对于中等难度的任务,如问答、文本分类等,随着模型规模增大,模型效果会先提升后趋于平稳。在OpenAI的研究中,当训练数据量从12B增加到800B时,GPT-3模型在LAMBADA和SuperGLUE等任务上的表现都有所提升,但是提升幅度逐渐减小。对于复杂的任务,如机器翻译、语义理解等,随着模型规模增大,模型效果会先提升后出现饱和现象或者略微下降。在Google的研究中,当模型参数量从1558M增加到137B时,BLEU分数从36.8提高到37.5,但是随着模型规模进一步增大,BLEU分数反而略微下降。因此,在选择LLM模型规模时,需要根据具体任务的难度和要求,综合考虑各种因素,以获得最佳的模型性能。
第一类任务展现了LLM模型的scaling law,即随着模型规模的增大,任务的表现越来越好。这类任务通常是知识密集型任务,LLM模型包含的知识量越多,任务表现越好。研究表明,更大的LLM模型学习效率越高,相同训练数据量,大模型可以学到更多的知识点。传统的自然语言理解类任务大多属于这种类型,近两年这些任务的效果有了极大的提升,很可能是因为LLM模型的规模增长所带来的。
第二类任务展现出LLM具备某种“涌现能力”,当模型规模达到某个阀值时,LLM模型对此类任务的效果会出现突然的性能增长。这种“涌现能力”是LLM模型规模增长的关键,随着模型规模越来越大,LLM模型会逐渐解锁新的能力。这种现象很神奇,因为即使LLM模型现在还不能很好地解决某些任务,但如果继续推大模型,也许某一天它的这项能力就被突然解锁了。这些任务一般由多步骤构成,需要先解决多个中间步骤,逻辑推理能力在最终解决这类任务中发挥重要作用。思维链Prompting是一种典型的增强LLM推理能力的技术,能大幅提升此类任务的效果。关于为何LLM会出现这种“涌现能力”现象,目前还需要进一步的研究。
还有一部分任务的效果曲线呈现出U形特性,即随着模型规模的增大,任务效果逐渐变差,但当模型规模进一步增大时,效果开始变好,呈现出U形增长趋势。这些任务内部隐含了两种不同类型的子任务,一种是真正的任务,另一种是“干扰任务”。当模型规模小的时候,无法识别任意一种子任务,所以模型的表现跟随机选择答案差不多。
当模型增长到中等规模时,主要执行的是干扰任务,所以对真正的任务效果有负面影响,体现为真正任务效果的下降。当进一步增加模型规模时,LLM可以忽略干扰任务,执行真正的任务,效果开始增长。如果采用思维链(CoT)Prompting,则部分任务的表现转换为遵循Scaling law,即模型规模越大效果越好,而其他任务则转换为U形增长曲线。这说明此类任务应属于推理类型的任务,加入CoT后任务表现会发生质的变化。
从In Context Learning到Instruct理解
一般常提到的人和LLM的接口技术包括:Instruct和In Context Learning。Instruct是ChatGPT的接口方式,人以自然语言给出任务的描述,例如“把这个句子从中文翻译成英文”。而In Context Learning和few shot prompting意思类似,给LLM几个示例作为范本,然后让LLM解决新问题。
虽然这些技术都是描述任务的方式,但其实思路是不同的。Instruct是一种抽象的描述方式,而In Context Learning是一种例子示范的说明法。尽管叫法有些混乱,但这两种技术是最为常见的人和LLM的接口技术。下面将重点介绍Instruct和In Context Learning,而不再提及zero shot和few shot。
一、神秘的In Context LearningIn Context Learning是一项非常神奇的技术。它之所以神奇,是因为只需要提供LLM几个样本示例<x1,y1>,<x2,y2>....<xn,yn>,然后给一个新的输入xn+1,LLM就能成功预测对应的输出yn+1。这听起来有些类似于Fine-tuning,但实际上更为复杂。
Fine-tuning和In Context Learning看似都提供了一些示例给LLM,但两者之间存在着质的不同。Fine-tuning使用这些示例作为训练数据,通过反向传播来修正LLM的模型参数,从而实现了LLM从示例中学习的过程。而In Context Learning只是简单地展示示例,然后要求LLM去预测新的示例,没有使用反向传播来修正模型参数,这意味着它貌似没有经历学习的过程。但是,In Context Learning却能够仅凭一眼就预测出新的示例。
目前,有一些研究对这个问题提出了不同的看法,但是它们之间存在着相互矛盾的结论。对于这个问题的真相,目前仍是未解之谜。有些研究认为In Context Learning并没有从示例中学习映射函数,而是通过输入和输出的分布来实现预测。而另一些研究则认为LLM仍然从示例中学习了映射函数,只是这个过程是隐式的。
二、神奇的Instruct理解Instruct是一种为了方便人类理解的任务表述。基于这个前提,目前的Instruct研究可以分为两类:一种是偏向学术研究的Instruct,另一种则是关注于人类真实需求描述的Instruct。
首先,来看偏向学术研究的Instruct。该领域的核心研究主题是LLM模型在多任务场景下对Instruct理解的泛化能力。这种方法使用多个NLP任务,每个任务都有一个或多个Prompt模版作为Instruct,并用训练数据对LLM模型进行微调,使其能够同时学习多个任务。
训练好模型后,给LLM模型一个全新的任务Instruct,然后让LLM解决zero shot任务,从而判断LLM模型是否具有对Instruct的泛化能力。目前的研究表明,增加多任务的数量、增加LLM模型的大小、提供CoT Prompting以及增加任务的多样性等因素可以有效地增加LLM模型对Instruct的理解能力。
第二种是面向人类真实需求的Instruct,这类研究以InstructGPT和ChatGPT为代表。这种方法同样基于多任务,但与偏向学术研究的方法最大的不同在于它是面向真实需求的。它使用从大量用户提交的真实请求中抽样而来的任务描述Prompt进行LLM多任务训练,而不是固定好研究任务的范围,然后让研究人员来编写任务描述prompt。
这种方法的优势在于可以涵盖更多样化的任务类型,更符合用户的真实需求;同时,任务的prompt描述来自用户提交的请求,反映了用户在表达任务需求时的真实表述方式。因此,这种方法训练出的LLM模型可以更好地满足用户需求。InstructGPT论文还将该方法与偏向学术研究的FLAN方法进行了比较。结果表明,FLAN方法的效果距离InstructGPT有很大差距。这是因为FLAN方法涉及的任务领域相对较少,而InstructGPT使用的任务类型更加多样化,更符合用户的真实需求。因此,从用户数据中收集真实需求对于提高LLM模型的效果是非常重要的。
三、In Context Learning和Instruct的联系可以将In Context Learning看作是通过一些具体的例子来表达任务命令,而Instruct则是更符合人类习惯的抽象任务描述。这引发了一个自然的问题:这两种方法之间是否存在联系?例如,是否可以提供一些具体的示例,让LLM找出对应的自然语言描述的Instruct命令来完成某个任务?
目前有些研究工作在探索具象任务示例和自然语言命令之间的联系,并且这个方向具有很高的研究价值。在这个问题上,答案是肯定的:LLM确实可以实现这个任务。最近的一项研究使用了GPT-3和InstructGPT作为基础模型,让LLM通过一些具体的示例生成自然语言命令来描述某项任务,然后再用这个描述测试任务效果。这项技术的加持使得LLM生成的Instruct效果大大提升,甚至在一些任务上超过了人类的表现。这表明了具象任务示例和自然语言命令之间存在一种神秘的内在联系,但我们目前还无法确定这种联系的具体本质。
如何增强LLM的推理能力
目前,许多研究表明LLM具有强大的记忆能力,但通常不会因为一个人记忆能力强就认为他/她很聪明,因为推理能力往往是判断一个人是否聪明的重要标准。因此,对于LLM而言,强大的推理能力也是必不可少的。在过去一年中,LLM的推理能力已成为最重要和热门的研究领域之一。目前的研究表明,当模型规模足够大时,LLM本身具备推理能力,在简单推理问题上已经达到了很好的能力,但在复杂推理问题上仍需要更深入的研究。
LLM推理能力的研究可以归为两大类分别是基于Prompt的方法和引入程序代码的方法。基于Prompt的方法通过合适的提示语或提示样本来激发LLM本身具备的推理能力,Google在这个方向做了很多有成效的工作。而引入程序代码的方法则在预训练过程中将代码和文本一起参与预训练,以此进一步增强LLM的推理能力,这是OpenAI实践出的思路。这两种方法的大方向是迥异的:前者是通过提供多样性的训练数据来直接增强LLM推理能力,而后者则是让LLM在解决问题过程中更好地展示出推理能力的技术方法。虽然这两种方法互补,但从长远来看,治本的方法更为重要。
归纳一下大致可以分为三条技术路线。
一、直接在问题上追加辅助推理Prompt
在各个领域,基于Prompt的方法都被证明是一种有效的方法来增强LLM的推理能力。这种方法非常简单,直接在问题上追加辅助推理Prompt即可。其中,Zero-shot CoT是一种被广泛应用的方法,它通过在提问的问题上追加“Let’s think step by step”这句提示语来激发LLM本身具备的推理能力。
具体而言,分为两个阶段,第一阶段在问题上追加提示语,LLM会输出具体的推理过程;第二阶段,拼接LLM输出的具体推理过程,并再追加Prompt,此时LLM会给出答案。这种简单的操作可以大幅增加LLM在各项推理任务中的效果。目前,关于LLM为什么会具备推理能力的原因尚无定论,但可能是因为预训练数据中存在大量以“Let’s think step by step”开头的数据,LLM在预训练的时候记住了这些模式。
因此,当我们输入这个提示语的时候,LLM会模仿这些例子进行步骤推理并给出答案。当然,Zero-shot CoT的效果比标准CoT差一些,因为靠LLM回忆示例,精准性估计不会太高。但无论是Zero-shot CoT还是标准CoT,都说明了一个道理,就是LLM本身是具备推理能力的,只是我们没有办法把它的这种能力激发出来而已。
二、基于示例的思维链(few-shot CoT,Chain of Thought)Prompting
目前,基于Prompt的方法是LLM推理研究的主要方向,很多工作都是在这个思路上展开的。在这个方向上,有几个代表性的工作取得了显著的效果,这些工作基本能代表CoT技术发展的方向。
CoT的主体思想非常简单明了,为了让LLM模型学会推理,需要给出一些人工写好的推理示例,示例中详细说明得到最终答案前的具体推理步骤,而这些人工写的详细推理过程就是思维链Prompting。CoT的目的是让LLM模型明白在推理过程中,步子不要迈得太大,需要化大问题为小问题,步步为营,积小胜为大胜。最早明确提出CoT这个概念的文章是“Chain of thought prompting elicits reasoning in large language models”,该论文于2022年1月份发布。尽管CoT的做法很简单,但应用CoT后LLM模型的推理能力得到了巨大提升,GSM8K数学推理测试集准确率提高到了约60.1%。值得一提的是,这种给出详细推理步骤和中间过程的思想,并非CoT最早提出的。更早一些的“scratchpad”技术就采用了类似的思路。
CoT提出不久,随后在2022年3月份,一项名为“Self-Consistency”的改进技术迅速问世,将GSM8K测试集准确率提高到了74.4%。这项改进技术的思路也很简单明了,首先利用CoT给出几个写了推理过程的示例,然后要求LLM对给定的问题进行推理,但不同于CoT的是,“Self-Consistency”要求LLM输出多个不同的推理过程和答案,并采用投票的方式选出最佳答案。这种思路教导LLM学会这样一个道理:一个数学题的正确解法可以有很多种,每个不同的推导过程都指向最终的答案。简单的方法往往蕴含着深刻的哲学含义。之后,“On the Advance of Making Language Models Better Reasoners”这个工作在“Self-Consistency”的基础上,进一步集成了“从一个Prompt问题拓展到多个Prompt问题、检查推理中间步骤的正确性以及对多个输出的回答加权投票”这三个改进点,将GSM8K测试集准确率提高到了约83%。
三、分治算法
核心思想是将一个复杂的推理问题分解成若干个容易解决的子问题,解决这些子问题,再从子问题的答案推导出复杂问题的答案。这种思路可能是揭示问题本质、最终解决LLM复杂推理问题的正宗道路。以“Least-to-most prompting”技术为例,它分为两个阶段。在第一个阶段,我们从原始问题中得到最终要问的问题,然后构造一个Prompt模板,填充“如果要解决Final Q问题,那么我需要先解决”的内容,让LLM模型回答,得到前置子问题Sub Q。在第二个阶段,让LLM先回答子问题Sub Q,并得到对应的答案,然后将原始问题与子问题Sub Q及对应答案拼接在一起,再去问LLM最终问题Final Q,此时LLM会给出最终的答案。这种思路体现了拆解子问题,并从子问题的答案逐步找出最终答案的思路,类似于分治算法的思想。