目前公开开源的模型FLAN T5就是在T5模型基础上进行了指令微调的训练,相较于那些动辄几百亿、几千亿参数的大模型来说,这个模型的参数量已经足够亲民,可以作为个人研究或者业务实现的strong baseline
接上一篇
作者:邱震宇(华泰证券股份有限公司 算法工程师)
在ChatGPT公开后,各种五花八门的Prompt层出不穷。有让其作为一个linux终端的,有让其作为一个二次元猫娘的,也有让他写武侠小说的。感觉上ChatGPT可以做任何事情,只要你的脑洞足够大。这种通才特质有很大一部分要归功于指令微调。只要我们设计的Prompt指令足够清晰完整,模型总能够理解我们要干什么,并尽量按照我们的需求去完成任务。我认为这是其有别于过往大模型的重要特性之一。
深度强化学习简述
指令微调技术固然强大,但是其本身也存在一定的缺点:
-
一些开放性的生成性语言任务并不存在固定正确的答案。因此在构建指令微调的训练集时,就无法覆盖这些任务了。
-
语言模型在训练的时候,对于所有token层面的错误惩罚是同等对待的。然而在文本生成时,有些token生成错误是非常严重的,需要加权惩罚。换句话说,语言模型的训练任务目标与人类的偏好存在gap。
综上,我们需要模型能够学习如何去满足人类的偏好,朝着人类满意的更新模型参数。因此,我们就需要引入人类对模型的奖惩方法(Reward)作为模型的引导,简称 �
(�)∈ℜ R(s)越高,模型的就越能满足人类偏好。很自然的,我们就能将最大化
即R的期望。一般来说,对于神经网络的训练来说,需要设计一个可微的目标函数,这样才能应用梯度下降法来对模型进行参数更新学习。然而,人类的R一般很难设计成可微的,因此不能直接用于神经网络的训练中,因此就有了强化学习的诞生。近年来,强化学习领域也在飞速发展,有了alphaGo系列的惊艳效果,有很多研究都将强化学习开始与深度学习进行了结合。比较典型的研究为Policy Gradient methods(基于策略的梯度方法)。基于上述的训练目标函数,我们仍然应用梯度计算来进行参数更新:
对于这个公式有两个问题:
-
如何估计R(*)的期望函数?
-
如果R(*)是一个不可微的函数,该如何计算梯度?
Policy Gradient methods就是用来解决上述问题的。通过一系列的公式变换(过程就不放了,大家可以参考斯坦福cs224n),可以得到以下式子:
我们将梯度计算移到了计算期望的式子内。虽然我们不能直接计算期望,但是可以采用蒙特卡洛采样的方法,去采样得到目标梯度的无偏估计。
将上式重新代入梯度更新的式子中,得到:
此时,在梯度更新时候我们会有两种趋势:
-
当R为正的时候,说明对当前策略选择 Si��有奖励,因此我们需要让梯度沿着最大化 ���(��)
的方向更新
-
当R为负的时候,说明对当前策略选择 Si�� 有惩罚,因此我们需要让梯度沿着最小化 ���(��)
的方向更新
通过这种方式,我们就让模型逐渐逼近R所期望的方向学习。
ChatGPT也将强化学习的技术进行了应用集成,通过人机结合,成功让模型学会了人类的偏好。这种技术就是Reinforcement learning from Human Feedback,以下简称RLHF。
因为本人对强化学习领域不太熟悉,所以不足以完全解释其中的原理机制。因此主要参考斯坦福cs224n课程系列中对于该部分的宏观层面讲解。
RLHF
有了上面的强化学习技术,我们现在能够对一些不可微的函数进行梯度学习,我们就能引入一些符合人类期望的奖励函数作为模型训练目标。但是,这套工作流程让然存在一些问题:
-
整个训练过程需要人工不断对模型的策略选择进行奖惩的判断,训练的时间成本陡然上升。
为了降低训练成本,先标注适量的数据集,让人先给出偏好标注。然后,我们基于这个数据训练一个奖励模型 ���(�)
,用来自动生成人类对一个数据的偏好回答。
-
人本身会存在主观偏差,因此对数据的标注或者模型策略的评价也会有偏差。
为了能够对人类的主观偏差有一定的鲁棒性,不直接给出一个具体的好坏答复,而是采用一种Pairwise Comparison的方式,当生成一个文本输出时,人类可以对其进行成对比较,以指出其中更好或更合适的内容。例如,在文本摘要任务中,人类可以比较两个不同版本的摘要,并选择更好的那一个。这些成对比较可以帮助 InstructGPT 学习到人类的喜好和优先级,从而更好地生成高质量的文本输出。为了实现 Pairwise Comparison,需要设计一些有效的算法和策略,以便生成不同版本的文本输出,并对它们进行比较。具体来说,可以使用类似于基于排序的学习方法的算法来训练模型,并优化生成策略和模型参数,以便更好地满足人类反馈的需求:
图中,w和l分别代表两个不同的模型生成结果,从人类的视角看w的结果更优,因此w的分数应该也要大于l。
最后我们将RLHF的核心步骤串联起来:
InstructGPT中的RLHF
下图为目前最常见的InstructGPT训练流程。
ChatGPT中的RLHF
根据OpenAI发布的技术博客所述,ChatGPT的训练方式与InstructGPT几乎相同,仅在收集数据的时候采用了不同的方式,具体细节并没有公布,只提到他们让人工的标注人员同时扮演对话过程中的用户与机器人,并通过一系列准则规范指导他们如何编排对话中的回复,最终生成了对话场景的训练数据。最终,他们将其与InstructGPT的数据集进行的融合,并统一转化为对话的形式。另外,在训练Reward模型时,他们通过让人工标注人员与对话机器人进行对话来产生会话语料,并从中选择一个模型生成的消息,通过采样的方式生成多个不同的补全文本,并由标注人员进行打分排序,形成Pairwise Comparison数据。
ChatGPT训练的工程难度
至此,本文将ChatGPT相关的技术要点已经做了一个整体的介绍,通过上文描述,我们可以看到OpenAI在研发ChatGPT的过程中投入了非常多的成本与研发精力,另外要训练出这样一个体量的模型,对于工程化的要求也是非常高的,包括对数据的清洗、大规模分布式训练的工程化以及大模型大数量下的训练稳定性技术等。就我个人而言,之前有研究并实施过BERT-LARGE模型的预训练,其参数量肯定不能与ChatGPT相比,但在训练中,也遇到过loss飘飞、训练中断卡壳的情况。因此,这样一个成果是算法与工程紧密结合的产物,其效果之好也就不奇怪了。
ChatGPT的能与不能
当前,伴随着ChatGPT的接口开放,已经涌现出了很多有趣的应用。我按照自己的观察,总结了ChatGPT擅长做的以及不擅长做的事。
ChatGPT的能
ChatGPT虽然以对话机器人的产品形态提供服务,但是其本质上还是基于语言模型的能力。在应用层面上,他有三个强大的特质:
-
对人类输入的需求理解能力特别强。
-
善于进行知识的检索与整合。
-
生成能力很强,在长距离生成过程中不会有重复、不通顺、机械等传统生成模型固有的问题。
因此,适合其大展身手的场景可包括:
基于搜索的问答
目前最典型的场景就是继承了ChatGPT的New Bing。ChatGPT本身存在知识信息无法自更新的缺点,导致产生的回复无法紧跟时代。因此,将搜索引擎与ChatGPT进行集成就显得水到渠成了。据了解,微软通过一种称为“普罗米修斯”的模型机制,将搜索与ChatGPT的生成能力进行了整合。以最近比较火的“硅谷银行破产”事件为例,我们有如下提问:
可以看到New Bing回答得还不错。从New Bing的回复方式可以去猜测其运行机制:先通过搜索引擎召回与问题相关的网络实时信息,并提取其中的文本。然后将所有相关文本构造成Prompt输入到ChatGPT中,要求其生成完整的回答。另外,在回答中还会标识出答案内容的来源。
除了New Bing之外,基于文档的辅助阅读也是非常典型的场景。最近比较火的ChatPDF能够上传论文等PDF文件,并支持对文档的QA问答。这实际上也是一种问答搜索。
处理各种基础的NLP任务
我们可以将他包装成一个通用的NLP工具平台,处理各种任务,包括但不限于文本分类、信息抽取、文本摘要、机器翻译等。通过上述章节的介绍可知,GPT-3系列模型支持小样本和零样本学习的能力,因此应用他来做NLP任务可以降低人工标注的成本,并得到一个强大的baseline。我们尝试了对文档进行信息抽取的任务,如研报公告中的财务经营指标抽取:
可以看到上面我采用的是零样本的模式,但是ChatGPT以几乎100%的准确率将所有指标抽了出来。不过,抽取出来的数据没有单位,我们还可以让他做个修正:
与其他组件的整合
基于ChatGPT强大的理解能力,我们可以把它作为一个人类与其他场景工具进行沟通的中间桥梁,大大提升个人的生产力。
-
例如日常办公涉及到的OFFICE全家桶,目前已经有了很多集成的产品,例如ChatBCG,通过输入文字需求,就能自动生成PPT大纲以及每页的大致内容(当然,还不能自动生成多样的背景样式);ChatExcel,通过输入文字需求,能够让其实现表格的基本处理、函数计算、分组过滤排序等复杂操作。
2023年3月17日,微软宣布在OFFICE全家桶中集成GPT-4。打工人的生产力一下子就提升数倍!
-
另外,还可以与其他模态的模型工具进行整合,例如OpenAI开放的API中就包括了Whisper,一个语音识别的模型,人们可以通过Whisper将语音转文本,最终将文本送到GPT-3的接口中。另外,ChatGPT也可以与图像视觉的大模型进行结合,提供文生图的功能,例如今年大热的stable diffusion模型。之前图像生成非常依赖输入的Prompt质量。我们可以让ChatGPT辅助生成一个高质量的Prompt,然后输入到stable diffusion中,就能产生更符合需求的图像。
实际上,Meta在2月份就发表了一篇论文ToolFormer(https://arxiv.org/abs/2302.047611),研究了如何使用自监督的方式,让大模型如何决定什么时候调用外部的API来帮助其完成任务。可以预见,后面会有越来越多的产品出来,我倒是希望能有一款根据文本要求自动画流程图的工具,毕竟受苦与画图很久了 .
文字创作
作为一个生成式大模型,创作能力可以说是他的看家本领。ChatGPT的创作场景格外丰富,只有你想不到,没有他做不到:
-
合并撰写工作周报与工作小结、小说创作、电影剧本创作等。但对于专业度和准确性比较高的场景,就不太能胜任了,例如金融场景中的研报生成,即使是将具体的财务数据连同要求一起输入模型,最后生成的结果中也会有一些事实性的数据错误,这种错误是无法容忍的。
-
可以作为一个AI辅助训练工具。当受限于成本无法使用ChatGPT直接提供AI能力时,不妨可以将ChatGPT视作一个数据增强器,生成任务所需要的训练语料,再辅以少量的人工进行核验,就能以较低的成本获得高质量的语料。
-
上述提到的RLHF训练流程也可以通过引入ChatGPT来减少人工的投入。具体来说就是将Human feedback替换为 ChatGPT feedback。早在2022年12月就有相关的论文介绍了这种思路:[2212.08073] Constitutional AI: Harmlessness from AI Feedback (arxiv.org)
其实ChatGPT的应用场景还有很多,碍于篇幅,就不穷举出来了,大家可以自行关注相关媒体网站。
ChatGPT的不能
ChatGPT目前的应用非常广泛,看似是一个能干的多面手,但他也有目前无法胜任的场景。比较典型的就是推理分析。虽然在引入了代码以及其他迭代优化后,chatGPT初步具备了一定的推理能力,但对于复杂的推理分析计算类任务,他回答错误的概率仍然非常大。这里特别推荐知乎上看到一个关于ChatGPT能力探索的博文:https://www.zhihu.com/question/582979328/answer/2899810576
79328/answer/289981057作者通过设计了一系列缜密的实验,来不断探索ChatGPT的能力。从结果上可以看到机器的能力在某些场景上还是无法模仿人类的思维能力。
另外,在ChatGPT的训练过程中,使用了RLHF来引导模型按照人类偏好进行学习。然而,这种学习方式也可能导致模型过分迎合人类的偏好,而忽略正确答案。因此大家可以看到ChatGPT经常会一本正经的胡说八道。在专业领域,我们需要他知之为知之,不知为不知,不然我们就必须要引入人工来审核他的答案。
最后,应用大模型时绕不过的一个问题就是数据隐私安全。无论是ChatGPT,还是国内即将推出的大模型,由于B端客户很少有硬件资源能够匹配上,很难进行私有化本地部署,通常是以LaaS的形式提供服务。而且目前大模型在专业垂直领域的效果还是未知的,因此通常需要使用领域语料进行微调,这就意味着数据要流出到模型服务提供方。一般大型公司对于数据的流出是非常慎重的,因此如何在安全合规的条件下,完成这一条链路的流转,是目前亟需解决的问题。
额外提一个应用:代码生成。这个场景既是能也是不能。他在python语言的编码能力上确实不错,甚至能生成一段textcnn的实现;但是在java或者其他编程语言上,他的生成质量就相对较差了,而且生成的代码质量也不如一个经验丰富的工程师,在代码执行性能上暂时还无法满足需求。
关于大模型的可研究方向
关于ChatGPT的内容到这也就基本写完了。作为一名NLP领域的从业者,我也跟其他人一样,被其强大的能力所震惊,同时也在思考自己未来还能在这个领域做哪些事情,大概想了一些方向,欢迎共同讨论:
-
用更少的参数量,达到更好的效果。无论是之前DeepMind的 Chinchilla(70B),还是最近Meta的 LLaMA(65B), 亦或是3月14日智谱团队刚发布的ChatGLM(6B),他们的参数量都小于GPT-3(175B),但是其模型效果都能够匹配上GPT-3。在LLaMA的论文中,Meta表示他们用了更多的语料token来训练,这有可能意味着目前大模型的参数对知识的利用率还有很大的上升空间。我们可以通过精简参数,扩大语料规模来提升大模型的能力。
-
上面提到大模型应用时的数据隐私问题,目前也有一些可行的方法来解决。比如通过隐私计算的方式,让数据在流出时处于加密的状态。另外,也有一些学者在研究其他方法保护数据的隐私,例如Offsite-Tuning(https://arxiv.org/pdf/2302.04870v1.pdf0v1.pdf),这种方法的核心思想是设计了一个adapter(可以理解为一个由神经网络构成的组件)与仿真器(可以理解为大模型的一个压缩版本)并提供给用户,用户在仿真器的帮助下使用领域数据对adapter参数进行微调,最后将微调好的adapter组件层插入到大模型上组成了一个完整的新模型用于提供服务:
-
高效设计与应用ChatGPT的Prompt范式。例如我们可以设计一个工具平台,将不同类型的NLP任务包装成一种配置式的产品。用户针对自己的任务需求,只需要提供需求的详细描述,以及问题的样例,就能快速得到一个能力实例,并应用在自己的场景中;另外,我们还可以研究如何高效地设计一个Prompt来解决复杂的场景问题。如Least-to-Most(https://arxiv.org/abs/2205.106255)这篇论文所述,对于一个复杂问题,我们可以帮助LLM先自己拆解问题,形成为了解决问题X,需要先解决问题Y1,Y2...的形式,然后让模型分别去解决子问题,最后将所有子问题的解决过程拼在一块送到模型中,输出答案。这种方式可以有机结合COT的特性,可以用于处理一些比较复杂的问题。
结束语
在本文的最后来一些鸡汤吧:时代的车轮是不断向前的,技术的更迭也会给这个时代带来不可估量的影响。虽然ChatGPT的出现可能会对业界带来不小的冲击,但我们应该将目光放到更广阔的天地,在那儿将有更多丰富的未知世界等着我们去探索。
以此自勉!