根据上文我们实现的简版GPT,在足够数据、足够算力的前提下,理论上是可以训练出类GPT3的大语言模型的。
但GPT3距离ChatGPT还有很远的距离,这一段距离涉及OpenAI未公开论文、源码的关键技术。
我们接下来从OpenAPI已公开的信息来看看ChatGPT是如何炼成的。
1.ChatGPT的历史版本
下图摘自Yule Wang的技术专栏,阐述了基于Transformer的大语言模型不同版本的脉络:
- BERT是编码器Only架构,BART是编码器-解码器架构,它们延伸出去大语言模型下载后不能直接使用,需要垂域微调。
- T5是编码器-解码器架构,GPT-2是解码器Only架构,它们下载后不做垂域微调,也能完成一些AI任务。
- GPT-3、GPT-4是解码器Only架构,它们下载后不做垂域微调,能完成大部分AI任务。
- 针对GPT-3进行SFT(有监督微调)+RLHF(基于人类反馈的强化学习),最终得到了ChatGPT,GPT-3.5、InstructGPT算是过渡产品。
2.ChatGPT的整体训练流程
在《Introducing ChatGPT》(详见https://openai.com/blog/chatgpt)中,给出了从GPT3演进到ChatGPT的整体训练流程图:
以前看这张图很模糊,通过前面复现Transformer架构、简版GPT的代码,才逐渐变得清晰。
接下来,我们来逐一拆解。
3.ChatGPT的三大训练方法
下图比较形象地归纳了ChatGPT整体训练流程:
(1)方法1:预训练(Pre-Traning)
- 构建好大语言模型的神经网络架构后,通过大数据、大算力进行训练,得到预训练模型。如:GPT3就属于这类预训练模型。
- 大语言模型的本质是生成内容,构建训练数据基本都是自动化的,所以预训练的过程属于无监督学习。
- 预训练模型非常庞大,算是通才,具备基本的自然语言处理能力、世界知识,甚至还有了顿悟能力(涌现能力)。
- 就好像下图红框内庞大的AI大脑(画的有点恶心)。
(2)方法2:指令调优(Instruction Tuning)
- 虽然花了巨大的时间成本和空间成本获得了预训练模型,但是它的水平,依然无法像一个真人,与人类对话。
- 接下来还要进行微调——人工准备少量的数据,对预训练模型进行增量训练——因此也称为有监督微调(SFT,Supervised Fine-tunning)。
- 指令微调本质是站在巨人的肩膀上对预训练模型进行增量训练。它可以针对世界知识进行增强,也可以针对某个垂直领域进行增强。
- 指令微调后得到的大语言训练模型,将会接近于一个真人。
- 就好像下图红框内的红色人脸(画的也挺恶心)。
(3)方法3:对齐(Alignment)
在指令调优后,大语言模型虽然接近于真人,但生成的内容依然会很生硬。
为什么呢?这就是人类的主观感受——人类对某些问题的答案,会有情绪、语气、风格等主观的特征。
那么,又如何让AI学会人类的主观感受呢?这就是对齐Alignment。
RLHF(基于人类反馈的强化学习)就是对齐的具体实现之一,利用这种强化学习手段,让大语言模型学会人类的主观感受,GPT3就演进成为了ChatGPT。
就好像下图右侧红框内小黄球(画的依然挺恶心)。
接下来,我们逐一分析这三大方法。
4.方法1:预训练(Pre-Training)
(1)与ChatGPT整体训练流程图的对应关系
我们对比两张图:
- 预训练得到的大语言模型,就是ChatGPT整体训练流程STEP1的输入。
(2)辩证看待预训练模型、涌现能力、神经网络
前段时间,师父问了我3个终极问题,让我一时语塞:
- 为什么ChatGPT大力能出奇迹,小力就不行?
- 为什么这样的神经网络模型就可以大力出奇迹,换个神经网络模型行不行?
- 如果无论什么神经网络模型只要能做到大力就能出奇迹,那么这些神经网络的本质是什么?
前面半年一直在复现Transformer论文的细节中,的确缺少了对宏观本质的思考,结合预训练这个章节的写作,正好梳理一下我的宏观思考:
思考1:神经网络的本质是什么?
- 观点1:客观世界中,一切问题都能用函数表达。
- 只不过有的函数极其复杂,只有上帝才知道这个函数是什么。
- 观点2:神经网络的本质进行函数近似(Function Approximation)的工具。
- 神经网络的输入:是大量的数据,数据中隐藏了某个问题背后的函数的数学规律。
- 神经网络的输出:找到无限逼近于某个问题背后的函数的近似函数。
- 数学上,已经证明神经网络能够近似出任意一个问题背后的函数。
- 神经网络的结构,决定了找到这个近似函数的成本(时间成本、空间成本……)。
思考2:假设思考1正确,如何解释神经网络的5种现象?
- 现象1:过于简单的神经网络,需要很大力才能出奇迹。
- 任务是"让AI对红点和蓝点进行分类”,由于神经网络过于简单,所以迭代了2000多次才找出答案。
- 现象2:过于简单的任务,不需要大力也能出奇迹。
- 现象3:恒定难度的任务,加宽神经网络,大力能出奇迹。
- 现象4:恒定难度的任务,加深神经网络,大力能出奇迹。
- 现象5:恒定难度的任务,增强神经元,大力能出奇迹。
从上述5种现象,应该可以得到2个结论:
- 在神经网络结构恒定的前提下,待执行的任务难度,决定了能否大力出奇迹、是否需要大力。
- 在待执行的任务难度恒定的前提下,神经网络结构,决定了能否大力出奇迹、是否需要大力。
思考3:辩证地看待预训练模型、涌现能力、Transformer
当GPT3.5出现涌现能力(emergent capabilities)后,它似乎被神话成了人类尚无办法解释的神迹。
我们应该如此这般辩证地看待预训练模型、涌现、Transformer
- 预训练模型不是ChatGPT首创,在深度学习时代就有了,有很多神经网络都是预训练好,节省后来人的训练成本。
- Transformer只是GPT3这种预训练模型遵循的神经网络结构,Transformer这种神经网络结构本质是换了一种姿势寻找近似函数。
- 如果问题P1、问题P2、……问题Pn背后的函数都极为相近,当神经网络结构找到了问题P1的近似函数,那么这个近似函数也能用来解决问题P2、……问题Pn——这就是经过训练,神经网络能自我学习到一些额外的能力的原因,即涌现能力。
- 进一步思考:深度学习时代有没有涌现呢?可能有,只是n这个值比较小,不太明显吧。
5.方法2:指令调优(Instruction Tuning)
(1)与ChatGPT整体训练流程图的对应关系
- 指令调优对应于ChatGPT整体训练流程的STEP1。
- SFT:有监督微调,属于有监督学习。包括In-context Tuning(上下文调优)和Instruction Tuning(指令调优)。
- In-context Tuning:上下文调优,这种调优方式的本质是将多轮对话的聊天记录一起发送给大语言模型,有了上下文,大语言模型就能更好地回答问题。
- Instruction Tuning:指令调优,这种调优方式的本质就是问题中带有明确的指令、明确的要求。Instruction Tuning是OpenAI在GPT-3.5-turbo模型中引入的一种新方法,是在传统的微调过程上的一种变体。
- 对于上述两种调优方式,在提示词工程中都体现了它们的思想——“上下文”、“指令”。
(2)训练SFT模型的伪码
前文讲了很多理论,还是需要撸一下代码比较便于理解。
由于OpenAI对于SFT、RLHF并未公开源码,所以在这里只编写伪码,在后续实例中展示真实代码。
(3)SFT实例
针对简版GPT,只需要增加如下代码:
- 首先,通过
torch.load方法
加载上一篇已经预训练好的简版GPT模型,这个模型的训练数据仅包含了维基百科的基本数据。 - 然后,将新增的医学知识数据集,对简版GPT模型进行增量训练。
- 最后,通过
torch.save方法
保存增量训练的简版GPT模型,此时,这个模型就包含了医学知识了。 - 具体代码详见下图:
6.小结
讲到这里,内容已经比较饱和了,我们将在最后一篇阐述方法3:对齐训练以及RLHF的实例。
我们接下来对本文进行一下小结:
- ChatGPT的历史版本:GPT3、InstructGPT、ChatGPT。
- ChatGPT整体训练流程,支撑了GPT3到ChatGPT的演进。
- 预训练模型是什么?如何辩证地看待预训练模型、涌现能力、神经网络的学习能力?
- SFT(有监督微调)的概念、原理,最后展示了如何针对简版GPT进行SFT。
我们下一步继续针对简版ChatGPT开展RLHF,且听下回分解。