进NLP群—>加入NLP交流群
本文转载自AI科技评论,作者韩庐山。
本文从ChatGPT带来的即时学习能力(in-context learning)入手,逐步深入地探讨了ChatGPT目前众多的关键性问题,包括:
ChatGPT带来了从未有过的计算层次——虚拟人
ChatGPT带来的新的智能计算构架:母体和虚拟人
在人类语料知识用尽的时候,新的智能架构如何成长,如何吸收新的技能
强泛化能力的解释,以及大模型能力涌现的可能原因
一本正经胡说八道问题的原因和长、短期解决方案
ChatGPT如何细化到垂直领域,比如法律领域。
本文并不是对已发表的大模型论文的技术总结,不是一篇综述文章,而是基于笔者自己的研究分析去探索上述问题的答案。希望能起到一个抛砖引玉的作用。文章的写作跨度比较长,大部分的写作完成于OpenAI推出plugins功能之前,所以有少部分技术内容显得有些滞后了。
1
ChatGPT带来的崭新技术:
即时学习能力
在OpenAI的GPT-3出现之前,以往的深度学习模型只是为某个特定任务开发的,比如,翻译、分类、摘要、信息抽取等等。每个任务都有一个专用的模型,都需要人类标柱员专门为这个任务生成大量的标注数据用来训练模型。而OpenAI采用自监督的方式来训练它的超级大模型GPT-3,不需要任何人类标注数据。它使用了巨量的50TB的文字语料,其中大部分来自于互联网。而它所做的唯一一件训练任务就是根据文本中前面看到的文字,不断的预测下一个文字是什么。
这个1750亿参数的模型充分训练完成以后,就诞生了一件非常奇妙的事情:模型即时学习的能力,术语叫做in-context learning(也可翻译为文中学习)。因为GPT-3有根据前面的文字不断预测下一个文字的能力,所以它可以生成文本,可以和人对话。即时学习能力就是指GPT-3在这个交互过程中可以马上领会到你的指令的意图、执行你的任务,并且可以即时学习到新的知识和技能。ChatGPT通过一个良好的人机交互对话界面,充分释放出GPT-3的即时学习能力。
诞生了超强的即时学习能力以后,以ChatGPT为代表的大模型就成为了一个新的物种,区别于以往为专用任务开发的深度学习模型。大模型不再是任务的执行者,它的角色将转换为底层的赋能者,而它创造出来的各种形形色色具备即时学习能力的“虚拟人”将成为真正的任务执行者。机器学习训练的传统范式也将发生根本性的改变。我们先从下图中的一个简单的例子看起。
ChatGPT通过即时学习的能力记住了我教给它的新知识—中国2022年的人口总数,并在后面的人口列表中使用上了这个新知识。这是多么惊叹的一种能力!按照以往的范式,我们要改变模型存储的知识,需要用新数据在模型上进行多轮的训练。比如,往模型里增加中国2022年的人口总数这个事实,就是非常棘手的一件事情。因为我们不确定训练多少轮以后,模型才能够记住这个事实。而且,我们也不确定对这些新数据训练之后,是否会破坏模型中存储的其它知识。科研界目前也在努力解决这个问题,出现了一个新的研究方向,叫做neural editing。但是大模型即时学习的能力实际上已经解决这个问题了,而且是用一种近乎完美的方式:一条指令,一步到位。
你这时候可能会反驳说,这条新知识其实并没有真正存储在ChatGPT大模型里面,因为当你打开一个新的对话的时候,这个知识就不存在了。然而,这恰恰是大模型非常大的一个优点:即时学习学到的东西是和母体脱离的,这样就可以实现大模型上层任务的定制化,实现各种各样不同的应用。而所有的这些都不会改变底层大模型的任何参数。底层大模型就像操作系统一样,以赋能者的身份存在。
具备即时学习能力的“虚拟人”可以看作是一种应用程序,它的状态是可以存储的,可以读取的。你教授给它的新知识和新技能并不会丢失。目前ChatGPT能记住4000个(GPT-4是32000个)汉字的上下文关联。这就意味着我们当前对话中前4000个字里面描述过的知识和技能,ChatGPT都不会遗忘。今后,技术的发展肯定会带来更大的记忆体空间。越大的记忆体就意味着越高的“虚拟人”定制化水平,越宽广的任务适用范围。
我们再列举一些ChatGPT通过即时学习能力学习新技能、新任务的例子。第一个例子是关于七言律诗的学习。你如果直接让ChatGPT写七言律诗,它会写得很不符合格式,很随意。但是如果先将百度百科中关于七言律诗的定义告诉ChatGPT以后,ChatGPT就可以写出非常工整的七言律诗。它可以从你给它的定义,马上学习到七言律诗是什么。网络上有很多教ChatGPT各种奇奇怪怪新技能和指派新任务的例子。有人发明了一种新的语言,教给ChatGPT以后,他和ChatGPT就可以用这种新语言交流了。有人让ChatGPT去模拟一个linux内核接受用户的指令,ChatGPT模仿的非常逼真。所有的这些新技能和新任务的学习也仅仅只是一个定义,一个prompt,一步到位。
大模型即时学习的能力把大模型从知识和技能万能者的角色中解放出来了。大模型不再需要做到知识的完美,技能的完美。大模型的知识可以是不完整的,可以不用总是最新的,甚至是可以允许有错的。大模型上层创造出来的各种“虚拟人”会利用即时学习能力来完善任务特有的专业化知识和技能。“虚拟人”还可以通过自主使用API的方式从搜索引擎和数据库中获得大量的、最新的专业化知识。大模型此时真正存在的意义是赋能:即提升“虚拟人”的即时学习的能力和其它能力,比如使用API。
2
新的智能计算构架:虚拟人和母体
ChatGPT这次带来的冲击和计算机发展历史中的一个大事件惊人的相似,那就是通用计算机的诞生。在通用计算机诞生以前,没有软件的概念。那个时候电子工程师们需要为每一个应用程序设计专门的逻辑电路,开发专用的计算机。直到艾伦·图灵为解决计算机理论问题而提出图灵机这一伟大发明的时候,人们才发现计算机逻辑可以用代码的形式和数据一起存储,并通过图灵机进行运算。
通用计算机的诞生对社会生产力的提升意义重大。学习写代码比学习开发逻辑电路要简单太多了。普通人经过一段较长时间的培训都可以学会写代码。这样一来,社会各行各业都可以从软件开发中受益,社会自动化程度得到快速的提高。
这次ChatGPT的技术变革会带来社会生产力更高层次的跃升。在ChatGPT为代表的通用人工智能出现之前,软件工程师们需要为每一个特定任务开发一个专用的机器学习模型或者代码。ChatGPT诞生之后,普通人就可以通过自然语言交流的方式给ChatGPT安排任务,快速地完成各种复杂的工作。以前,大家还需要找软件开发商来满足自己业务上的需求,现在自己动手就可能可以实现了!
我们可以设想一下不久的未来ChatGPT将会带来的新的智能计算构架,主要可分为赋能层(母体)和应用层(虚拟人世界):
1. 底层是一个基础大模型,我们称之为母体。大模型不再是任务的执行者,而是底层的赋能者,其角色就像通用计算机中的操作系统一样。大模型需要为上层提供越来越强的即时学习能力和API访问等其它能力。在知识方面,大模型不需要做到尽善尽美,无所不知,上面的应用层会有办法弥补大模型专业知识不足的问题。但大模型仍然需要尽量做到知识的全面性、正确性、最新性,给应用层提供最有力的支撑。
2. 上层的应用层是一个虚拟人或者虚拟人任务的网络,我们称之为虚拟人世界。用户可以根据不同的任务用自然语言交流的方式定制虚拟人。虚拟人有自己单独的记忆体,里面可以存储任务特有的专业化知识和技能。这部分特有知识可以对底层大模型的知识进行补全和覆盖。虚拟人还可以通过自己调用数据库和搜索引擎API来获取完成任务需要的专业知识。类似人类社会的分工机制,虚拟人也可以通过分工的方式来完成更加复杂的任务,这样就会构造出一个虚拟人的网络。虚拟人即时学习到的知识和技能不会对底层大模型的参数有任何影响。当虚拟人停止工作的时候,这部分计算资源就被系统收回,但虚拟人记忆体中的知识和技能可以被保存下来等待下次工作时读取。简而言之,虚拟人的角色就像通用计算机中的应用程序。
虚拟人的定制化是通过每个虚拟人记忆体中特有的知识和技能来实现的。长期来看,我们需要为虚拟人开发出“可显示的长期记忆体”技术来提高记忆的稳定性、可靠性、高效性。当前,ChatGPT提供了“隐式”的记忆力,GPT-3.5可以记住对话中前4000个token(汉字)中的内容,而GPT-4可以记住32000个。这些历史对话中的知识可以用来覆盖掉母体中的知识。比如,我们先提供给ChatGPT一个中国人口的数据报告,然后再问它关于人口数据的时候,ChatGPT会优先使用报告中的数据而不是大模型中的数据。这是即时学习能力的一个基本特性,我们将会在下一节进行详细的讲解。
ChatGPT的最终形态可能就是一个超大的智能基座,像供水供电一样为全社会的各行各业提供虚拟人服务。同时,各行各业企业级的反馈又能帮助大模型成长。这时,大模型成长的主要助推动力就不再是人类长期历史文本中积累的知识了,而是各行各业企业级应用中的第一手知识。换一句形象的话说,所有虚拟人的“生活经历”将成为真正推动母体前进的燃料(有趣的是,即时学习并不会直接改变母体的参数)。
在这个新的计算架构下,我们可以看出知识和技能有两处可选择的存储区域。一个是母体,另一个就是虚拟人的专有记忆体。一般来说,大众的、稳定的、有共识的知识和技能应当由母体来理解记忆;而任务特有的、新型的知识和技能则可以通过即时学习的能力存储在虚拟人的专有记忆体中。
本文章写作时间跨度比较长,文章还差结尾的时候,OpenAI就把ChatGPT plugins的功能推出市场了。因为plugins是一个特别好的可以用来说明如何巧用两处存储区域的例子, 我们在这里插入补充一下。plugins作为一种新的技能,可以有两种实现的方式。一种就是通过对母体的预训练来实现,另一种就是通过即使学习的能力直接教授给虚拟人。OpenAI选择的是第二种方式,因为这种方式实现起来很快,成本很低。而第一种方式需要专门的训练语料,如果让人来标注,成本非常高。但是第二种方式也存在着一个较大的问题,就是各种plugin API的自然语言描述Prompt加起来会占去虚拟人专有记忆体很大的空间。
这个时候其实有一个巧妙的解法,不知道OpenAI是否也是这么想的。如果我们把所有用户使用plugins的全部过程,包括在plugins内部点击选择的步骤,都详详细细地记录下来作为语料反哺给母体进行训练。一旦母体获得掌握这些知识技能之后,我们就不再需要虚拟人用即时学习能力去学这些plugin API了。甚至,用户都可以不用再在plugin内部进行点击选择了,所以的一切都会按照用户的任务目标自动进行。虚拟人只需要返回给用户一个plugin使用的确认报告就行了。
这就给我们的计算架构提供了一种引入新的大众技能的范式。即,先通过虚拟人的即时学习能力+用户辅助来先实现这个功能,然后在大量用户使用之后,逐渐将这个技能知识沉淀到母体,随之就可以释放掉虚拟人这部分的技能定义Prompt。
3
即时学习能力和强泛化的解释
我们现在开始分析一下ChatGPT的即时学习能力从何而来。OpenAI公布的文档中提及过ChatGPT即时学习能力是通过无监督训练的方法从巨量的人类文本语料中学习来的,后期的有监督训练并没有提升ChatGPT的即时学习能力。这个无监督训练方法非常简单朴质,就是根据文本中前面看到的文字,不断的预测下一个文字是什么。现在我们把眼光稍微放开一些,这个任务本质上就等于根据前面文本的约束条件生成后面文本,只不过是以一种分步走的形式来进行。我们再引申一下,这个任务可以进一步看成自然语言约束条件下的前因推后果的任务,由前文的“因”推出后文的“果”。
而前因推后果这个任务是一个超级任务,是所有具体任务的元任务。GPT实际上就是在训练这个超级任务。因为它是一个超级任务,非常难,所以它需要非常庞大的参数模型和巨量的语料来训练。这可能这就是大模型能力涌现现象的原因所在。对于单任务模型来说,泛化意味着从此任务的已知数据点泛化到此任务的未知数据点上。对于GPT来说,泛化意味着从已知的不计其数的任务泛化到未知的任务上面。这就解释了为何ChatGPT拥有即时学习能力,有掌握全新的知识和技能的能力。要做到这样强的泛化能力,就需要GPT通过在巨量语料上的训练在其内部建立起一个良好的世界知识的模型。
深刻理解“前因推后果”这个训练本质能指导我们更好地使用ChatGPT,构造出理想的Prompt。我们举一个例子(见下图),如果我们给ChatGPT一个人口的数据报告,然后再问它关于人口数据的时候,ChatGPT会优先使用报告中的数据而不是大模型中的数据。这是因为报告起到了一个前因的作用,所以后面的数据分析肯定是会基于前面这个报告得出的。ChatGPT用到的通用语料中的文字都是上下文相关的,不可能说前面放了一个报告,紧跟着却去说与报告无关的事情,这样的概率很小。所以,如果我们可以给ChatGPT设置一个很好的“前因”,把它带到我们想要的场景中,那么就会得到更符合我们要求的“后果”。
下面我们接着探讨一下GPT强泛化能力的来由。
根据前面的文本预测下一个字确实是一个概率行为,看似简单,但想做好却是一件异常复杂的事情。我们人类是怎么做的呢?我们需要理解前文的语义,我们大脑要有世界的知识模型,我们要预测出后面将会发生什么事情,最后我们需要根据语法规则挑选出合适的下一个字。只有这样才能生成符合逻辑的文本。GPT可能也是在做类似的事情,因为它生成了非常符合逻辑的文本,GPT-4在各种任务上文本生成的表现已经接近甚至超越了普通人的智能水平。
很多人认为大模型的训练只是对语料中的数据进行一个拟合,或者叫做近似。但他们不了解大模型中用到随机梯度下降算法实际上是一种泛化在先的拟合算法,即通过泛化的形式来进行拟合。这种算法会先拟合所有数据点中最共性的特征,然后再拟合次共性的特征,以此类推,最后拟合每个数据点中最个性的特征。这时才等于把所有数据点都记忆下来了。
深度学习中的随机梯度下降算法甚至不属于标准意义上的NLP统计算法,因为它的最小计算单位不再是字或者字符,不再通过计数(counting)字或者词之间关联的方式来研究语义,这和其它的传统机器学习算法,比如贝叶斯、SVM、HMM等等非常不同。大模型用高纬度向量来表达字,相当于把离散的一个个字的边界都打碎了,把字碾成了粉末,每个字其中包含的语义变成连续的、可以流动的东西,这是为了方便求导的数学运算。
下面,我们用一个非常形象但不是特别准确的例子来解释一下随机梯度下降算法中的泛化在先原则。例子中用到的随机梯度下降优化算法为Mini-batch SGD。假设我们的世界知识是一棵长满绿叶的大树的照片,我们可以把树的叶子比喻成语料,一片叶子相当于一个文字。我们的模型初始化的时候是一张空白的纸。我们不能看见树的全观,只能通过一个个小窗口看见窗口内的树叶。一个窗口就相当于一次采样。我们的目标是要通过随机梯度下降优化算法使得模型内部构建出这颗世界知识的大树。
我们使用和GPT同样的训练任务,即我们通过窗口内已经看到的树叶去预测与它们最相邻的一片叶子,而GPT是使用一段文本中前面的文字去预测下一个文字。和GPT训练方法一样,我们使用Transformer 掩码(masking)的方式可以同时完成窗口内每一片叶子的被预测的训练任务,并且同时完成多个窗口(多次采样)上的全部训练任务,因为我们采用的是Mini-batch SGD。这就是说,对模型参数的每一次更新实际上是基于很多个预测下一片叶子的训练子任务。我们知道,我们是通过梯度的方向来对模型参数进行更新,而梯度的方向就是真实和预测之间变化差异最大的方向。每次模型更新的梯度实际上是多个训练子任务上的梯度的叠加。所以这个总梯度可以说是一个共性的表现,因此每个训练子任务上面共性的东西就容易被放大,而个性的东西就容易被抵消,特别是在共性的东西尚未建立的混沌状态中。从统计的角度来说,大量训练子任务梯度叠加的方向近似于真实的世界知识和模型内部构建的世界知识差异最大的方向。
最开始的时候,当我们的模型还是一张空白纸,它和那棵真实的“世界知识大树”差异最大的方向是什么呢?那必定是满屏的绿色,这就是所有知识(叶子)最最共性的特征。所有预测下一片叶子的子任务的梯度中都会有明显指向这个方向的向量维度。所以,模型最先拟合的特征就是叶子的绿色,相当于我们在白纸上画上了一片绿色。一旦绿色的特征被基本上拟合之后,次共性的特征就会变得显著,这些特征可能包括树叶的轮廓和内部脉络的基本形状。一旦这些次共性的特征被拟合之后,次次共性的特征的差异性就会显露出来了,可能包括树叶所在的区域,顶部、中部、边缘、底部,或者树叶有没有被虫咬,树叶的菌斑等等树叶之间的普遍关联特征。当共性的特征都被拟合完成之后,模型会开始着重拟合个性的特征,每片叶子具体的特点,特定叶子与叶子之间的关联关系等等。直至最后,真实世界知识大树和我们模型内部表征出来的大树之间的差异没有了,梯度消失了,我们的训练也就停止了。
通过上面这个例子我们可以看出,随机梯度下降算法是和“死记硬背”完完全全对立的一种算法。它具有非常强的泛化性,是一种泛化在先的算法,因为它总是先拟合共性的东西。GPT也是使用了相同的方式从巨量的人类语料中学习并构建出来人类的“世界知识大树模型”。但是,机器这种在连续空间里面找共性的“思维方式”对于我们人类来说是很难理解的,因为我们习惯于在基于离散的字的空间上去思考问题。
众所周知,ChatGPT有时候会一本正经的胡编乱造,不知道问题答案的人很容易会被它蒙骗。而这种胡编乱造的本领其实正是GPT大模型强泛化能力的一个具体表现。泛化就是理解的能力,举一反三的能力。编造不存在的东西达到以假乱真的程度正是说明GPT对它所需要描述的事物有着充分的理解,是一种“高智商”的体现。
4
ChatGPT一本正经胡说八道问题的
探讨和解决思路
ChatGPT胡编乱造的问题牵扯到一些大模型中非常本质的东西。ChatGPT胡编乱造最主要的原因是GPT在巨量语料的预训练中完全是以旁观者的身份存在的,这里面缺少一个“自我”。语料中的内容是客观存在的,并不以GPT知不知道这些内容有任何的变化。GPT只是在模仿这些内容的生成。当然我们上节说过,这是一种基于“理解”的模仿,并不是单纯记忆。
咱们举个法律领域的例子。假设GPT的语料中有一些案件分析的文本。这些文本首先会交代一个案情,然后法官会分析解剖这个案件,给出这些案件的法律适用(法条),最后法官还会给出几个以往的类似案例作为参照。我们使用ChatGPT做案件分析的时候,它其实是在模仿语料中的这个过程。但是如果大模型的法律法规训练得不够充分,ChatGPT找不到合适的法条的时候,它知道这个位置需要生成一个法条,它就会运用它的泛化能力编造一个最像的法条。ChatGPT不会说,我找不到合适的法条,因为它学习模仿的语料文本中不会发生这样的事情。
造成ChatGPT胡编乱造的第二个原因是训练不充分。从某种角度来说,胡编乱造不是大模型的一种错误,而是对相关知识未充分训练的一种中间状态。假设人类世界的知识是有限的(closed world),大模型装下了所有的知识,并对之进行了充分的训练,那么绝大多数胡编乱造的情况会消失。因为大模型可以清楚地知道知识的界限在哪里,哪些是存在的,哪些是不存在的。
但是实际上,人类世界的知识可以说是无限的(open world),大模型虽然知道很多知识,但它并不知道边界在哪里。训练语料中存在着大量的边缘知识,出现的次数比较少,大模型没有机会进行充分的训练,以至于不能很好地理解掌握这部分知识。如果在对话中涉及到这部分边缘知识,ChatGPT就会出现胡编乱造的现象。其实这就是大模型从不懂通向懂之间的一个未完成状态。
下面我们看一个例子。我们让ChatGPT和百度文心一言同时生成演员张涵予的生平介绍。ChatGPT给出的张涵予的信息貌似有模有样,实际上都是胡诌的,出生时间和地点都是错的。不过ChatGPT大体上知道张涵予是演电影的,而且也说对了其中的一部电影《湄公河行动》。百度文心一言给出的张涵予的信息基本上都是对的。我们知道,ChatGPT训练中使用的中文语料是很少的,而百度使用的语料绝大部分都是中文而且训练是比较充分的。可以看出,经过充分训练之后大模型在演员张涵予生平介绍上的胡编乱造情况得到了大大的改善。
解决ChatGPT胡编乱造的问题可以从上述的两个原因入手,还可以分为长期、短期两类方案。最正统的长期方案就是通过与外界交互式的训练,让ChatGPT拥有“自我”,可以根据“自我”的状态调整对话的内容。这样,当ChatGPT不拥有准确地回答某些问题的知识的时候,它就会回答“我不知道”。实际上,OpenAI也正走在这条路上。基于人类反馈的强化学习(RLHF)就给了ChatGPT和外界交互的机会,它就不再仅仅是一个世界的旁观者了。当ChatGPT胡编乱造的时候,我们人类可以对它进行纠正,告诉它这个时候正确的回答是“我不知道”。当这种反馈训练达到足够量级的时候,ChatGPT就可以将这种胡编乱造的场景和自身的知识掌握状态联系在一起,进行泛化。GPT-4发布时公开的官方文档也显示出了RLHF正在有效地解决幻觉的问题:经过RLHF训练之后的ChatGPT在TruthfulQA的问题集上有50%以上的改善(见下图)。
理论上,我们从算法层面应该也可以捕捉到ChatGPT胡编乱造的状态。GPT-4发布时的官方文档显示出一个有趣的现象,预训练完成之后GPT-4在做MMLU测试集的时候,它对所选择答案输出的概率和它实际上答对这道题的正确率几乎完全一致。这说明GPT-4对答案的正确与否是“心中有数”的。所以,当ChatGPT“胡编乱造”时生成的文本,其相对应的概率曲线或者entropy曲线可能也具有某种明显特征,应该可以和“胸有成竹”时生成文本的曲线区分开来。
解决ChatGPT胡编乱造的问题的第二条路就是让大模型尽可能多地吸收语料知识,并对之进行充分训练。多吸收各方面的语料知识就是扩大大模型知识的范围,使得用户提出的问题基本上可以落在大模型边缘知识以内的部分,即大模型可以充分理解的知识范畴之中。充分训练就是让大模型可以完全掌握并记忆住这些知识。前文中我们举的那个张涵予的例子可以说明充分训练的必要性。
但是大模型的容量有限,不可能包含世界上所有的知识。就拿中文法律领域来说吧,全量案例加在一起就有1TB的数据量了。而1750亿参数的GPT-3模型的总共容量也就只有1TB。所以,至少目前大模型是不可能包含全量的案例信息。那么我们在训练大模型的时候就会面临一个语料的取舍问题,哪些是该放的,哪些是不该放的,以及训练程度问题。
拿法律领域来说,训练至少要做到对全部法律法规的准确记忆,因为这是理解法律知识和关系的基础。全量案例不宜于都加入到语料之中,因为这么做会造成同一模式的语料占比过高,容易破坏语料的多样性,影响到大模型的泛化理解能力。
而准确记忆和索引案例数据这个任务则交由外部的法律信息搜索引擎,比如北大法宝,来完成。通过虚拟人的即时学习能力,我们可以直接告诉ChatGPT对话机器人,“凡是需要引用实际案例的地方,请调用北大法宝来搜索案例”。ChatGPT可以理解你的命令,按照你的命令执行,因为这个命令并不涉及到ChatGPT“自我”的状态,而只是对一个客观知识(案例)的认知和理解。最近微软发布的154页的GPT-4调研报告《通用人工智能火花》的中充分展示了ChatGPT在这方面的能力(见下图)。ChatGPT可以在凡是需要数学计算的时候能够自动调用计算器来解决问题。
所以,即使OpenAI在第一条“让ChatGPT拥有自我”的路上受阻,我们仍然可以通过第二条路,充分训练+锁定范围,来有效地规避掉ChatGPT胡编乱造的问题。虽然ChatGPT“不知道”自己知不知道,但我们可以通过训练来控制它不知道的范围。只要我们清楚它的知识范围,我们就可以通过自动调用外部工具的方式来弥补它的不足。
进NLP群—>加入NLP交流群