先做个广告:如需代注册GPT4或充值 GPT4.0会员(plus),请添加站长微信:gptchongzhi
从年初ChatGPT开始火以来,朋友圈、公众号多个渠道和ChatGPT相关的文章铺天盖地,读了很多,学习了很多。分析的角度有很多,商业角度、创业团队角度、技术角度......我关注最多的还是从技术角度,想从已经公开的资料尽可能:一是搞清楚ChatGPT的关键技术,二是对大模型技术体系有个整体的把握。
推荐使用GPT中文版,国内可直接访问:https://ai.gpt86.top
看了这么多文章,又该到自己整理输出的时候了,只有经过自己系统梳理,头脑里才有完整、清晰的版图。由于GPT-1、GPT-2、GPT-3、InstructGPT、ChatGPT、GPT-4模型结构上区别并不大,主要是训练数据、目标、训练方法有所不同,但伴随其发展的,不管是来源于GPT还是其他项目,出现了一系列重要的技术,这些是我想系统整理的内容。本文先简单描述GPT系列模型发展历程和各模型特点,然后重点记录InstructGPT/ChatGPT中涉及的技术,试图理清楚这些技术细节,最后简要解释下近期大模型相关的一些概念。读了文章后你会了解到下面的技术:
In-context learning Prompt Tuning Instruction Tuning Chain-Of-Thought(CoT) Reinforcement Learning from Human Feedback(RLHF)
GPT-1
图1 GPT预训练模型结构和微调任务
GPT-2
GPT-3
图2 zero-shot、one-shot、few-shot和fine-tuning的对比
GPT-3和GPT-2模型结构一样,主要变化是使用了稀疏注意力sparse attention,同时训练数据又继续做了增加,初一看模型结构没什么变化,所以会认为总体上创新点不多。不管zero、one、few-shot,因为GPT-2中已经重点提了zero-shot,都属于类似的东西,只是提示的数量不一样。但实际上其开创性恰恰就在于提出了In-context learning/few-shot,提供了一种新的思考问题的方式。以前的思路都是通过下游任务有监督地微调,更新模型参数,现在只需要提供几个示例,不需要更新模型参数就能很好地预测!
图3是在TriviaQA数据集上三种shot的结果对比,显然给的示例多的few-shot效果最好。
图3 zero-shot、one-shot、few-shot结果对比
当初GPT-3的模型性能并没有引起业界轰动,大家看起来也只不过是和BERT类似,不断增大模型参数和训练数据量,没有引起什么质变。不过事后看来,GPT-3存在非常大的潜力,为后续的ChatGPT等模型提供了一个很好的基础,说明OpenAI是坚信 大模型+大数据+部分关键技术 这个方向的,不断探索和坚持造就了今天的局面。
到此,我们汇总一下GPT1、2、3的发布日期,使用的训练数据、参数量。
图4 GPT-1、2、3汇总
GPT系列模型后续的发展,下面这张爱丁堡大学符尧博士画的图是我见过总结得最好的图。
其中的核心就是3个模型:Codex、InstructGPT、ChatGPT。Codex相对比较直接,接下来基本一笔带过,ChatGPT是基于InstructGPT的,且InstructGPT有很多创新,我们要重点描述InstructGPT。
图5 GPT-3、GPT-3.5系列发展史(来源:https://yaofu.notion.site)
Codex
论文《Evaluating Large Language Models Trained on Code》,发表于2021年。
用一句话描述Codex的话,就是使用Github上海量的代码来训练GPT模型。所以模型结构还是GPT-3一向的模型结构。
数据集:Github上公开的5400百万软件仓库,包含179GB的小于1M的python文件,过滤一些自动生成的、长度过长的文件后,最终得到159GB数据。此外,Codex还在额外的一些编程竞赛数据集上进行了微调,得到了Codex-S。
模型在人工手写的验证集上进行验证,不同参数量的Codex,Codex-S和GPT-3比较,GPT-3没有解决验证集中的任何问题,Codex、Codex-S效果明显。
图6 GPT-3和Codex系列模型在手写验证集上性能比较
InstructGPT [重点]
论文《Training language models to follow instructions with human feedback》,发表于2022年3月。
InstructGPT我们要重点拆解学习一下,原因是ChatGPT惊艳的效果出来以后,和GPT-3比较,主要的技术改进都体现在InstructGPT中,包括奖励模型、基于人类反馈的强化学习等。一开始读论文的时候,对其实现过程感觉有点绕,对中间每个步骤使用的数据、损失函数具体的目标不清晰,多读读别人写的文章后越来越清晰。
InstructGPT的总体目标是要使得模型的输出和人类“对齐”(align),即输出的内容和人类的意图一致,避免不真实的、有害的内容。
总体三步
InstructGPT微调过程总体分为如图7的三步:
第一步:使用人工标注的prompt数据,在GPT-3大模型上进行有标签的监督学习(SFT:Supervised Fine-Tuning);
第二步:让人对前一步已经训练的模型的输出进行打分,训练一个奖励模型(RM, Reward Model),让奖励模型模仿人类,可以像人类打分一样对大模型预测结果进行评价;
第三步:利用人工标注的数据,使用强化学习进行训练,强化学习需要的奖励模型就是第二步得到的模型。第二、三步不断迭代,最后通过强化学习得到的大模型越来越对齐到人类想要的结果。
图7 InstructGPT训练的三个步骤
数据集
为了启动最开始的InstructGPT模型,让数据标注者自己写prompt,包含三种类型:
Plain:数据标注者随意选择任务写prompt,只要保证任务有足够多样性。
Few-shot:给定一个指令(instruction),写多个问题-答案对。例如:指令为“判断一个句子的情感是积极还是消极的”,对应的问题-答案对:“今天天气很好”--积极,“这个问题太麻烦了”--消极,“这个电影太精彩了”--积极。。。如果有K个问题-答案对,就可以每次选K-1个作为Few-shot中的上下文,剩下一个为要预测的结果,循环每个问题-答案对都可以作为要预测的结果,所以可以产生K个训练样本。
User-based:基于给定的用例写prompt,常见的用例类型有:分类、内容抽取、生产、重写、聊天、问答、头脑风暴。下图8是一些样例:
图8 InstructGPT prompt用例样例
除了人工标注之外,用户在使用OpenAI的API的时候也能同时提供prompt数据,在征得用户同意的前提下这些数据可用于训练。使用人工标注+API提供的方法,对应微调中的三个步骤产生了三个prompt集合:
SFT有监督训练,来自人工标注+API提供,大小13k
RM奖励模型训练,包含prompt的打分排序,来自人工标注+API提供,大小33k
强化学习训练:只来自于API,大小31k
为了让保持数据多样性,单个人提供的数据不要太多,每个人限制200条prompts,模型的训练、验证、测试集数据没有交集,以避免模型验证、测试的数据是模型在训练阶段见过的。
OpenAI在一个国外比较有名的兼职网站Upwork招募了40个外包人员进行标注工作,选择这些人的时候还专门做了测试,只招募通过测试的人员,说明OpenAI的工作做得很严谨。
模型
监督学习(SFT:Supervised Fine-Tuning)
在之前已经预训练好的GPT-3的基础上进行微调,微调的数据集前面已经做了介绍。训练一个epoch就过拟合了,但是继续训练能帮助提高后面步骤的奖励得分,继续训练了16个epoch。
奖励模型(RM:Reward Model)
模型结构:在SFT模型即GPT-3模型上,把最后一层去掉,改为可以输出奖励分数的层,论文中没有说具体的变换。模型使用了一个只有6B参数大小的版本,既节约了计算时间和资源,还发现比175B大小的模型训练更稳定。
模型输入:SFT模型的产出作为奖励模型的输入。例如给SFT模型输入一个问题Q,SFT模型可以产生4个答案A1,A2,A3,A4,那么4个QA对(Q,A1),(Q,A2),(Q,A3),(Q,A4)就是奖励模型的输入。
模型输出:RM模型对每个输入进行打分计算,得到一个具体的分数值即为模型的输出。以上面输入为例,模型对(Q,A1),(Q,A2),(Q,A3),(Q,A4)4个输入进行得分计算,得到4个分数记为S1,S2,S3,S4。
模型学习目标:人工对这个问题Q的4个答案合理性进行排序,比如A2->A1->A4->A3,奖励模型学习的目标就是让自己的打分结果和人工排序相同。这里一个巧妙的地方就是人工只需要对答案进行排序,不需要打绝对的分数,因为如果每个人打绝对分数,个体之间差异很大,但是如果排序,大多数人排序的结果是一致的。损失函数如下:
重点讲讲这个损失函数,是对一个prompt x(比如我们例子中的问题Q)和SFT的输出y(比如我们例子中的答案A),组成奖励模型的输入(x,y)通过奖励模型计算得到的奖励分数。是任意2个答案和对应奖励模型分数的差,注意这里答案和对应人工排序高于,任意2个答案的人工排序总有一个高于另一个。通过取和对数,再取数学期望,最小化loss即让最大化,目标是让任意两个得分之间的距离拉大,让得分区别更明显,即奖励模型能打出更有区分度的分数,同时又符合人工排序。由于目标是最大化,所以只需要对应的人工排序高于的情况,不需要那种排序低于的,否则所有排列都加进去相互抵消了导致loss为0,以上面A2->A1->A4->A3为例,[2,1]、[2,4]、[2,3]、[1,4]、[1,3]、[4,3]。由于是从K个答案中任意选两个的组合,最后平均一下除以总体个数。
论文中提到如果(x,y)这样的数据对两两输入进奖励模型,比如(Q,A2)和(Q,A1)通过奖励模型比较一次,(Q,A2)和(Q,A4),(Q,A2)和(Q,A3)。。。等等,如果有K个答案,这样会导致每个(Q,Ai)被前向计算和后向传播更新模型参数K-1次,会导致训练过拟合。但是如果改为对于一个Q的所有(Q,Ai)一下全部输入奖励模型,损失函数用上面的函数,整体考虑了所有K个答案,每个(Q,Ai)前向和后向计算都只进行了一次,避免了过拟合。
上面的解释其实我尝试理解了一段时间才搞清楚,所以花了重点篇幅记录一下。
基于人类反馈的强化学习(RLHF:Reinforcement Learning from Human Feedback)
模型结构:在SFT已经训练的模型上微调,模型结构也就是GPT-3结构,使用强化学习中的PPO算法(Proximal Policy Optimization,近端策略优化)。如下图9,左边绿色部分是SFT训练的模型,中间灰色部分是在SFT基础上进一步微调的强化学习模型,网络的前面部分层参数冻结,只微调后面少量参数,目的是为了避免已经花了大量数据进行训练的SFT模型参数变化太大,已经学到的知识被遗忘了。右边红色部分是已经训练好的奖励模型,作为强化学习中的奖励得分计算模块。
图9 RLHF算法结构
目标函数
是用于强化学习训练的数据,和前面讲的奖励模型输入格式一样。是强化学习模型,结构就是GPT-3,是SFT模型,结构也是GPT-3,二者模型结构一样,通过训练微调后面未冻结网络层的参数。
目标函数分为三部分:
:让奖励得分最大化。
:这一项最大化,即log项最小化,当
相等时log值为0最小,要求和结果尽可能接近,不要为了奖励分数最大化导致学习过程中参数变化太大,浪费了训练的成果。
:当使用PPO-ptx时,把在预训练数据集上的梯度加入整体梯度计算,也是为了经过强化学习训练的模型和原始的语言模型不要差别太大,要保持原始语言模型在大量数据上训练后可以输出自然数据的能力。
最后,RM和RLHF逐步持续迭代,有了更好的RLHF模型,再使用其产生的数据用于训练更好的RM,新的RM继续用于RLHF。
SFT、RM、RLHF都用的GPT-3的结构,只是在不同阶段各自的大小和要更新的参数不一样。
随着GPT的发展,OpenAI变得越来越封闭,对新模型的结构、训练细节披露越来越少。
ChatGPT是大家最熟悉的模型版本名字,作为InstructGPT的姐妹模型,模型结构和训练方式与InstructGPT类似,前面已经解释了细节,在GPT-3.5上进行微调,但OpenAI没有发表论文,只有一篇博客:https://openai.com/blog/chatgpt
GPT-4在ChatGPT之后发布,主要特点是支持多模态,支持文本和图片输出,输出文本。发表了文章《GPT-4 Technical Report》,单干货不多,对应的技术博客:https://openai.com/research/gpt-4
In-context learning(ICL)
单独说一下ICL,是因为我花了一些时间才对其有了初步理解,字面上看是模型要更新参数进行学习,但论文说不用更新参数。
ICL广义上是Prompt Learning的一种,都通过提示来学习。简单说ICL就是模型都训练好了,直接输入一些提示或者样例,对想要预测的内容进行预测,这个阶段实际上只做了预测,没有模型训练。这里面的learning误导人。
GPT-3的论文中用下图10说明了ICL。使用梯度下降预训练语言模型的过程叫做外循环outer loop,这个叫元学习meta-learning(概念多,不用管)。有了预训练得到的模型后,给一些上下文,就可以预测想要预测的内容了,这就是In-context learning,这些上下文例子就是contxt.
图10 Meta-learning和In-context learning
我们一开始在图2中的one-shot、few-shot里面给的样例就是context。
为什么不用更新模型参数就能预测对,主要原因就是大模型经过海量数据的学习,已经拥有了一定的知识,给它一些上下文,它知道要做什么,就能预测出相应的结果。其前提就是模型要大!
这篇清华、北大和微软联合发布的有趣的论文《Why Can GPT Learn In-Context? Language Models Implicitly Perform Gradient Descent as Meta-Optimizers》,通过一堆公式推导说ICL实际上和使用梯度下降进行学习本质上干了同样的事,有兴趣的可以读一读。
最后,并不是说这些context不能用到模型中进行梯度下降训练,当然可以拿进去训练,只不过大模型经过超级多的数据预训练后,这点context数据是否需要加入训练改进模型已经无足轻重了。
其他常见概念
图11 普通Prompting和CoT Prompting的对比,来自Google《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》
总结
以上就是对GPT系列模型陆续学习过程中对各知识点的整理,重点关注了InstructGPT中使用的关键技术,以及近年来大模型领域常见的一些概念。
对于大模型,因为基于深度学习,总体上还是一个黑盒子,阅读了这么多论文和别人的文章,我脑中对大模型的一些关键点总结如下:
大模型只有模型参数规模和训练数据规模达到一个水平后才能出现智能涌现能力,就是性能出现质的飞跃的转折点。
大模型特别是GPT系列,其能力主要来自于经过海量数据训练的预训练模型,即模型基座,后面的RLHF等只是优化、规范约束模型输出更合理、更健康。
大模型本质是对知识进行压缩,里面存的模型结构和参数就是对海量数据训练后学到的知识的存储。
参考资料:
GPT-1、2、3,InstructGPT论文,ChatGPT、GPT-4博客
五万字综述!Prompt Tuning:深度解读一种新的微调范式
ChatGPT的朋友们:大语言模型经典论文一次读到吐
万字拆解!追溯ChatGPT各项能力的起源
探究ChatGPT前身:从GPT-1到GPT-3的演进历程
让GPT大获成功的in-context learning,其实就是梯度下降?
来源:陈洋2020 机器学习记事本
网友评论