1. 能力展示
ChatGPT是OpenAI开放的一个大语言模型,普通用户可以通过和它对话的形式,驱动它完成各种任务,它具备和人一样能流畅说话和多轮对话的能力,翻译,写文案,提取对话要点等都不在话下,且拥有各行各业的非常深的领域知识,诸如电商,在线旅游,商务等。本文尝试用尽可能通俗的语言对ChatGPT的能力进行介绍和探讨。首先请看以下使用样例:
样例1,给定两个商品标题,让ChatGPT判断是否为同款商品:
样例2,英语语境的给定两个商品标题,让ChatGPT判断是否为同款商品:
样例3,和ChatGPT玩猜星座的游戏:
样例4,德语,中文,英语夹杂和ChatGPT对话:
技能点汇总:
说人话:说的话符合人类语言习惯,而且说话不带重样的;
能对话:可以回答问题,而不是简单的接龙,且可以连续基于上下文对话,不跑题;
能说话的图书馆:具备世界知识,知识储备量丰富,知道商品里的货币是收藏品以及收藏品的领域知识,知道刹车片与汽车的知识,知道德国的Bauhaus设计风格;
干人事:人的各种意图都难不倒它,它都能理解,人能用自然语言驱动它干事情。能干各种任务,简单的到复杂的,简单的可以一步到位的完成,复杂的可以有逻辑的分步完成。有中文,德语,英语等的多语种对话,以及互译能力,实体提取,总结,推理等等人类具备的能力;
说人爱听的话:提供有用的信息,提供真实的信息,说符合人类的价值观的话;
在正文开始之前,需要说明两点:
-
ChatGPT在推理的时候不会联网去网上检索信息;
-
OpenAI暂未发表论文,模型,代码均未开源,只能从先前其发表的GPT系列论文对ChatGPT的各项能力进行推测和还原,因为据OpenAI官方说,ChatGPT是沿着GPT系列方向研发出来的。
2. 进化之路
2.1 接龙游戏
GPT系列模型,基座是一个生成式的语言模型。
大白话:“基于已有的字/词,预测下一个字/词的模型”。网上有海量的文本,爬取下来后不需要做人工的标注,直接将原句拆成上文和下一个词,上文作为模型的输入,下一个词作为模型要学习预测的输出,以“Today is a good day”为例,在训练的时候会被拆成以下多个样本给模型学习。
学术一点:
预测的时候,第n轮预测的词,将拼接到已有的上文里,作为第n+1轮的上文,用于下一个词。
2.1.1 说人话
把接龙游戏玩好了,意味着能基于上文预测下文,其实就是具备语言能力,也就是能说人话了,因为要做到这一点,模型需要学习:
-
语言学知识:语法,句法,词法等;
-
世界知识(常识):狗吃_?_,郭德纲是著名的_?_,中国的首都是_?_
而且,因为基于上文预测下一个词的时候,其实预测出的是一个庞大的后续词集及其对应的概率值,ChatGPT并不是采用贪心策略,选择概率最大的作为结果,而是基于各个候选词的概率做采样。以下表的预测为例(词的候选集只截取了前面5个),learn的概率是4.5%,也代表着4.5%的可能模型会输出learn,当然还有3.5%的可能是输出predict。因此同一个问题,给ChatGPT问两次,它的答案不重样。
2.1.2 能对话
按照接龙游戏的训练方式,模型只是基于上文,做续写和补全,比如:基于“锄禾日当午”补全“汗滴禾下土”。进一步的,将常见问题和答案拼接在一起做为样本,比如“中国的首都在哪里,北京”,“锄禾日当午的下一句是什么?汗滴禾下土”,模型就能以接龙形式学会回答问题。更进一步的ChatGPT有加入多轮问答形式的样本,也就是对话样本,对模型进行训练,模型也就具备了围绕上文主题对话的能力。(当然做起来,可能不会如此简单。)
预测的时候和训练一样,将对话的历史全部作为输入,就可以让模型围绕上文主题连续对话,不跑题。这里ChatGPT并不像市面很多对话机器人那样(尤其是任务型对话机器人)做了一个对话状态追踪,去存储历史对话里的一些抽象的信息,比如:人的意图,机器人的响应动作。而只是将历史对话的原文,全部输入给模型。
2.1.3 能说话的图书馆
训练语言模型的数据,涉及各个领域:人文,科学等,且数据量足够大:携带了几乎全网的文本,全部是世界知识。GPT-1发展到GPT-3,模型的参数增大到了175B,大容量的参数为模型将世界知识学习到语言模型提供了保障。
2.2 情景学习
通过试用ChatGPT,给人的感受是很什么任务他都能做,而这些任务,或者是数据,我们比较确信他训练的时候是没有的,这是和以往AI模型的很大差别,好像ChatGPT已经拥有独立的思考能力。确实,从前的模型我们都用大量人工标注的数据进行模型训练,每个模型都只具备一项技能,比如情感分类,机器翻译。
以前的模型:
ChatGPT:
以前的模型都需要针对任务准备人工标注的样本进行训练,且一个任务一个模型,用的时候也是针对不同任务使用不同的模型。相比之下,GPT系列的模型训练的时候,直接从网上爬大量的数据,也不人工标注,也不说属于什么任务,直接输入给语言模型猜字,预测的时候,就直接用自然语言说,我需要你干什么,顶多再给一两个样例。但是,真的是这样吗?
其实不然,根据GPT2论文里的描述,他们并非完全没有就任务和样例进行学习,而是他们的样本是在自然语言形式下呈现的,他们收集大量自然语言描述的任务样例(Naturally Occurring Demonstration),比如英法互译。只是这种任务样例,相比以往的训练方式,有两点大的区别:
-
这种任务样例在整个语料的占比太低了,原来我们一个任务一口气就给几万,几十万
-
不单纯是要学习输入和输出的关系,还需要理解这个是什么任务,而且数据集里面有很多不同类的任务,更难的是这些任务的描述还是自然语言形式的。而原来一个模型就是一项任务,模型不需要理解。
学术一点:
-
原来的模型学这个:p(output|input),
-
现在模型学这个:p(output|input; task),而且现在模型学的这个task是用自然语言描述的:
-
i love you 中文意思是我爱你
-
英语的i love you就是我们中国人说我爱你的意思
-
基于上面两个区别,有两个要求:
-
收集足够大的数据量,这样才能有足够多的Naturally Occurring Demonstration;
-
模型能真的从自然语言里理解要做的任务,以及基于输入和输出理解这个任务怎么做。
2.2.1 干人事
通过上面训练方式,模型学会了两种能力:
-
理解自然语言形式的任务描述,“帮我翻译”是要做翻译任务;
-
理解示范的输入和输出,“i love you”对应“我爱你”,如果给定“good morning”就该回复“早上好”。
在人看来,就是可以用自然语言驱动模型,可以有以下两种方式:
-
直接给任务描述,让他做:帮我把“I love you”翻译成中文;
-
附加一个示范:帮我翻译成中文,比如“I love you”>=“我爱你”,“good morning”>=;
通俗的讲,模型就是听得懂人话,能干人事了。业界把这个叫做情景学习(In-context learning),而我们给的任务描述和示范则叫做提示(prompt)。
需要附加说明的是,Prompt只是开启GPT-3的各种能力,并不是增加和注入,因为Prompt是在预测的时候用的,此时模型并不会再学习,不会更新权重,已经被固定下来。另外,此时期,不同的Prompt对模型效果影响特别大,换一种说法模型可能就听不懂了。
2.3 指令微调和强化学习
2.3.1 说人爱听的话
一方面因为GPT3时期,Prompt对模型效果影响特别大,限制了普通用户驱动模型;另一方面GPT3毕竟是一个语言模型,他对于生成的结果,真实性,是否带有偏见,其实是缺乏认识的。后来的InstructGPT和ChatGPT都开始采用同样的办法都修复这个缺陷,业界叫做“对齐”,和人类对齐,让模型输出的结果:有用,可信,三观正常。
第一步,先是收集了开发测试时候用户写的prompt让标注人员揣测意图,并写出对应的输出。同时还让标注人员自己写prompt以及对应的输出。这种prompt可以理解为是大量的示例,亲身示范这种任务怎么做。实现的一个效果是,原来的自然语言的任务描述变得更加丰富,提高了模型对prompt的鲁棒性,也就是让模型能更好的理解人的意图;另一个效果是不同任务的输出,都注入了人的价值观,比如:违法的信息不能给,不道德的信息不能给,有性别,种族,宗教歧视的信息不能给,不确定的信息不能给。
又因为人工写prompt毕竟投入太高,不能大规模的做,因此想做一个能一劳永逸的模型,对模型的行为进行监督。于是有了第二步,让模型自己对同一个prompt都预测多个结果,让人工进行对比,将好的排前面,不好的排后面,因为这种标注数据,也携带了人类的一些偏好,对这个偏好建立一个模型,叫做奖励模型。有了奖励模型后,就可以对模型的输出做打分,并辅助模型做微调。
以上两步完成之后,模型就被注入了人的偏好,就可以说人爱听的话了。
2.4 未解之谜
2.4.1 涌现能力
通俗的说,在一定范围内,模型的性能(主要指多任务支持程度,推理准确率,不指推理速度)与其大小正相关,但是也会存在边际效应,不过当这个范围持续增大,模型的性能可能会激增,这种现象被称为涌现能力。涌现能力不是先有理论再去实践得到的一种验证,相反的,是一个在实践过程中观测到的现象,目前网上有各种推测去对这种现象进行拟合,众说纷云。
个人希望基于GPT2论文里提到的数据构成方式尝试做一些解释。原文里提到他们尝试去收集不同领域的,不同自然语言形式的任务示例(Naturally Occurring Demonstration),而不是简单的随便找文本就训练语言模型,期待它万能。这种示例是内嵌在正常的文本中间的(详见2.2节),密度可能不会很高,而且GPT同时学多种任务。相比原来的监督学习,我们的模型只学习一个任务,我们直接给出输入和对应的输出,一个任务需要给几万,几十万不等的样本。因此要让GPT能充分训练,我认为数据量会是天量。
更多的数据,意味着更大的模型才能承载。所以涌现能力,个人认为是模型规模达到了能承载大数据集时,这些数据集携带了足够多的Naturally Occurring Demonstration,让模型打通了各个任务的壁垒,将各种任务都归于语言模型生成的一种现象。因为分类,生成,翻译等等本身就是语言学的某种行为,只是工程师为了方便处理,对任务做了拆解而已。
打个夸张但是通俗点的比方,从前我们只会乘法口诀,一开始会算错,学习多次后计算的准确率会变高,再学下去无非也就是全对,但是我们的算术解决不了其他学科的问题,这就是学习的边际效应。随着学的东西越多,直到有一天,我们发现心理学其实是生物物理学,甚至物理,数学又都归于哲学,学科的边界没有了。因为本来就只有那一个,只是人为的做了切分而已,现在又走向了融合。
2.4.2 思维链
思维链是一种让模型做一个复杂的任务,比如算一个应用题,模型容易出错,但是如果要他一步一步的算,并给出中间结果,这时候模型的准确率可以大幅提高的现象,目前也是网上热议和没有定论的现象。
个人理解其还是属于情景学习的一种表征,基于上文往下推理的形式下,单步拆解能给到更好的提示,以辅助下一步的推理,所以更容易形成良性循环,促使模型有更好的表现。
2.4.3 翻译能力
相比涌现能力和思维链能力,网上几乎没有关于翻译能力的讨论,虽然翻译能力也可以理解为涌现能力的一种。这里为什么我会拿出来分析,主要是因为发现其余的能力,诸如推理,逻辑都是人具备的能力,只要给到语料模型自然可以和人一样学会。GPT的训练语料里涉及到多种语言,诚然可以让它学到单语种的各种能力,但是语料里没有完整的不同语种之间的对齐关系,所以按我的理解,GPT不应该拥有如此优秀的多语种翻译能力的,因为这种能力我们人都不具备。回想我们学习英语的时候,我们是有中文和英语的对齐关系的,我们有词汇表,它会告诉我们英语里的“Apple”在中文里是“苹果”,并且人学习的时候还不单纯从文字上获取这种对齐关系,还会从视觉上。比如一个三四岁的小朋友看到食品包装上印着“KFC”,即便他不认识字母,但是他一定会知道“KFC”大概是“吃的”的意思。
就这个疑问,我一直以为它们加了类似于英汉词典这种带有对齐关系的多语种语料到训练集,放到语言模型里一起训练,但是仔细查了一遍GPT论文系列关于训练数据构成的细节,也没有找到任何证据。相反,还看到了他们在GPT3中特意论述过:一方面我们没有给过翻译语料,并且我们绝大部分是英语语料,二方面我们就是一个语言模型,啥任务都一视同仁。但是,我们的性能就是很好。
个人认为,除了它可能一种涌现能力以外,可能于他的数据集有关。他的数据集里有Wikipedia数据,Wikipedia对于词条是有多语种版本的,可能提供了语种间的对齐关系,以及它的数据集里可能还有别的语料提供了这种信息,这可能会是它有语言翻译能力的部分原因。
3.落地及影响
3.1 影响
3.1.1 对NLP工程师
原来 NLP 工程师们会在两个维度对业务场景做拆分,一是技术类型(模型):文本分类,实体抽取,文本生成,二是业务领域(数据):金融,电商,出行等。一个场景对应一个算法模型,因此原来需要很多算法工程师来满足工业场景的算法落地,通俗的说属于一种手工业作业模式。打个比方,原来的从业者像是面对收割麦子的场景,需要打磨如何让镰刀更加锋利,人工如何分配更加高效。换了让去收割水稻,又得重来一遍上面的流程。ChatGPT类似于联合收割机,收割,脱粒一条龙,而且不单纯是麦子,水稻也能收割,效率比人提高了很多。如此一来,原来NLP的手工业业态必将被ChatGPT这种集多种硬技能于一身的机器工业替代,原来NLP的一些中间任务都会退出历史舞台,甚至是NLP工程师也会被淘汰。因为现在只需要少数人开联合收割机,且开收割机的人也不一定要懂收割机的工作原理。
3.1.2 对其他人
算法模型实现了开箱即用,原来的算法开发周期缩短到几乎为零,更多的需求会涌现出来,开发,产品需求接到手软。
3.2 局限性
因为当前模型并不开源,只提供了API供调用。如果要使用ChatGPT的能力,意味着公司的数据要外流到外部,这会牵扯到严重的数据安全问题,是不会被允许的。所以现有的调用方式下,几乎只能眼馋,没法大范围的使用。
3.3 落地方案
3.3.1 调用API
对于一些不涉及数据安全的场景,可以在数据进公司数据之前就调用ChatGPT的API处理好。比如爬虫之类的,反正都是外网大家都见得着的数据,爬下来先调API做一下结构化提取再存数据看应该是ok的?一个猜测,不一定对。
3.3.2 解决数据安全问题
一个个人想法:数据直接传到外部不安全,可以将模型抽取前面几层给使用方。使用将这层部署在自己的服务器上,将原石属于输入给它并将编码结果去调用ChatGPT,ChatGPT接着往下推理。因为这种方式再去还原原始输入比较困难,因而可以解决原始数据外漏的问题,但是模型输出结果还是外漏了,个人也没有好的想法。还有,翻译任务的输入也会相当于泄漏,因为输出是输入翻译出来的,不像别的分类任务,只是一句话到一个类别的映射,拿到类别并没有办法还原输入。
3.3.2 替代性方案
一方面,ChatGPT没有开源,我们不能将模型下载下来,放到我们自己的服务上做预测;另一方面,ChatGPT的模型也过大,大部分公司很难有资源对模型做训练和部署。因此,只能找平替:找和ChatGPT是同技术路线的,参数量更小的大语言模型,参照ChatGPT的训练方式,回来自行用SFT+RLFH技术对模型做进一步的微调。如果性能损失能接受,这是一种低资源也能快速在工业场景利用上大语言模型能力的途径,值得探究。目前看到有人已经在做这项工作。
4. 写在最后
AI是工具,工具不会取代人,会取代人的是会使用工具的人。
参考资料
GPT: Improving Language Understanding by Generative Pre-Training
GPT2: Language Models are Unsupervised Multitask Learners
GPT3: Language Models are Few-Shot Learners
InstructGPT:Training language models to follow instructions with human feedback
Offsite-Tuning: Transfer Learning without Full Model
What Is ChatGPT Doing and Why Does It Work?