#什么是ChatGPT?

作者:邱震宇

链接:https://zhuanlan.zhihu.com/p/613698929

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

最近ChatGPT可以说是火遍了全世界,作为由知名人工智能研究机构OpenAI于2022年11月30日发布的一个大型语言预训练模型,他的核心在于能够理解人类的自然语言,并使用贴近人类语言风格的方式来进行回复。模型开放使用以来,在人工智能领域引起了巨大的轰动,也成功火出了技术圈。从数据上看,ChatGPT用户数在5天内就达到了100万,2个月就达到了1亿;另外,在很多非人工智能领域,已经有机构在尝试用ChatGPT去做一些智能生成的事。例如财通证券发布了一篇由ChatGPT生成的行业研报,从研报的可读性和专业性上来看,虽然在细节上有很多需要推敲的地方,但是整体框架内容已经比较成熟。对于其他内容生产者来说,应用ChatGPT也能够提升个人的生产效率。

ChatGPT的强大能力是显而易见的,但对于人工智能领域不太熟悉的人,对这种黑盒的技术仍然会担忧或者不信任。恐惧通常来自于不了解,因此本文将为大家全面剖析ChatGPT的技术原理,尽量以简单通俗的文字为大家解惑。

通过本文,你可以有以下收获:

1、知道ChatGPT是什么

2、ChatGPT有哪些核心要素

3、ChatGPT能做哪些事

4、ChatGPT不能做哪些事

ChatGPT是什么?

上文说到ChatGPT实际上是一个大型语言预训练模型(即Large Language Model,后面统一简称LLM)。什么叫LLM?LLM指的是利用大量文本数据来训练的语言模型,这种模型可以产生出强大的语言关联能力,能够从上下文中抽取出更多的信息。其实语言模型的研究从很早就开始了,随着算力的发展和数据规模的增长,语言模型的能力随着模型参数量的增加而提升。下图分别展示了LLM在参数量和数据量上的进化情况,其中数据量图例展示的是模型在预训练过程中会见到的token数量,对于中文来说一个token就相当于一个中文字符。

https://www.vinayiyengar.com/2022/08/04/the-promise-and-perils-of-large-language-models/
https://babylm.github.io/

为什么语言模型的参数量和数据量会朝着越来越大的方向发展呢?在早些时间的一些研究已经证明,随着参数量和训练数据量的增大,语言模型的能力会随着参数量的指数增长而线性增长,这种现象被称为Scaling Law(下图左例)。但是在2022年之后,随着进来对大模型的深入研究,人们发现当模型的参数量大于一定程度的时候,模型能力会突然暴涨,模型会突然拥有一些突变能力(Emergent Ability,下图右例),如推理能力、零样本学习能力等(后面均会介绍)。

https://franxyao.github.io/blog.html

ChatGPT真正强大的地方在于他除了能够充分理解我们人类的问题需求外,还能够用流畅的自然语言进行应答,这是以前的语言模型不能实现的。下面,本文将ChatGPT一分为二,分别从GPT和Chat两个维度来介绍ChatGPT的机理。值得说明的是:当前OpenAI并未放出ChatGPT相关的训练细节和论文,也没有开源代码,只能从其技术BLOG上获取其大致的训练框架和步骤,因此本文介绍的内容将根据后续实际发布的官方细节而更新。

GPT

GPT全称Generative Pre-training Transformer,由Google在2018年提出的一种预训练语言模型。他的核心是一个Transformer结构,主要基于注意力机制来建模序列中不同位置之间的关联关系,最后可用于处理序列生成的任务。通过使用大量的文本数据,GPT可以生成各种各样的文本,包括对话、新闻报道、小说等等。上面提到了很多次语言模型,这里简单给出语言模型主要的涵义:

给定已知的token序列N_t(对中文来说是字符,对英文来说可能是单词或者词根),通过语言模型来预测t+1位置上的token是什么。实际上模型输出的是所有token在t+1位置上的概率向量,然后根据概率最大的准则选择token。大家在使用ChatGPT的时候,一定有发现机器人在生成回复的时候是一个字一个字的顺序,背后的机制就是来自于这边。

cs224n(https://web.stanford.edu/class/cs224n/slides/cs224n-2023-lecture11-prompting-rlhf.pdf)

对语言模型来说,可能大家之前更熟悉的是BERT,BERT是Google在2018年发布的一种双向语言模型,发布后,其在不同语言理解类任务(如文本分类,信息抽取,文本相似度建模)中都达到了当期时间节点的最好效果。BERT与上述语言模型的机理有所不同,其训练任务相当于让模型去做完形填空任务(官方称为Masked Language Model任务,下文简称MLM),并不是遵循文本一个接一个预测的顺序,其模型机制与人类沟通表达的习惯不太符合。图中左半部分是BERT的示意图,右半部是GPT的示意图,Trm为一个Transformer模型组件,E为输入的token序列,T为模型生成的token序列。其中,实线部分为该位置的Trm能够看到哪些其他位置token的上下文知识。可以看到,对于BERT来说,每个位置上的Trm都能看到任意位置的上下文知识,因此其在具体的自然语言理解任务上会有不错的效果。而GPT则是遵循传统语言模型的模式,例如index=1位置的Trm是无法看到index>1的知识的,因此它在自然语言理解任务上的效果不如BERT,但是在生成任务上会更符合人类的直觉。业界把BERT中的MLM模式称为自编码形式(auto-encoding),把GPT的模式称为自回归形式(auto-regressive)。

https://arxiv.org/abs/2302.09419

大家从BERT和GPT的对比中可以看到,BERT在语言理解上似乎更具优势,那为何现在ChatGPT的模型基座是GPT呢?这就涉及到最近两年逐渐清晰的NLP任务大一统趋势了。

NLP任务大一统

基于MLM训练范式得到的BERT模型虽然在很多语言理解类任务上有不错的效果下游任务,之后整个业界在处理NLP任务的时候通常会遵循预训练模型→下游任务finetune的流程:

这种方式与传统的training from scratch相比,对下游任务数据的需求量更少,得到的效果也更优。不过,上述方式还是存在一些问题:

  1. 处理一个新的任务就需要标注新的语料,对语料的需求比较大,之前已经做过的任务语料无法高效利用。即使是信息抽取下面的不同任务(如实体识别和关系抽取两个任务)也无法通用化。
  2. 处理一个新的任务需要针对任务特性设计整体模型方案,虽然BERT模型的底座已经确定,但还是需要一定的设计工作量。例如文本分类的任务和信息抽取的任务的模型方案就完全不同。

对于要走向通用人工智能方向的人类来说,这种范式很难达到通用,对每个不同任务都用单独的模型方案和数据来训练显然也是低效的。因此,为了让一个模型能够尽量涵盖更多的任务,业界尝试了几种不同的路径来实现这个目标。

  • 对BERT中的MLM进行改造,如引入一些特殊的Mask机制,使其能够同时支持多种不同任务,典型的模型如UniLM(https://arxiv.org/abs/1905.03197)
  • 引入额外的Decoder,将BERT优化改造成能做生成式的模型,典型的工作有BART(https://arxiv.org/abs/1910.13461),T5(https://arxiv.org/pdf/1910.10683.pdf),百度的UIE(将任务设计生成text-to-structure的形式实现信息抽取的大一统 )。我对T5比较熟悉,之前也写过相关的分析,这个工作算是比较早地尝试将不同任务通过文本生成的方式进行大一统。如图所示,T5训练时直接输入了不同下游NLP任务的标注数据,通过在原始文本的前端添加任务的提示文本,来让模型学习不同任务的特性。如翻译任务可以是”translate English to German”,分类任务可以是跟具体分类目标有关如”cola sentence”,也可以是一种摘要任务”summarize”。
 怎么样,是不是觉得跟ChatGPT的模式有相似的地方?

这种方式可以同时利用多种NLP任务相关的公开数据集,一下子就把预训练任务从语言模型扩展到了更多任务类型中,增强了模型的通用性以及对下游任务的理解能力。

T5数据构建实例
  • 除了上面两种方式外,还有其他改造BERT的方法就不穷举了,如苏神通过Gibbs采样来实现BERT模型的文本生成等。(https://kexue.fm/archives/8119

虽然有很多大一统的路径,但是OpenAI一直坚持着GPT的方向不断演化着,2019年他们发布了GPT2,这个模型相对于GPT来说,主要是扩大了参数量,扩大了训练语料,在构建语料的时候隐式地包含了multitask或者multidomain的特质,最后在二阶段验证模型的时候并不是直接做有监督的finetune,而是继续用下游数据做无监督的训练,最后的效果居然还不错,证明了只要模型够大,就能学到足够的知识用于处理一些下游任务。从它的论文名字就可以看出来与其核心思想:Language models are unsupervised multitask learners 。不过彼时,BERT及其各种变种在领域中的应用还是更广的,真正让GPT系列模型惊艳众人的工作还是要数2020年发布的GPT-3模型。(https://arxiv.org/abs/2005.14165

GPT-3

首先,说几个跟GPT-3相关的数字:

OpenAI训练初版的GPT-3,比GPT-2整整用了15倍的语料,同时模型参数量扩展了100多倍。这么多资源的投入,使得GPT-3成为了一个“庞然巨物”,其产生的效果也是惊人的。除了在很多NLP的任务上有着很不错的指标外,其本身也产生了一种前所未有的能力——In-context learning

何为In-context learning

简单来说,就是模型在不更新自身参数的情况下,通过在模型输入中带入新任务的描述与少量的样本,就能让模型”学习”到新任务的特征,并且对新任务中的样本产生不错的预测效果。这种能力可以当做是一种小样本学习能力。可以参考下图的例子来理解:其中,task description和examples用来帮助模型学习新任务,最后的Prompt用来测试模型是否学会了。

与传统的小样本学习范式还是有所不同,之前主流的小样本学习范式以Meta-learning为主,通过将训练数据拆成不同的小任务进行元学习。在学习的过程中,模型的参数是一直在变化的,这是最大的一个不同点。

那不更新参数的小样本学习有什么好处呢?

对于大模型来说,这可是极佳的特性。因为大模型的微调成本通常都极为庞大,很少有公司能够具备微调训练的资源。因此,如果能够通过In-context learning的特性,让大模型快速学习下游任务,在相对较小的成本下(对大模型进行前向计算)快速完成算法需求,可以大大提升技术部门的生产力。

In-context learning的效果固然惊艳,但是对于一些包含复杂上下文或者需要多步推理的任务仍然有其局限性,这也是业界一直以来致力于让人工智能拥有的能力——推理能力。那么大模型具有推理能力吗?对于GPT-3来说,答案是可以有,但有一定的限制。我们先来看看它有的部分。

还记得文章开头提到的大模型的涌现能力吧,In-context正是属于当模型参数量达到一定程度后,突然出现的能力之一。那么除此以外,还有什么能力是涌现的呢?答案就是——Chain-of-thought,即思维链能力。

怎么理解In-context learning

GPT-3拥有的In-context learning能力可以说有很大程度来自于其庞大的参数量和训练数据,但是具体能力来源仍然难以溯源。不过,最近已经有一些论文专门针对其进行了研究,如清华大学、北京大学和微软的研究员共同发表了一篇论文:https://arxiv.org/abs/2212.10559,探索了GPT作为一个语言模型,可以视作是一个元优化器,并可将In-context learning理解为一种隐性的微调。

何为Chain-of-thought(COT)

实际上是对输入的Prompt采用Chain-of-thought的思想进行改写。传统的Prompt中,对于一个复杂或者需要多步计算推导的问题样例,会直接给出答案作为In-context learning的学习范例与新任务的测试样例输入到大模型中。这样做往往不能得到正确的结果,如图所示:(https://arxiv.org/pdf/2205.11916.pdf

然而,当我们将上述问题范例中的答案再细化一些,对推到出答案的每一个步骤都写出来,再将测试样例一起输入到模型中,此时模型居然能够正确回答了,而且也能够参照范例中的样例进行一定的推理,如图所示:

上述的模型输入中,还带有可参考的问题范例,还属于小样本的范畴。诡异的是,有人使用了一种匪夷所思的方法,让其具备了零样本的推理能力:在问题样例的答案中增加一句Let’s think step by step. 然后模型居然能够回答出之前不能回答的问题。

当然,上图中模型并未直接给出一个简洁的答案,而是给出了推导答案的步骤,论文中则是将上述output与输入模型的Prompt拼在一块,再次输入模型,最终得到了简洁的答案输出:

既然大模型具备了COT的特性,那么就能说明它具备了推理能力了吗?答案是不确定的。因为在更多的复杂逻辑推理类任务或者计算任务上,大模型还是无法回答。简单来说就是他可以做一些简单的小学应用题,但是稍微复杂一点的问题它就是在瞎猜了。具体的例子可以参考这篇论文中的分析:https://arxiv.org/abs/2208.05051

Chain-of-Thought能力来自于哪儿?

上一小节在介绍COT特性的时候,都是统一用GPT-3来代表。其实,**原始的GPT-3版本中并没有显著地发现其具备COT特性。**对于大众来说,像是chatGPT突然就有了这样的能力。其实,在chatGPT出来之前,openAI对GPT-3做了很多迭代优化工作。而GPT-3的COT特性就是在这些迭代优化中逐渐展现。但不可否认的是,目前仍然没有确定性的结论说明COT特性来自于具体哪些迭代优化。有些观点说是通过引入强化学习,有些观点则是说通过引入了指令微调的训练方式,也有些观点说是通过引入庞大的代码预训练语料,使得模型从代码逻辑中学习到了相应知识。推测的方式则是根据不同时间节点上的模型版本能力差进行排除法,虽然目前我们受限于技术能力只能从这些蛛丝马迹中去发现一些端倪,但仍然具有一定的借鉴意义。具体的推理过程本文不会重复,感兴趣的可以参考如下博客:https://franxyao.github.io/blog.html

Instruction-Tuning与RLFH技术

虽然对于大模型突变能力的来源还不能轻易下结论,但是在其迭代优化过程中,引入的一些技术确实提升了(更准确得说是激活)大模型的能力。根据OpenAI的技术博客所述,ChatGPT的训练方式主要参考了InstructGPT(https://arxiv.org/abs/2203.02155),而InstructGPT主要涉及了两个核心的技术实现:指令微调(Instruction-Tuning)以及基于人工反馈的强化学习(Reinforcement learning from Human Feedback),下面将对其进行介绍。

Instruction-Tuning

Instruction-Tuning(下称指令微调)技术,最早来自于谷歌Deepmind的Quoc V.Le团队在2021年发表的论文《Finetuned Language Models Are Zero-Shot Learners》(https://arxiv.org/abs/2109.01652)。在说指令微调前,必须得先介绍下21年初开始业界开始关注的Prompt-learning范式。2021年4月,我在InfoQ的架构师大会上做了一次技术演讲,分享了我们在Prompt上的一些研究实践,如下图所示:

Prompt-learning最早来自于论文《Exploiting Cloze Questions for Few Shot Text Classification and Natural Language Inference》(https://arxiv.org/abs/2001.07676),当时把里面的范式简称为PET(Pattern-exploiting Training)。其核心思想为将不同类型的自然语言理解任务与BERT预训练中的掩码语言模型任务进行转化靠拢。例如对于图中的实体情感分类任务,本身其分类标签是一个三维的空间。我通过设置一个prompt提示文本模板:由此可见,英伟达的舆情是{},同时设计一个锚点,将原始分类目标的空间映射到语言模型中的子空间{正/负/中},通过预测锚点位置的token间接得到情感标签。这种方式的优点在于能够将下游任务与语言模型在预训练任务中的训练范式达成一致,减少下游任务在模型学习迁移过程中的知识损失,在小样本的场景下比普通的Finetune模式会有更好的效果。Prompt-learning实际上是一种语言模型能够股泛化不同任务的方式,从广义层面上来看,可以有多种实现方式,例如上面的PET,本文之前提到的T5模型,以及初版的GPT-3等。指令微调实际上也可以算作是广义Prompt-learning中的一种实现方式(个人愚见)。它的核心思想是尽可能收集不同类型的自然语言处理任务(包括理解和生成),并使用自然语言设计对应的任务指令,让模型试图理解不同任务的指令与特性,最终通过语言模型生成的方式完成不同任务的训练,指令微调实例如下图所示:

那么指令微调与BERT、T5、GPT-3等Prompt方式有什么区别呢?

  1. BERT类的Prompt设计与掩码语言模型任务相关,Prompt模板和锚点要与任务对应,需要一定量的标注样本进行小样本训练。
  2. T5的Prompt更像是在预训练时对不同语言任务的数据打上了不同的标记,让模型对语言任务有了初步的理解,但是不够深入,无法应用在零样本的场景。
  3. GPT-3的Prompt中,会基于在模型训练过程中见过的数据,更像是让模型将Prompt中的文本进行续写。这种方式可以帮助模型更好地理解用户输入的内容,并产生更准确和自然的输出。但其在零样本场景下效果仍然不佳。
  4. 指令微调技术使用Prompt来为模型提供一系列指令或者命令,这些指令或命令会告诉模型应该如何进行特定任务的处理。与GPT-3中的Prompt不同,指令微调中的Prompt是针对特定任务和特定的模型进行设计的,相当于是指导模型如何完成任务。指令微调技术提升了模型的零样本学习能力。模型对于未见过的任务也能够理解并尝试处理。在GPT-3后续的迭代版本中,加入了指令微调后,即使在Prompt中不引入带标注的样本,模型也能够比较好的理解需求并得到不错的效果。
 目前公开开源的模型FLAN T5就是在T5模型基础上进行了指令微调的训练,相较于那些动辄几百亿、几千亿参数的大模型来说,这个模型的参数量已经足够亲民,可以作为个人研究或者业务实现的strong baseline

在ChatGPT公开后,各种五花八门的Prompt层出不穷。有让其作为一个linux终端的,有让其作为一个二次元猫娘的,也有让他写武侠小说的。感觉上ChatGPT可以做任何事情,只要你的脑洞足够大。这种通才特质有很大一部分要归功于指令微调。只要我们设计的Prompt指令足够清晰完整,模型总能够理解我们要干什么,并尽量按照我们的需求去完成任务。我认为这是其有别于过往大模型的重要特性之一

深度强化学习简述

指令微调技术固然强大,但是其本身也存在一定的缺点:

  1. 一些开放性的生成性语言任务并不存在固定正确的答案。因此在构建指令微调的训练集时,就无法覆盖这些任务了。
  2. 语言模型在训练的时候,对于所有token层面的错误惩罚是同等对待的。然而在文本生成时,有些token生成错误是非常严重的,需要加权惩罚。换句话说,语言模型的训练任务目标与人类的偏好存在gap。

综上,我们需要模型能够学习如何去满足人类的偏好,朝着人类满意的更新模型参数。因此,我们就需要引入人类对模型的奖惩方法(Reward)作为模型的引导,简称 R(s)∈ℜR(s)\in \Re .R(s)越高,模型的就越能满足人类偏好。很自然的,我们就能将最大化 Es~ ∼pθ(s)[R(s~)] E_{\tilde{s}~∼pθ(s)}[R(\tilde{s})] ,即R的期望。一般来说,对于神经网络的训练来说,需要设计一个可微的目标函数,这样才能应用梯度下降法来对模型进行参数更新学习。然而,人类的R一般很难设计成可微的,因此不能直接用于神经网络的训练中,因此就有了强化学习的诞生。近年来,强化学习领域也在飞速发展,有了alphaGo系列的惊艳效果,有很多研究都将强化学习开始与深度学习进行了结合。比较典型的研究为Policy Gradient methods(基于策略的梯度方法)。基于上述的训练目标函数,我们仍然应用梯度计算来进行参数更新:

对于这个公式有两个问题:

  1. 如何估计R(*)的期望函数?
  2. 如果R(*)是一个不可微的函数,该如何计算梯度?

Policy Gradient methods就是用来解决上述问题的。通过一系列的公式变换(过程就不放了,大家可以参考斯坦福cs224n),可以得到以下式子:

我们将梯度计算移到了计算期望的式子内。虽然我们不能直接计算期望,但是可以采用蒙特卡洛采样的方法,去采样得到目标梯度的无偏估计。

将上式重新代入梯度更新的式子中,得到:

此时,在梯度更新时候我们会有两种趋势:

  • 当R为正的时候,说明对当前策略选择 sis_i 有奖励,因此我们需要让梯度沿着最大化 pθt(si)p_{\theta_t}(s_i) 的方向更新
  • 当R为负的时候,说明对当前策略选择 sis_i 有惩罚,因此我们需要让梯度沿着最小化 pθt(si)p_{\theta_t}(s_i) 的方向更新

通过这种方式,我们就让模型逐渐逼近R所期望的方向学习。

ChatGPT也将强化学习的技术进行了应用集成,通过人机结合,成功让模型学会了人类的偏好。这种技术就是Reinforcement learning from Human Feedback,以下简称RLHF。

 因为本人对强化学习领域不太熟悉,所以不足以完全解释其中的原理机制。因此主要参考斯坦福cs224n课程系列中对于该部分的宏观层面讲解。

RLHF

有了上面的强化学习技术,我们现在能够对一些不可微的函数进行梯度学习,我们就能引入一些符合人类期望的奖励函数作为模型训练目标。但是,这套工作流程让然存在一些问题:

  • 整个训练过程需要人工不断对模型的策略选择进行奖惩的判断,训练的时间成本陡然上升。

为了降低训练成本,先标注适量的数据集,让人先给出偏好标注。然后,我们基于这个数据训练一个奖励模型 RMϕ(s)RM_\phi(s) ,用来自动生成人类对一个数据的偏好回答。

  • 人本身会存在主观偏差,因此对数据的标注或者模型策略的评价也会有偏差。

为了能够对人类的主观偏差有一定的鲁棒性,不直接给出一个具体的好坏答复,而是采用一种Pairwise Comparison的方式,当生成一个文本输出时,人类可以对其进行成对比较,以指出其中更好或更合适的内容。例如,在文本摘要任务中,人类可以比较两个不同版本的摘要,并选择更好的那一个。这些成对比较可以帮助 InstructGPT 学习到人类的喜好和优先级,从而更好地生成高质量的文本输出。为了实现 Pairwise Comparison,需要设计一些有效的算法和策略,以便生成不同版本的文本输出,并对它们进行比较。具体来说,可以使用类似于基于排序的学习方法的算法来训练模型,并优化生成策略和模型参数,以便更好地满足人类反馈的需求:

图中,w和l分别代表两个不同的模型生成结果,从人类的视角看w的结果更优,因此w的分数应该也要大于l。

最后我们将RLHF的核心步骤串联起来:

  1. 初始状态下有一个通过指令微调方法训练后的语言模型 pPT(s)p^{PT}(s) 
  2. 标注适量的数据,用于训练一个能够针对语言模型进行打分的Reward模型 RMϕ(s)RM_{\phi}(s) 
  3. pPT(s)p^{PT}(s) 的权重参数初始化一个新的模型 pϕPT(s)p_{\phi}^{PT}(s) ,使用上面的基于策略的深度强化学习方法优化下面的Reward:

除了 RMϕ(s)RM_{\phi}(s) 外,上式还加了一个正则项。这个正则项可以防止通过强化学习更新的模型与原始的语言模型”跑的过于遥远”,可以看成是一条缰绳,让其保持基本的语言模型的特质。

InstructGPT中的RLHF

下图为目前最常见的InstructGPT训练流程。

  1. 与上一小节中的通用RLHF流程不同,这里我们需要先用一些标注数据finetune一个SFT模型。训练任务与GPT-3的任务相同,因此数据也是采用prompt-generation的方式。构造的数据集的方式比较有讲究,首先要保证任务的多样性足够丰富;其次,对每个样本,标注着需要设计一个指令,然后生成多个问答对于该指令进行组合,用于组成一个小样本的Prompt;最后就是OpenAI收集了实际服务当中产生的一些用户样例,这个数据能够让模型更切合实际使用的数据分布。
  2. 构建RM数据集,并训练得到 RMϕ(s)RM_{\phi}(s) 。为了减少人工的成本,会先用步骤1中得到的SFT模型为每个数据的Prompt产生K个生成结果,并引入人工根据结果进行质量排序。排序后的数据可以用来构建Pairwise Comparison的数据,用于训练得到 RMϕ(s)RM_{\phi}(s)
  3. 基于策略优化的强化学习方法,以步骤1得到的SFT模型作为权重初始化模型,利用步骤2 RMϕ(s)RM_{\phi}(s) 对样本生成进行打分。

ChatGPT中的RLHF

根据OpenAI发布的技术博客所述,ChatGPT的训练方式与InstructGPT几乎相同,仅在收集数据的时候采用了不同的方式,具体细节并没有公布,只提到他们让人工的标注人员同时扮演对话过程中的用户与机器人,并通过一系列准则规范指导他们如何编排对话中的回复,最终生成了对话场景的训练数据。最终,他们将其与InstructGPT的数据集进行的融合,并统一转化为对话的形式。另外,在训练Reward模型时,他们通过让人工标注人员与对话机器人进行对话来产生会话语料,并从中选择一个模型生成的消息,通过采样的方式生成多个不同的补全文本,并由标注人员进行打分排序,形成Pairwise Comparison数据。

ChatGPT训练的工程难度

至此,本文将ChatGPT相关的技术要点已经做了一个整体的介绍,通过上文描述,我们可以看到OpenAI在研发ChatGPT的过程中投入了非常多的成本与研发精力,另外要训练出这样一个体量的模型,对于工程化的要求也是非常高的,包括对数据的清洗、大规模分布式训练的工程化以及大模型大数量下的训练稳定性技术等。就我个人而言,之前有研究并实施过BERT-LARGE模型的预训练,其参数量肯定不能与ChatGPT相比,但在训练中,也遇到过loss飘飞、训练中断卡壳的情况。因此,这样一个成果是算法与工程紧密结合的产物,其效果之好也就不奇怪了。

ChatGPT的能与不能

当前,伴随着ChatGPT的接口开放,已经涌现出了很多有趣的应用。我按照自己的观察,总结了ChatGPT擅长做的以及不擅长做的事。

ChatGPT的能

ChatGPT虽然以对话机器人的产品形态提供服务,但是其本质上还是基于语言模型的能力。在应用层面上,他有三个强大的特质:

  1. 对人类输入的需求理解能力特别强。
  2. 善于进行知识的检索与整合。
  3. 生成能力很强,在长距离生成过程中不会有重复、不通顺、机械等传统生成模型固有的问题。

因此,适合其大展身手的场景可包括:

基于搜索的问答

目前最典型的场景就是继承了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.04761),研究了如何使用自监督的方式,让大模型如何决定什么时候调用外部的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 。作者通过设计了一系列缜密的实验,来不断探索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.pdf),这种方法的核心思想是设计了一个adapter(可以理解为一个由神经网络构成的组件)与仿真器(可以理解为大模型的一个压缩版本)并提供给用户,用户在仿真器的帮助下使用领域数据对adapter参数进行微调,最后将微调好的adapter组件层插入到大模型上组成了一个完整的新模型用于提供服务:
  • 高效设计与应用ChatGPT的Prompt范式。例如我们可以设计一个工具平台,将不同类型的NLP任务包装成一种配置式的产品。用户针对自己的任务需求,只需要提供需求的详细描述,以及问题的样例,就能快速得到一个能力实例,并应用在自己的场景中;另外,我们还可以研究如何高效地设计一个Prompt来解决复杂的场景问题。如Least-to-Most(https://arxiv.org/abs/2205.10625)这篇论文所述,对于一个复杂问题,我们可以帮助LLM先自己拆解问题,形成为了解决问题X,需要先解决问题Y1,Y2...的形式,然后让模型分别去解决子问题,最后将所有子问题的解决过程拼在一块送到模型中,输出答案。这种方式可以有机结合COT的特性,可以用于处理一些比较复杂的问题。

结束语

在本文的最后来一些鸡汤吧:时代的车轮是不断向前的,技术的更迭也会给这个时代带来不可估量的影响。虽然ChatGPT的出现可能会对业界带来不小的冲击,但我们应该将目光放到更广阔的天地,在那儿将有更多丰富的未知世界等着我们去探索。

以此自勉!